Oppure

Loading
27/10/11 12:49
MagoAntò
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:

import java.io.IOException;
import java.net.*;
import java.util.*;

public class Server
{
    // ArrayList che gestirà gli utenti
    public static ArrayList <ThreadedClient> utente = new ArrayList<ThreadedClient>();
    
    public static void main (String[] args)
    {
        try
        {
            // Il server si mette in attesa sulla porta 8089
            ServerSocket server = new ServerSocket (8089);
            System.out.println ("Il size dell'array e':"+utente.size());
            
            while (true)
            {
                // Il server accetta la connessione
                Socket incoming = server.accept();
                System.out.println ("Connessione avvenuta!");
                
                //Aggiungo all'ArrayList una nuova istanza della classe utente
                utente.add(new ThreadedClient(incoming, utente));
                
                // Creo un oggetto Runnable usando l'ultima istanza creata di utente
                Runnable r = utente.get(utente.size()-1);
                
                // Creo e faccio partire il thread relativo alla nuova connessione
                Thread t = new Thread(r);
                t.start();
                
                System.out.println("Ci sono "+utente.size()+" utenti");
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        
    }
}

import java.io.*;
import java.net.*;
import java.util.*;

public class ThreadedClient implements Runnable
{
    private Socket incoming;
    private String name;
    private ArrayList <ThreadedClient> prova;
    private PrintWriter out;
    
    public ThreadedClient (Socket i, ArrayList prova)
    {
        incoming = i;
        this.prova = prova;
    }
    
    public void run()
    {
        try
        {
            try
            {
                InputStream inStream = incoming.getInputStream();
                OutputStream outStream = incoming.getOutputStream();
                
                Scanner in = new Scanner(inStream);
                out = new PrintWriter(outStream, true);
                
                out.println("Scrivi il tuo nickname");
                if (in.hasNextLine())
                    name = in.nextLine();
                out.println("Ciao "+name+" ! Benvenuto nella chat. Scrivi BYE per uscire.");
                
                for (int i=0; i<prova.size(); i++)
                {
                    if (prova.get(i) != null && prova.get(i)!=this)
                    {
                        prova.get(i).out.println("Si e' connesso "+name);
                    }
                }
                
                for (int i=0; i<prova.size(); i++)
                {
                    System.out.println ("Utente connesso: "+prova.get(i).name);
                }
                    
                boolean done = false;
                
                while (!done && in.hasNextLine())
                {
                    String line = in.nextLine();
                    for (int i=0; i<prova.size(); i++)
                    {
                        if (prova.get(i)!=null)
                            prova.get(i).out.println("* "+name+" * scrive: "+ line);
                    }
                    
                    if (line.trim().equals("BYE"))
                    {
                        for (int i=0; i<prova.size(); i++)
                        {
                            if (prova.get(i)!=null && prova.get(i)!=this)
                                prova.get(i).out.println ("L'utente "+name+" e' uscito dalla chat.");
                        }
                        
                        done = true;
                        
                        for(int i=0; i<prova.size(); i++)
                        {
                            if (prova.get(i)==this)
                            {
                                prova.get(i).out.println("L'utente "+name+" e' uscito dalla chat.");
                                System.out.println ("Rimuovo "+prova.get(i).name+"dall'Array. SIZE PRIMA:"+prova.size());
                                prova.remove(i);
                                System.out.println ("SIZE DOPO:"+prova.size());
                            }
                        }

                        in.close();
                        out.close();
                    }
                }      
            }
            finally
            {
                incoming.close();
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}

import java.io.*;
import java.net.*;

public class Client
{
    static Socket clientSocket;
    static boolean done = false;
    
    public static void main(String[] args)
    {
        int numeroPorta = 8089;
        // qui va inserito l'indirizzo IP del server        
        String host = "";
        
	try
        {
            clientSocket = new Socket(host, numeroPorta);
        }
        catch (UnknownHostException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
            Runnable r = new ClientInputOutput(clientSocket, done);
            Thread t = new Thread (r);
            t.start();
    }
}

import java.io.*;
import java.net.*;
import java.util.*;

public class ClientInputOutput implements Runnable
{
    private Socket clientSocket;
    private Scanner in;
    private PrintWriter out;
    private boolean done;
    
    public ClientInputOutput (Socket clientSocket, boolean done)
    {
        this.clientSocket = clientSocket;
        this.done = done;
    }
    
    public void run()
    {
        try
        {
            try
            {
                InputStream inStream = clientSocket.getInputStream();
                OutputStream outStream = clientSocket.getOutputStream();
            
                out = new PrintWriter(outStream);
                in = new Scanner (inStream);
                
                String line;
                
                while (!done && in.hasNextLine())
                {
                    line = in.nextLine();
                    out.println(line);
                    
                    if (line.indexOf("L'utente") != -1)
                    {
                        done = true;
                    }
                }
                
                in.close();
                out.close();
            }
            finally
            {
                clientSocket.close();
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}


Dove sbaglio?

Grazie in anticipo!
aaa
27/10/11 14:55
HeDo
magari un'indicazione sull'eccezione sollevata o sulla riga incriminata farebbe comodo
aaa