[RISOLTO]Semplice applicazione client server

di il
4 risposte

[RISOLTO]Semplice applicazione client server

Buona sera forum!! ho scritto questi due programmini e andavano bene fino a quando non ho inserito un ciclo while nel server per renderlo sempre attivo, adesso il programma lancia eccezioni.
Ecco il codice del Server e del Client:
package hello;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Logger;

public class Server 
{
	static Logger logger = Logger.getLogger("global");
	public static void main(String arg[])
	{
		while(true)
		{
			try
			{

				ServerSocket serverSocket = new ServerSocket(9000);
				logger.info("Socket instanziato, attendo connessioni....");
				Socket socket = serverSocket.accept();
				logger.info("Accettata una connessione... attendo comandi");
				ObjectOutputStream outStream = new ObjectOutputStream(socket.getOutputStream());
				ObjectInputStream inStream = new ObjectInputStream(socket.getInputStream());
				String name = (String) inStream.readObject();
				logger.info("Ricevuto " + name);
				outStream.writeObject("Hello " + name);
				socket.close();
			}
			catch(Throwable e)
			{
				e.printStackTrace();
			}
		}
	}

}
package hello;

import java.io.EOFException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.logging.Logger;

public class Client 
{
	static Logger logger= Logger.getLogger("global");
	public static void main(String args[])
	{
		try
		{
			Socket socket = new Socket("localhost",9000);
			ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
			ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
			out.writeObject("Marco");
			System.out.println(in.readObject());
			socket.close();
		}
		catch(EOFException e)
		{
			logger.severe("problemi con la connessione" + e.getMessage());
			e.printStackTrace();
		}
		catch(Throwable e)
		{
			logger.severe("lanciata throwable" + e.getMessage());
			e.printStackTrace();
		}
	}
}
ecco l'eccezione lanciata
java.net.BindException: Indirizzo già in uso
	at java.net.PlainSocketImpl.socketBind(Native Method)
	at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:376)
	at java.net.ServerSocket.bind(ServerSocket.java:376)
	at java.net.ServerSocket.<init>(ServerSocket.java:237)
	at java.net.ServerSocket.<init>(ServerSocket.java:128)
	at hello.Server.main(Server.java:19)
Come risolvo il problema? Grazie

4 Risposte

  • Re: [RISOLTO]Semplice applicazione client server

    barty93 ha scritto:


    andavano bene fino a quando non ho inserito un ciclo while nel server per renderlo sempre attivo, adesso il programma lancia eccezioni.
    Per fare un loop del genere, dovresti chiudere il ServerSocket alla fine di ogni ciclo (cosa che non fai). Ma sarebbe uno spreco di risorse.
    Comunque, di norma infatti non si fa così. Si istanzia il ServerSocket e poi si fa il loop ma sul accept(). Ad ogni connessione dal client, accept() ritorna con il Socket per la comunicazione.
    A quel punto però devi decidere se fare un server "sequenziale" (iterativo) oppure un server "concorrente".
  • Re: [RISOLTO]Semplice applicazione client server

    Grazie per la spiegazione potresti spiegarmi meglio su dove inserire il while in modo da non sprecare risorse Grazie
  • Re: [RISOLTO]Semplice applicazione client server

    barty93 ha scritto:


    Grazie per la spiegazione potresti spiegarmi meglio su dove inserire il while in modo da non sprecare risorse Grazie
    ServerSocket serverSocket = new ServerSocket(9000);
    
    while (true) {
        Socket socket = serverSocket.accept();
        // ... usa socket ...
    }
    Il punto è che se gestisci la comunicazione con il client direttamente lì nel contesto di quel while, il server è "sequenziale" (anche detto iterativo) perché puoi gestire in sequenza un solo client per volta. Se vuoi un server "concorrente", dovresti creare thread separati per gestire ciascuna comunicazione.
  • Re: [RISOLTO]Semplice applicazione client server

    Perfetto adesso ho capito.... Grazie mille
Devi accedere o registrarti per scrivere nel forum
4 risposte