Server Multithread e Client

di il
1 risposte

Server Multithread e Client

Ciao ,
diciamo che come logica funziona , solo che il client quando manda un messaggio al server , si blocca a "br.readLine()" finche un secondo client nn scrive qualcosa ... ho letto delle conversazioni e forse dovrei usare DataInputStream solo che nn capisco come mai questo problema , sapete aiutarmi?
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Collection;
import java.util.Vector;
/**
 * questa classe gestisce le conversazioni
 * @author Japper
 *
 */
public class Connessione implements Runnable {
	private Socket connessione = null;
	private InputStream is = null;
	private InputStreamReader isr = null;
	private BufferedReader br = null;
	private String mex = null;
	private PrintWriter pw = null;
	private Vector<Socket> listaConnessioni = null;

	public Connessione(Socket ss, Vector<Socket> lista) {
		this.connessione = ss;
		this.listaConnessioni = lista;
	}

	public void run() {
		try {
			while (true) {
				
				//inizio lettura dal client
				is = connessione.getInputStream();
				isr = new InputStreamReader(is);
				br = new BufferedReader(isr);
				mex = br.readLine();
				//invio il messaggio di un client ai altri client
				for(Socket s:listaConnessioni){
					if(s!=connessione){
						System.out.println("uno");
						pw = new PrintWriter(s.getOutputStream(), true);
						pw.println(mex);
						pw.flush();
					}
				}
				System.out.println("<" + connessione + ">     \"" + mex + "\"");
				
			}
		} catch (IOException ioe) {
			System.err.println("ERRORE (IOException) : " + ioe.getMessage());
		}

	}
	//inutile xD
	public void addConnessione(Socket socket){
		listaConnessioni.add(socket);
	}

	
	
	public static void main(String[] args) {

		ServerSocket ss = null;
		Socket socket = null;
		Vector<Socket> listaConnessioni = new Vector<Socket>();

		try {
			ss = new ServerSocket(8080);
			System.out.println("...........");
			while (true) {
				socket = ss.accept();
				listaConnessioni.add(socket);
				Connessione serverThread = new Connessione(socket , listaConnessioni);
				Thread thread = new Thread(serverThread);
				thread.start();
			}

		} catch (IOException ioe) {
			System.err.println("ERROR : " + ioe.getMessage());
		} catch (SecurityException se) {
			System.err.println("ERROR : " + se.getMessage());
		} catch (IllegalArgumentException iae) {
			System.err.println("ERROR : " + iae.getMessage());
		} finally {
			// Close di Socket
			try {
				if (null != socket) {
					socket.close();
				}
			} catch (IOException ioe) {
				System.err.println("ERROR (IOException) : " + ioe.getMessage());
			} catch (SecurityException se) {
				System.err.println("ERROR (SecurityException): " + se.getMessage());
			} catch (IllegalArgumentException iae) {
				System.err.println("ERROR (IllegalArgumentException): " + iae.getMessage());
			}
			// close del ServerSocket
			try {
				if (null != ss) {
					ss.close();
				}
			} catch (IOException ioe) {
				System.err.println("ERROR (IOException): " + ioe.getMessage());
			} catch (SecurityException se) {
				System.err.println("ERROR (SecurityException) : " + se.getMessage());
			} catch (IllegalArgumentException iae) {
				System.err.println("ERROR (IllegalArgumentException): " + iae.getMessage());
			}
		}
	}
}
import java.net.*;
import java.io.*;
import javax.swing.*;
/**
 * questa classe si connette al server sulla porta  8080 all'indirizzo 127.0.0.1
 * @author Japper
 *
 */
public class Client {
		public static void main(String[] args)throws Exception{
			
			InetAddress indirizzo = InetAddress.getByName("127.0.0.1" ) ;
			int porta = Integer.parseInt("8080" );
			
			Socket s = new Socket( indirizzo , porta );
			
			System.out.println("Inizio Conversazione");
			InputStream is = null;
			InputStreamReader isr = null;
			BufferedReader br = null;
			BufferedReader myInput = null;
			PrintWriter pout = null;
			InputStreamReader reader = null;
			System.out.println("------------------------");
			try{
				is = s.getInputStream();
				while(true){
					//legge dal dos e manda il messaggio al server
					if(System.in!=null){
						reader = new InputStreamReader(System.in);
						myInput = new BufferedReader (reader);
						String str = new String (myInput.readLine());
						pout = new PrintWriter(s.getOutputStream(), true);
						pout.println(str);
					}
					//legge dal server e stampa a video il messaggio e il socket del destinatario
					if(is!= null){
						isr = new InputStreamReader( is );
						br = new BufferedReader( isr );
						String mex = br.readLine();
						System.out.println("<" + s + ">     \""  + mex + "\"" );
					}
				}
			}catch(Exception e){
				System.out.println("problemi CLIENT");
			}finally{
				isr.close();
				is.close();
				pout.close();
				myInput.close();
				reader.close();
				s.close();
			}
			
		}
}

1 Risposte

  • Re: Server Multithread e Client

    Non è un problema, ma funziona proprio così. readLine si mette in attesa del'input, quindi è normale che si blocchi. devi usare un ascoltatore che non si blocca
Devi accedere o registrarti per scrivere nel forum
1 risposte