Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    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?



    codice:
    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());
    			}
    		}
    	}
    }
    codice:
    
    
    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();
    			}
    			
    		}
    }

  2. #2
    Non è una buona idea re-istanziare ogni volta uno stream input/output che tra l'altro non chiudi nemmeno. Ti conviene istanziarlo una sola volta e all'occorrenza chiuderlo correttamente.

    Inoltre, secondo me non dovresti associare ad ogni thread una lista delle connessioni.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.