View Full Version : [JAVA]Problema router e invio UDP
Ho fatto un programmino che permette la comunicazione fra più utenti, ma con quelli ke hanno il router non va, in pratica dove io mi aspetto un oggetto sembra che arrivi un Integer e questo blocca tutto...cosa potrebbe essere? lo fa solo con i router...
Barbalbero
04-08-2006, 17:46
Prova a descrivere meglio la topologia della rete
Allora si tratta del protocollo UDP, utilizzo le porte 27900,27911,27910,27911.
Mi sono fatto un mio protocollo per avere un minimo di sicurezza di invio ricezione dato, quindi il client per ogni domanda che fa al server si aspetta anche una risposta, l'errore sta in uno di questi passaggi, dopo che il client fa richiesta di connessione al server, ed il server risponde bene, il server si aspetta poi di ricevere dal client alcune info, ma è come se gli arrivasse un Integer e quindi mi solleva un'eccezzione di cast.
Succede solo con gente che ha il router e non so cosa fare...
Potrebbe essere un problema di buffer size?
Io ora lascio il BufferSize dei socketUDP a default, potrebbe essere questo?
sto parlando dei metodi :
DatagramSocket.setReceiveBufferSize(int size)
DatagramSocket.setSendBufferSize(int size)
Che tra l'altro non ho capito su cosa vanno ad influire...
Fammi capire, ma le porte devono essere aperte anche sui client ? O è solo il server ad attendere pacchetti UDP su quelle porte ?
Allora il server attende pacchetti sulle porte 27910 e 27911, i client sulle porte 27900 e 27901.
Devi aprire le porte 27900 e 279001 sui router dei client e fare il forward alle porte locali dell'ip che usa il programma...
Visto che il sistema non mi sembra che sia peer-to-peer, ma centralizzato, ti conviene non usare le porte sui client, ma tieni aperto il socket sul quale hai ricevuto l'ultima richiesta di un client e su quello invia i dati...altrimenti ti troverai di fronte a questi problemi in molte altre situazioni (vedi fastweb)...
Non ho capito bene, come faccio a ricevere qualcosa dal server se il client non apre un socket?Non devo per forza aprire un socket su una porta?
Barbalbero
05-08-2006, 08:57
Devi aprire le porte 27900 e 279001 sui router dei client e fare il forward alle porte locali dell'ip che usa il programma...
Visto che il sistema non mi sembra che sia peer-to-peer, ma centralizzato, ti conviene non usare le porte sui client, ma tieni aperto il socket sul quale hai ricevuto l'ultima richiesta di un client e su quello invia i dati...altrimenti ti troverai di fronte a questi problemi in molte altre situazioni (vedi fastweb)...
...Non sono sicuro...ma se fosse solo un problema di NAT del router, non riceverebbe nemmeno gli int. giusto?
Il dialogo fra client e server avviene scambiandosi dei segnali, che sono dei semplici int predefiniti, per chidere la connessione il client quindi fa richiesta al server, che se riceve la richiesta invia al client una risposta afferamativa, questo come ho già detto avviene bene, solo che quando il client riceve che si può connettere(e che è stato connesso) deve inviare al server un oggetto che contiene varia info sul client, ecco l'errore è qui, il server si aspetta questo oggetto ma gli arriva un int.
Ho pensato che magari con il router per qualche strana ragione non passa un oggetto intero, e quindi ho pensato ai bufferSize, ma secondo voi nn è questa la ragione?
x cionci:io non ho capito bene la tua soluzione, cosa intendi x "non un sistema peer-to-peer ma centralizzato"?
Aggiungo che io non ho un router e ho un solo pc...quindi non riesco ad approffondire la situazione da solo, ed un casino in questo genere di cose dovere scrivere codice "alla ceca" e dover sempre rompere le palle a qualcuno per i test.
Allora...prima di addentrami in questo discorso bisogna chiarire una cosa.
Purtroppo esiste una brutta bestia che siama NAT (http://it.wikipedia.org/wiki/Network_address_translation) (Network Address Translation).
Se due pc vogliono comunicare tra di loro e tutti e due sono dietro un NAT c'è poco da fare. Infatti, l'unica soluzione è avere un terzo pc che non è dietro NAT che fa da ponte tra i due.
Ti consiglio di leggere qualcosa su NAT Traversal ( l'argomento è molto di moda in questo periodo [;)] ).
MEMon: quando ricevi un messaggio con la recvfrom metti da parte il socket da cui hai ricevuto il dato, successivamente invii con la sendto su questo stesso socket i messaggi che devono arrivare ai client...in questo modo non hai bisogno di porte aperte sui client...
Attenzione che il NAT (cioè l'associazione fra i punti terminali della trasmissione e l'indirizzo privato che ha iniziato la trasmissione) potrebbe scadere...quindi potresti utilizzare dei pacchetti "vuoti" da spedire ogni tot msec per impedire che il NAT scada...
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.