Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Java - Chat Client/Server con Multithreading su due pc in LAN
Forum - Java - Chat Client/Server con Multithreading su due pc in LAN

Avatar
MagoAntò (Normal User)
Rookie


Messaggi: 42
Iscritto: 07/02/2009

Segnala al moderatore
Postato alle 14:49
Giovedì, 27/10/2011
Ciao a tutti!

Ho realizzato una chat client/server che sfrutta il multithreading. Volevo inserire un controllo sul numero di utenti connessi, ma ho un problema. Facendo varie prove usando Telnet, ho avuto questi risultati:

1. Faccio partire il server sulla macchina 1 (non anche il client, altrimenti mi dice che la porta 8089 è già in uso): l'invio e la ricezione dei messaggi funziona correttamente, compreso il conteggio del numero degli utenti.

2. Faccio partire il server sulla macchina 1 e il client sulla macchina 2. Appena il client si collega al server, mi viene chiesto di inserire il nickname. Fatto anche questo, lo scambio dei messaggi funziona correttamente ma il server individua 2 utenti connessi: il primo, chiamato "null" ed il secondo, col nome effettivo che inserisco dalla console di Telnet.

Questo è il codice:

Codice sorgente - presumibilmente Java

  1. import java.io.IOException;
  2. import java.net.*;
  3. import java.util.*;
  4.  
  5. public class Server
  6. {
  7.     // ArrayList che gestirà gli utenti
  8.     public static ArrayList <ThreadedClient> utente = new ArrayList<ThreadedClient>();
  9.    
  10.     public static void main (String[] args)
  11.     {
  12.         try
  13.         {
  14.             // Il server si mette in attesa sulla porta 8089
  15.             ServerSocket server = new ServerSocket (8089);
  16.             System.out.println ("Il size dell'array e':"+utente.size());
  17.            
  18.             while (true)
  19.             {
  20.                 // Il server accetta la connessione
  21.                 Socket incoming = server.accept();
  22.                 System.out.println ("Connessione avvenuta!");
  23.                
  24.                 //Aggiungo all'ArrayList una nuova istanza della classe utente
  25.                 utente.add(new ThreadedClient(incoming, utente));
  26.                
  27.                 // Creo un oggetto Runnable usando l'ultima istanza creata di utente
  28.                 Runnable r = utente.get(utente.size()-1);
  29.                
  30.                 // Creo e faccio partire il thread relativo alla nuova connessione
  31.                 Thread t = new Thread(r);
  32.                 t.start();
  33.                
  34.                 System.out.println("Ci sono "+utente.size()+" utenti");
  35.             }
  36.         }
  37.         catch (IOException e)
  38.         {
  39.             e.printStackTrace();
  40.         }
  41.        
  42.     }
  43. }
  44.  
  45. import java.io.*;
  46. import java.net.*;
  47. import java.util.*;
  48.  
  49. public class ThreadedClient implements Runnable
  50. {
  51.     private Socket incoming;
  52.     private String name;
  53.     private ArrayList <ThreadedClient> prova;
  54.     private PrintWriter out;
  55.    
  56.     public ThreadedClient (Socket i, ArrayList prova)
  57.     {
  58.         incoming = i;
  59.         this.prova = prova;
  60.     }
  61.    
  62.     public void run()
  63.     {
  64.         try
  65.         {
  66.             try
  67.             {
  68.                 InputStream inStream = incoming.getInputStream();
  69.                 OutputStream outStream = incoming.getOutputStream();
  70.                
  71.                 Scanner in = new Scanner(inStream);
  72.                 out = new PrintWriter(outStream, true);
  73.                
  74.                 out.println("Scrivi il tuo nickname");
  75.                 if (in.hasNextLine())
  76.                     name = in.nextLine();
  77.                 out.println("Ciao "+name+" ! Benvenuto nella chat. Scrivi BYE per uscire.");
  78.                
  79.                 for (int i=0; i<prova.size(); i++)
  80.                 {
  81.                     if (prova.get(i) != null && prova.get(i)!=this)
  82.                     {
  83.                         prova.get(i).out.println("Si e' connesso "+name);
  84.                     }
  85.                 }
  86.                
  87.                 for (int i=0; i<prova.size(); i++)
  88.                 {
  89.                     System.out.println ("Utente connesso: "+prova.get(i).name);
  90.                 }
  91.                    
  92.                 boolean done = false;
  93.                
  94.                 while (!done && in.hasNextLine())
  95.                 {
  96.                     String line = in.nextLine();
  97.                     for (int i=0; i<prova.size(); i++)
  98.                     {
  99.                         if (prova.get(i)!=null)
  100.                             prova.get(i).out.println("* "+name+" * scrive: "+ line);
  101.                     }
  102.                    
  103.                     if (line.trim().equals("BYE"))
  104.                     {
  105.                         for (int i=0; i<prova.size(); i++)
  106.                         {
  107.                             if (prova.get(i)!=null && prova.get(i)!=this)
  108.                                 prova.get(i).out.println ("L'utente "+name+" e' uscito dalla chat.");
  109.                         }
  110.                        
  111.                         done = true;
  112.                        
  113.                         for(int i=0; i<prova.size(); i++)
  114.                         {
  115.                             if (prova.get(i)==this)
  116.                             {
  117.                                 prova.get(i).out.println("L'utente "+name+" e' uscito dalla chat.");
  118.                                 System.out.println ("Rimuovo "+prova.get(i).name+"dall'Array. SIZE PRIMA:"+prova.size());
  119.                                 prova.remove(i);
  120.                                 System.out.println ("SIZE DOPO:"+prova.size());
  121.                             }
  122.                         }
  123.  
  124.                         in.close();
  125.                         out.close();
  126.                     }
  127.                 }      
  128.             }
  129.             finally
  130.             {
  131.                 incoming.close();
  132.             }
  133.         }
  134.         catch (IOException e)
  135.         {
  136.             e.printStackTrace();
  137.         }
  138.     }
  139. }
  140.  
  141. import java.io.*;
  142. import java.net.*;
  143.  
  144. public class Client
  145. {
  146.     static Socket clientSocket;
  147.     static boolean done = false;
  148.    
  149.     public static void main(String[] args)
  150.     {
  151.         int numeroPorta = 8089;
  152.         // qui va inserito l'indirizzo IP del server        
  153.         String host = "";
  154.        
  155.         try
  156.         {
  157.             clientSocket = new Socket(host, numeroPorta);
  158.         }
  159.         catch (UnknownHostException e)
  160.         {
  161.             e.printStackTrace();
  162.         }
  163.         catch (IOException e)
  164.         {
  165.             e.printStackTrace();
  166.         }
  167.             Runnable r = new ClientInputOutput(clientSocket, done);
  168.             Thread t = new Thread (r);
  169.             t.start();
  170.     }
  171. }
  172.  
  173. import java.io.*;
  174. import java.net.*;
  175. import java.util.*;
  176.  
  177. public class ClientInputOutput implements Runnable
  178. {
  179.     private Socket clientSocket;
  180.     private Scanner in;
  181.     private PrintWriter out;
  182.     private boolean done;
  183.    
  184.     public ClientInputOutput (Socket clientSocket, boolean done)
  185.     {
  186.         this.clientSocket = clientSocket;
  187.         this.done = done;
  188.     }
  189.    
  190.     public void run()
  191.     {
  192.         try
  193.         {
  194.             try
  195.             {
  196.                 InputStream inStream = clientSocket.getInputStream();
  197.                 OutputStream outStream = clientSocket.getOutputStream();
  198.            
  199.                 out = new PrintWriter(outStream);
  200.                 in = new Scanner (inStream);
  201.                
  202.                 String line;
  203.                
  204.                 while (!done && in.hasNextLine())
  205.                 {
  206.                     line = in.nextLine();
  207.                     out.println(line);
  208.                    
  209.                     if (line.indexOf("L'utente") != -1)
  210.                     {
  211.                         done = true;
  212.                     }
  213.                 }
  214.                
  215.                 in.close();
  216.                 out.close();
  217.             }
  218.             finally
  219.             {
  220.                 clientSocket.close();
  221.             }
  222.         }
  223.         catch (IOException e)
  224.         {
  225.             e.printStackTrace();
  226.         }
  227.     }
  228. }



Dove sbaglio?

Grazie in anticipo!

PM
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Up
2
Down
V
Segnala al moderatore
Postato alle 16:55
Giovedì, 27/10/2011
magari un'indicazione sull'eccezione sollevata o sulla riga incriminata farebbe comodo

Purtroppo (o per fortuna) non vengono generate eccezioni. La parte incriminata del programma sembrerebbe essere quella sul client, quindi le classi Client e ClientInputOutput. - MagoAntò - 27/10/11 17:03
Aggiornamento: sono riuscito a risolvere e a completare il programma. - MagoAntò - 28/10/11 19:50
In pratica, il mio errore era far partire il client (che già veniva contato come una connessione) e, dopo, effettuare una seconda connessione da console Telnet. Vorrei postare il codice completo qui, magari può servire a qualcuno. Come faccio? - MagoAntò - 28/10/11 19:51
PM