Socket, Server MultiThreading

di il
3 risposte

Socket, Server MultiThreading

Salve a tutti,
vorrei scrivere un server, che utilizzi le Socket, e che sia MultiThreading.

Il codice del Server non MultiThreading è il seguente:

// Main.java

import java.io.IOException;

public class Main {
	static Server server;
	public static void main(String[] args) throws IOException {
		server = new Server();
		}
}

// Server.java

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

public class Server {
	public Server() throws IOException {
        try (ServerSocket server = new ServerSocket(80)) {
            while (true) {
                try (Socket socket = server.accept()) {
                    PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
                    out.println("Hello World!");
                    socket.close();
                }
            }
        }
	}
}
il codice MultiThreading è il seguente:

// Main.java

import java.io.IOException;

public class Main {
	static Server server;
	public static void main(String[] args) throws IOException {
		server = new Server();
		}
}

// Server.java

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

public class Server {
	ServerSocket server;
	public Server() throws IOException {
        server = new ServerSocket(80);
        while (true) {
            try (Socket socket = server.accept()) {
            	Connessioni nuovaConnessione = new Connessioni(socket);     	
           	 }
	     }
	}
}

// Connessioni.java

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

public class Connessioni extends Thread{
	Socket socket;
	PrintWriter out;
	public Connessioni(Socket socket) throws IOException {
		this.socket = socket;
		this.start();

	}
	public void run() {
		try {
			PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
			out.println("Hello World!");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
Tale codice mi restituisce il seguente errore:

java.net.SocketException: Socket is closed
ovvero, alla riga seguente, il socket risulta chiuso:

PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
Dove sbaglio?
Grazie in anticipo a tutti.

3 Risposte

  • Re: Socket, Server MultiThreading

    java999 ha scritto:


    
            while (true) {
                try (Socket socket = server.accept()) {
                	Connessioni nuovaConnessione = new Connessioni(socket);     	
               	 }
    	     }
    	}
    
    Dove sbaglio?
    Questione molto "subdola". Il Socket è una "risorsa" nel try-with-resource, terminato il try, lo CHIUDE. E questo avviene quasi sicuramente sempre prima di arrivare al run().
  • Re: Socket, Server MultiThreading

    Risolto,
    non andava messo il TRY:
    
            while(true) {
            	Socket socket = server.accept();
            	Connessioni nuovaConnessione = new Connessioni(socket);
            }
    
    Non ho capito perchè il TRY dava problemi, perchè si chiudeva, chiudendo la Socket?
  • Re: Socket, Server MultiThreading

    java999 ha scritto:


    Non ho capito perchè il TRY dava problemi, perchè si chiudeva, chiudendo la Socket?
    Sì. Quello non era un "comune" try ... ma il try-with-resource (Java 7+)! -> https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

    Il close() dovrai farlo tu nel run() ad un certo punto, quando ritieni che la comunicazione con il client sia terminata (secondo il "protocollo" di comunicazione che hai scelto di fare "sopra" il socket).
Devi accedere o registrarti per scrivere nel forum
3 risposte