PDA

Visualizza la versione completa : Socket e SocketServer in chat java


zipangulu
01-11-2011, 14:11
Ho trovato sul web (se non sbaglio proprio su un post di un utente su html) il codice di un programma che funge da chat scritto in java.
Da quello che ho visto a primo impatto ho notato che come aveva impostato il codice il creatore la chat fosse valida soltanto per i pc in una stessa lan,alchè ho voluto proare a estendere la cosa remettendo di entrare in chat un qualsiasi altro pc.
Per fare ciò vi mostro le righe salienti:



//Classe Client

Socket cs=new Socket(InetAddress.getByName(StringaNumeroIPServer ) , numeroPorta);
//come numero porta ho usato la 1234




//Classe Server
ServerSocket ss=new ServerSocket (1234);
while(true){
Socket clientSocket = ss.accept();
//ecc ecc avvio il thread
}



Il codice è in linea di massima così strutturato,ma quando un altro pc non in LAN (in Lan tutto funziona a dovere) la cosa non funziona,il client "esterno" riceve eccezzioni tipo:
"SocketException : Network is unreachable: connect"
o altra eccezzione che è scaduto il timeout per raggiungere la connessione

Quale può essere la causa?

andbin
01-11-2011, 16:40
Originariamente inviato da zipangulu
ma quando un altro pc non in LAN (in Lan tutto funziona a dovere) la cosa non funziona,il client "esterno" riceve eccezzioni tipo:
"SocketException : Network is unreachable: connect"
o altra eccezzione che è scaduto il timeout per raggiungere la connessione

Quale può essere la causa? Quando i due host non sono sulla stessa rete "locale" (che sia cablata o wireless cambia poco) ma su una rete più ampia, come internet, non centrano più nulla questioni di programmazione o del linguaggio usato.

Sono questioni di "rete", perché bisogna vedere quale è la infrastruttura di rete che c'è "in mezzo" ai due host. Se è il caso più ampio (e tipico) di due host collegati ad internet ognuno attraverso un provider (che può essere lo stesso o diverso, cambia poco), ci sono diversi fattori da considerare.

a) Il client deve sapere o l'indirizzo IP "pubblico" (preferibilmente dovrebbe essere uno "statico") che l'altro host ha su internet (questo in genere è assegnato dal provider) o un nome di host (dominio registrato che punta al IP oppure nel caso di IP dinamico si possono sfruttare servizi di dynamic-DNS).
b) La porta usata per fornire il servizio non deve essere "filtrata" dal/dai provider interessati lungo il percorso di comunicazione.
c) Chi possiede e gestisce l'host "server" deve preoccuparsi di "aprire" la porta sui vari dispositivi e macchine lungo cui passa la comunicazione. Tipicamente router ADSL, firewall hardware (ma anche software su un PC, tipo quello di Windows o ZoneAlarm o altri).

Questo come minimo per gli utenti "home". Su reti aziendali potrebbe essere più complesso e difficilmente un normale utente/dipendente ha controllo su questi aspetti specialmente il punto c).

E lo ripeto: non è una problematica di programmazione ma di "networking".

zipangulu
01-11-2011, 17:01
Bene sei stato abbastanza chiaro,sui punti a) e c) diciamo che mi hai tolto tutti i dubbi (apparte la questione del dynamic-DNS che approfondirò ora) ma sul punto b) come faccio a capire se la porta utilizzata è filtrata dai provider "lungo il cammino"?esistono a priori porte che sono esenti da tali problematiche?

andbin
01-11-2011, 17:22
Originariamente inviato da zipangulu
apparte la questione del dynamic-DNS che approfondirò oraLa questione è abbastanza semplice: gli utenti "home" tipicamente hanno una connessione a internet con IP "dinamico". L'indirizzo quindi è assegnato dal provider e cambia nel tempo (da una connessione all'altra). Se hai un router ADSL attivo 24/24h (come ho io), è più probabilme che la connessione "resista" per molti giorni ma non è comunque questa una garanzia valida.

Se vuoi fornire un qualche "servizio" su una porta, gli altri devono sapere l'indirizzo IP ma ... cambia! Ci sono servizi di "dynamic DNS" che ti forniscono tipicamente un nome di dominio di 3° livello, es. tuonomescelto.nomedelservizio.xyz.
Sulla tua macchina devi installare un piccolo software fornito dal servizio che tiene aggiornato sui loro DNS il IP agganciato al nome.
Se hai un buon (e recente) router ADSL è anche possibile che il router stesso abbia la gestione per uno o più di questi servizi.


Originariamente inviato da zipangulu
ma sul punto b) come faccio a capire se la porta utilizzata è filtrata dai provider "lungo il cammino"?esistono a priori porte che sono esenti da tali problematiche? Generalmente la soluzione più semplice è ... provare (supponendo che tutto il resto sia ok).
Comunque i provider spesso filtrano le (poche) porte relative ai servizi (di sistema specialmente) "noti" (e potenzialmente critici se l'utente "home" non sa o non ha fatto nulla per proteggersi).

zipangulu
01-11-2011, 22:06
Grazie 1000 per le risposte e per l'interessamento...ho risolto il problema aprendo la porta in questione sul rooter.
Ora mi sorge un altro dubbio però.
Nel caso in cui si volesse creare una chat,come quella di cui mi sto occupando io,dove io fung da server creando un ServerSocket,utilizzando una data porta e i Client che vogliono avere un "collegamento" con me ,quindi nel caso specifico vogliono entrare in chat devono "collegarsi" a attraverso il mio IP.
Ora,affinchè la chat funzioni io (server) devo essere sempre raggiungibile,attivo e devo continuamente accettare le richieste dai client,ma nel caso in cui io spegnessi il pc?Il server non funge più!
Tralasciamo per ora i problemi di IP statico e dinamico,per avere una sorta di server sempre reperibile,su cui far girare il mio programma (server) in grado di accettare le richieste dai client,si deve per forza ottenere un servizio a pagamento?o esiste un qualcosa di gratuito che può andar bene nel mio caso?

Altrimenti la soluzione che avevo pensato è:creare una chat in modo che gli utenti avviano il software decidendo di
1)fungere da server per degli utenti (quindi può l'utente creare una chat dove i client vedono lui,e il suo ip,come server)
2)l'utente può entrare in una chat disposta da un altro utente nelle vesti di server,conoscendo il suo ip.

Spero di essermi spiegato...

andbin
01-11-2011, 22:33
Originariamente inviato da zipangulu
Ora,affinchè la chat funzioni io (server) devo essere sempre raggiungibile,attivo e devo continuamente accettare le richieste dai client,ma nel caso in cui io spegnessi il pc?Il server non funge più!Ovviamente.


Originariamente inviato da zipangulu
Tralasciamo per ora i problemi di IP statico e dinamico,per avere una sorta di server sempre reperibile,su cui far girare il mio programma (server) in grado di accettare le richieste dai client,si deve per forza ottenere un servizio a pagamento?o esiste un qualcosa di gratuito che può andar bene nel mio caso?Nota che a te non servirebbe un "hosting" (cioè spazio web, più eventualmente db o altro). Di hosting del genere ne trovi a caterbe sia a pagamento sia anche, a livello minore, gratis.
No, ti servirebbe avere una macchina su cui puoi lanciare quello che ti pare (una applicazione Java stand-alone) e poter trattare la comunicazione su una porta (di networking) a tua scelta.
Servizi del genere (cioè poter avere una macchina a tua disposizione) ce ne sono ma i prezzi ..... non sono per utenti "home".

Se dimentichi i socket, potresti realizzare una chat che si basa sul protocollo HTTP e quindi potresti realizzare una webapp ad esempio in Java ma in ogni caso il concetto della comunicazione è diverso (dai socket) e comunque un hosting con un application server per webapp Java non lo trovi a buon prezzo.


Originariamente inviato da zipangulu
Altrimenti la soluzione che avevo pensato è:creare una chat in modo che gli utenti avviano il software decidendo di
1)fungere da server per degli utenti (quindi può l'utente creare una chat dove i client vedono lui,e il suo ip,come server)
2)l'utente può entrare in una chat disposta da un altro utente nelle vesti di server,conoscendo il suo ip.Tieni presente che così l'utente dovrebbe comunque "impelagarsi" in questioni di IP, porte e quant'altro. Decisamente poco pratico per una semplice "chat".

LeleFT
02-11-2011, 09:17
Direi che siamo andati sufficientemente off-topic. Queste problematiche non riguardano il linguaggio Java, né problemi di programmazione con tale linguaggio.

Sono problematiche di rete e trovano il loro posto nel forum "Reti LAN e Wireless".

Devo spostare la discussione.


Ciao. :ciauz:

Loading