Thread e java.net.ServerSocket

di il
2 risposte

Thread e java.net.ServerSocket

Sto scrivendo un piccolo server TCP per la mia rete di casa, ma stò avendo qualche problemino con i Thread
package server;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPMainServer implements Runnable {

    private final String serverName;
    private final int port;
    private final int MAX_CONNECTIONS;

    ServerSocket serverSocket;

    public TCPMainServer(String ServerName, int Port, int MAX_CONNECTIONS) {
        this.serverName = ServerName;
        this.port = Port;
        this.MAX_CONNECTIONS = MAX_CONNECTIONS;

        try (
                ServerSocket s = new ServerSocket(port);) {
            this.serverSocket = s;
        } catch (IOException e) {
            System.out.println("[TCPMainServer]" + serverName + " : can't create a socket to port " + port);
            System.out.println("[TCPMainServer]" + serverName + e.getMessage());
            System.exit(1);
        } catch (IllegalArgumentException e) {
            System.out.println("[TCPMainServer]" + serverName + " port number out of range");
            System.out.println("[TCPMainServer]" + serverName + e.getMessage());
            System.exit(2);
        }

        Thread t = new Thread(this, serverName);
        t.setPriority(8);
        t.start();
    }

    @Override
    public void run() {
        System.out.println("TCPMainServer");
        
        /*try {
            serverSocket = new ServerSocket(port);//////////////////////////////////////////////////
        } catch (IOException ex) {
            Logger.getLogger(TCPMainServer.class.getName()).log(Level.SEVERE, null, ex);
        }*/

        if (serverSocket.isBound() && !serverSocket.isClosed()) {
            while (true) {
                try (
                        Socket clientSocket = serverSocket.accept();) {

                    System.out.println("Connecting to a client");
                    TCPServer clientServer = new TCPServer(clientSocket);

                    Thread ThreadSrv = new Thread(clientServer, clientSocket.getInetAddress().toString());
                    ThreadSrv.setPriority(5);
                    ThreadSrv.start();

                } catch (IOException e) {
                    System.out.println(this.serverName+"Exception caught when trying to listen on port " + port + " or listening for a connection");
                    System.out.println(this.serverName+e.getMessage());
                } catch (TCPServer_BadSocketException ex) {
                    System.out.println(this.serverName+"Socket invalid");
                }
            }
        } else {
            System.out.println(this.serverName+"Error when accepting connections on " + serverSocket.toString());
        }

    }

}
Sapete dirmi perchè se posiziono la riga
ServerSocket s = new ServerSocket(port);
nel metodo run() ( quella commentata ) non ho problemi mentre se la metto nel costruttore ( come adesso ) il metodo run() mi dice
192.168.1.125Error when accepting connections on ServerSocket[addr=0.0.0.0/0.0.0.0,localport=1000]
nel momento in cui mi connetto con il client ???

Ps: programmo in c, conosco le basi del java

2 Risposte

  • Re: Thread e java.net.ServerSocket

    ale99 ha scritto:


    se la metto nel costruttore ( come adesso ) il metodo run() mi dice
    192.168.1.125Error when accepting connections on ServerSocket[addr=0.0.0.0/0.0.0.0,localport=1000]
    nel momento in cui mi connetto con il client ???
    Finito il try (appena dopo this.serverSocket = s; ), il ServerSocket viene chiuso. È il nuovo try-with-resources .... dovresti comprenderlo un po' meglio.


    Prima che tu faccia la domanda: "come devo modificarlo?" .... no, non devi proprio usarlo il try-with-resources, se vuoi costruire il ServerSocket nel costruttore e poi usarlo nel run.
  • Re: Thread e java.net.ServerSocket

    Lol il problema è che non sapevo che esistesse questa versione del "try", anche perchè GIUSTAMENTE non è neanche nominata nelle guide/tutorial più vecchi... ( in verità pensavo che le parentesi tonde del "try" servissero a tuttaltro ).

    Adesso mi è tutto più chiaro GRAZIE

    Prima che tu faccia la domanda: "come devo modificarlo?" .... no, non devi proprio usarlo il try-with-resources, se vuoi costruire il ServerSocket nel costruttore e poi usarlo nel run.
    Ah beh, in effetti ho risolto togliendo le parentesi tonde e spostando l'istruzione.
    Certo che sarebbe anche abbastanza stupida e superficiale come domanda, e avrebbe dimostrato la mia voglia di imparare nulla

Devi accedere o registrarti per scrivere nel forum
2 risposte