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
classe Messaggiocodice: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 LatoClient (usata solo x inviare)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 LatoServer (usata solo x ricevere)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(); } } } }
nn penso ke ci siano errori...xò è anke vero ke è la prima volta ke uso robe di qst tipo...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(); } } }
questo è link x la chat:
http://phantom89.helloweb.eu/?page=-1
inserite il nick ed entrate!!!
ps: nn badate alla descrizione...

Rispondi quotando