ciao raga...
sto realizzando una chat fuori dagli schemi nel senso ke non è client-server ma è peer-to-peer...

se la provo in lan la chat funziona tranquillamente mentre se la provo su internet non funziona + ovvero se 2 o + persone ci entrano nn si vedono e quindi nn riesco a chattare...

ovviamente la mia chat usa il protocollo UDP ed è firmata.
nn posto il codice proprio xkè nn è corto...cmq vorrei sapere se è normale ke i pacchetti inviati nn arrivano e nn mi viene generato nessun tipo di errore???

tutta la chat si basa su qst 4 classi...
ecco i codici:

classe Host
codice:
import java.io.Serializable;

public class Host implements Serializable{
    private static final long serialVersionUID = 1L;
    private String nick;
    private String ip;
    private int portaServer;
    private int countdownDisconnessione;
    private boolean bloccato;
    private int startCountDown;
    
    public Host (String nick,String ip,int portaServer){
        this.nick = nick;
        this.ip = ip;
        this.portaServer = portaServer;        
        bloccato = false;
        
        do{
            startCountDown = (int)(Math.random()*50);
        }while(startCountDown < 10);
        this.countdownDisconnessione = startCountDown;
    }
    
    public Host (String ip,int portaServer){
        this("???",ip,portaServer);
    }
    
    public Host (){
        this("","",0);
    }
    
    public String getNick(){
        return nick;
    }
    
    public void setNick(String nick){
        this.nick = nick;
    }
    
    public String getIP(){
        return ip;
    }
    
    public int getPortaServer(){
        return portaServer;
    }
    
    public void decCountDown(){
        this.countdownDisconnessione--;
    }
    
    public void resetCountDown(){
        this.countdownDisconnessione = startCountDown;
    }
    
    public int getCountDown(){
        return this.countdownDisconnessione;
    }
    
    public void blocca(){
        bloccato = true;
    }
    
    public void sblocca(){
        bloccato = false;
    }
    
    public boolean risultaBloccato(){
        return bloccato;
    }
    
    public boolean equals(Object o){
        if (!(o instanceof Host)){
            return false;
        }else{
            Host h = (Host)o;
            if (h.getIP().equals(this.ip) && h.getPortaServer() == this.portaServer)
                return true;
            else
                return false;
        }
    }
    
    public String toString(){
        return "Host\n\t-nick: "+nick+"\n\t-ip: "+ip+"\n\t-porta: "+portaServer;
    }
}
classe Messaggio
codice:
import java.io.Serializable;


public class Messaggio implements Serializable{
    private static final long serialVersionUID = 1L;
    
    public static final int CONNESSIONE = 0;
    public static final int DISCONNESSIONE = 1;
    public static final int CHIEDI_NICK = 2;
    public static final int PASSO_NICK = 3;
    public static final int TESTO_UNICAST = 4;
    public static final int TESTO_MULTICAST = 5;
    public static final int TESTO_BROADCAST = 6;
    public static final int AGGIORNAMENTO = 7;
    public static final int TRILLO = 8;
    public static final int INVITO = 9;
    public static final int NUOVO_INVITO = 10;
    public static final int USCITA_CONVERSAZIONE = 11;
    
    private Host mittente;
    private Host destinatario;
    private int tipo;
    private Object corpo;
    
    public Messaggio (Host mittente, Host destinatario,int tipo,Object corpo){
        this.mittente = mittente;
        this.destinatario = destinatario;
        this.tipo = tipo;
        this.corpo = corpo;
    }
    
    public Host getMittente(){
        return mittente;
    }
    
    public Host getDestinatario(){
        return destinatario;
    }
    
    public int getTipo(){
        return tipo;
    }
    public Object getCorpo(){
        return corpo;
    }
    
    public void setDestinatario(Host dest){
        this.destinatario = dest;
    }
}
classe LatoClient (usata solo x inviare)
codice:
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;


public class LatoClient {
    public static void send(Messaggio m) {
        if(!m.getDestinatario().equals(m.getMittente())){
            try{
                DatagramSocket clientSocket = new DatagramSocket();
                InetAddress IPAddress = InetAddress.getByName(m.getDestinatario().getIP());
                
                ByteArrayOutputStream stream = new ByteArrayOutputStream();
                ObjectOutputStream oostream = new ObjectOutputStream(stream);
                oostream.writeObject(m);
                oostream.flush();
                
                byte[] data = stream.toByteArray();
                stream.close();
                
                DatagramPacket sendPacket = new DatagramPacket(data, data.length, IPAddress, m.getDestinatario().getPortaServer());
                clientSocket.send(sendPacket);
                
                clientSocket.close();
                
            }catch(IOException e){
                e.printStackTrace();
            }
        }
    }
}
classe LatoServer (usata solo x ricevere)

codice:
import java.io.ByteArrayInputStream;
import java.io.EOFException;
import java.io.ObjectInputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;


public class LatoServer implements Runnable{
    
    private Thread thread = new Thread(this);
    private TestInterface ti;
    private TabellaHost tabellaHost;
    private Host server;
    
    public LatoServer (TestInterface ti,TabellaHost tabellaHost,Host server){
        this.ti = ti;
        this.tabellaHost = tabellaHost;
        this.server = server;
        
        thread.start();
    }
    
    public void run(){
        try{
            while(true){
                DatagramSocket serverSocket = new DatagramSocket(server.getPortaServer());
                byte[] data = new byte[1024];
                
                DatagramPacket receivePacket = new DatagramPacket(data,data.length);
                serverSocket.receive(receivePacket);
                
                ByteArrayInputStream bais = new ByteArrayInputStream(data);
                ObjectInputStream ois = new ObjectInputStream(bais);
                
                Messaggio m;
                try{
                    m = (Messaggio)ois.readObject();
                    
                    bais.close();
                    
                    if(!m.getMittente().equals(m.getDestinatario())){
                        switch(m.getTipo()){
                            case Messaggio.AGGIORNAMENTO:
                                ti.smista(m);                                
                                break;
                            case Messaggio.USCITA_CONVERSAZIONE:
                            case Messaggio.TRILLO:
                            case Messaggio.INVITO:
                            case Messaggio.NUOVO_INVITO:
                            case Messaggio.TESTO_UNICAST:
                            case Messaggio.TESTO_MULTICAST:
                            case Messaggio.TESTO_BROADCAST:
                                if(!tabellaHost.hostBloccato(m.getMittente()))
                                    ti.smista(m);                                
                                break;
                            case Messaggio.CHIEDI_NICK:
                                Messaggio m2 = new Messaggio(server,m.getMittente(),Messaggio.PASSO_NICK,"");
                                LatoClient.send(m2);
                                break;
                            case Messaggio.PASSO_NICK:
                                tabellaHost.aggiornaHost(m.getMittente());
                                break;                                
                            case Messaggio.CONNESSIONE:
                                tabellaHost.aggiungiHost(m.getMittente());
                                ti.smista(m);
                                break;
                            case Messaggio.DISCONNESSIONE:
                                tabellaHost.rimuoviHost(m.getMittente());
                                ti.smista(m);
                                break;
                        }
                        ti.aggiornaLista();
                        tabellaHost.resetCountDownHost(m.getMittente());
                    }
                }catch(EOFException e2){
                    break;
                }
                serverSocket.close();
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
nn penso ke ci siano errori...xò è anke vero ke è la prima volta ke uso robe di qst tipo...

questo è link x la chat:
http://phantom89.helloweb.eu/?page=-1
inserite il nick ed entrate!!!

ps: nn badate alla descrizione...