Homepage  Il progetto dsy.it è l'unofficial support site dei corsi di laurea del Dipartimento di Scienze dell'Informazione e del Dipartimento di Informatica e Comunicazione della Statale di Milano. E' un servizio degli studenti per gli studenti, curato in modo no-profit da un gruppo di essi. I nostri servizi comprendono aree di discussione per ogni Corso di Laurea, un'area download per lo scambio file, una raccolta di link e un motore di ricerca, il supporto agli studenti lavoratori, il forum hosting per Professori e studenti, i blog, e molto altro...
In questa sezione è indicizzato in textonly il contenuto del nostro forum


.dsy:it. .dsy:it. Archive > Didattica > Corsi N - Z > Reti di calcolatori
 
[ESERCIZIO] Chat Java
Clicca QUI per vedere il messaggio nel forum
futurbaggio
Ecco il mio codice, se a qualcuno va di confrontarlo (sperando che l'indentazione resti):

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

class Client{
String testo;
InputStreamReader reader;
BufferedReader myInput;
Socket s;
OutputStream NetOut;

public Client(String host, int porta){
try{
reader = new InputStreamReader (System.in);
myInput = new BufferedReader (reader);
s = new Socket(host, porta);
NetOut = s.getOutputStream();
} catch(Exception e) {
System.out.println("Errore nell'inizializzazione del Client: "+ e.getMessage() );
System.exit(-1);
}
}

public void disconnetti(){
try {
s.close();
System.out.println("Alla prossima chattata!");
System.exit(-1);
} catch(Exception e) {
System.out.println("Errore nella chiusura della connessione");
System.exit(-1);
}
}

public void invia(){
try {
for (int i=0; i < testo.length(); i++) {
NetOut.write((int)testo.charAt(i));
}
if(testo.equals("quit\n")) disconnetti();
} catch(Exception e) {
System.out.println("Errore nell'invio dei dati");
System.exit(-1);
}
}

public void scrivi(){
try {
System.out.print("Io scrivo:");
testo = myInput.readLine();
testo = testo + '\n';
invia();
} catch(Exception e) {
System.out.println("Errore nell'inserimento dei dati da tastiera");
System.exit(-1);
}
}
}

class Server{
public boolean connesso;
String testo;
InputStreamReader reader;
BufferedReader myInput;
ServerSocket ss;
Socket s;
InputStream NetIn;

public Server(int porta){
try{
ss = new ServerSocket(porta);
s = ss.accept();
NetIn = s.getInputStream();
connesso = true;
} catch(Exception e) {
System.out.println("Errore nell'inizializzazione del Server");
System.exit(-1);
}
}

public void disconnetti(){
try {
s.close();
ss.close();
System.out.println("Alla prossima chattata!");
System.exit(-1);
} catch(Exception e) {
System.out.println("Errore nella chiusura della connessione");
System.exit(-1);
}
}

public void ricevi(){
testo = "";
int c;
try {
System.out.print("Lui scrive: "+ testo);
while ((c = NetIn.read()) != 10) {
System.out.print((char)c);
testo = testo + (char)c;
}
System.out.println();

if(testo.equals("quit")) disconnetti();
} catch(Exception e) {
System.out.println("Errore nella ricezione dei dati");
System.exit(-1);
}
}
}

class futurbaggio {
public static void main(String[] args){
Client Cli = new Client("127.0.0.1",10000);
Server Ser = new Server(10001);
System.out.println("Benvenuto in chat, non devi sapere nulla se non che la sequenza 'quit', senza apici, ti consente di uscire ;)");

while(true){
Cli.scrivi();
Ser.ricevi();
}
}
}

class roberto {
public static void main(String[] args){
System.out.println("Benvenuto in chat, non devi sapere nulla se non che la sequenza 'quit', senza apici, ti consente di uscire ;)");
Server Ser = new Server(10000);
Client Cli = new Client("127.0.0.1",10001);

while(true){
Ser.ricevi();
Cli.scrivi();
}
}
}

Alcune considerazioni (dubbi), il prof ha utilizzato come codice intero per il termine della ricezione di dati il -1... ma a me il suo stesso codice ha dato problemi, in pratica il server si bloccava restando in attesa di non so cosa... per questo ho considerato il codice 10 che è quello dell'accapo (ogni messaggio inserito infatti viene fatto terminare da '\n'). Qualcuno mi illumina????

Per l'esecuzione va lanciato prima il client roberto e poi futurbaggio... se non riuscite chiedetemi!

Roberto

yeah
Azz! Io l'ho tenuto mooolto più semplice :)

ho un main() da entrambe le parti e poi i prog si chiudono con un bel Ctrl+C ;)

X-ICEMAN
sigh per me è ancora fuori quota :) ho fatto java 2 anni fa non lo ricordo praticamente più :) adesso sto riprendendo.. l'inizio è traumatico :)

mayetta
Originally posted by yeah
Azz! Io l'ho tenuto mooolto più semplice :)

ho un main() da entrambe le parti e poi i prog si chiudono con un bel Ctrl+C ;)


idem ;) e funziona!!!! :ola:

:)

Francesko
scusate l'ignoranza abissale, ma questi sono programmi che possono essere scritti solo su pc connessi ad una rete? cioè io non mi posso mettere a casa mia a farli, vero?

yeah
Francesco:
forunatamente sì!

Lanciato il server, tutto ok, questo è in ascolto su una porta del pc locale (sul quale è stato lanciato).

Nel codice del client c'è:
s = new Socket("localhost",4500);

che connette il socket 's' alla macchina 'localhost', ovvero il pc su cui lo si ha lanciato (che in questo caso è lo stesso che sta eseguendo il codice del server).

Volendo usare un pc in rete, 'localhost' andrà sostituito con l'idirizzo IP della macchina remota.

In questo caso però, localhost (che equivale all'IP 127.0.0.1) permette di usare client e server sulla stessa macchina.

CUBA
Ho creato un file java cha_1 dove ho un server1 e un client1 e un file chat_2 dove ho un client2 e un server2.

La welcomeSocket del file chat_1 riceve la connessione del client2, e dopo avergli mandato la stringa, si chiude la connessione da entrambe le parti. La welcomeSocket del file chat_1, rimane in ascolto.

A questo punto il codice chat_2 arriva alla creazione della sua WelcomeSocket e il codice chat_1 arriva alla creazione del client1 praticamente, le parti si invertono.

Il server2 riceve la connessione del client1 e dopo avergli mandato la stringa, le socket vengono chiuse. La WelcomeSocket del file chat_2, rimane in ascolto.


Spero sia l'interpretazione giusta, praticamente i file chat_1 e chat_2 simulano la presenza di due macchine una che è prima server e poi client e l'altra che è prima client e poi server.

Se volete posto il codice...Ciauz

mayetta
io credo che lo scopo dell'esercizio fosse dimostrare di aver capito come far comunicare un client e un server potenzialmente all'infinito (interrompendoli con un semplice CTRL+c) e farli agire in modo alternato: client scrive sulla socket a server, server legge quello che gli manda client, server scrive sulla socket a client, client legge quello che gli manda server, etc....

il tutto reso un pochino più complicato dal fatto che le stringhe che i due si passano vengono prese dall'input di tastiera.

la mia soluzione:

client
server

futurbaggio
Originally posted by CUBA
Se volete posto il codice...Ciauz


Non so se hai dato un occhio al mio codice ma io praticamente non ho mai fatto chiudere le socket, alternandone apertura e chiusura... dovrebbe essere una sorta di ottimizzazione delle risorse ma è una mia deduzione che non ha pratici riscontri :twisted:
Cmq postalo, a me interessa vederlo...

Roberto

PS. Nessuno l'ha fatta multiutente?

DeepBlue
Originally posted by futurbaggio
Non so se hai dato un occhio al mio codice ma io praticamente non ho mai fatto chiudere le socket, alternandone apertura e chiusura... dovrebbe essere una sorta di ottimizzazione delle risorse ma è una mia deduzione che non ha pratici riscontri


E' ottimizzata solo se riutilizzi sempre le stesse socket. Aprire una socket significa impiegare memoria, quindi aprire n socket significa utilizzare m byte di memoria.

PS. Nessuno l'ha fatta multiutente?

Visto che non seguo il corso, dal quel poco che ho potuto capire dai vostri post, il docente chiedeva la realizzazione di un sistema bi-utente, ovvero di un client e di un server che comunicano fra loro.

Per realizzare una chat multi-utente è necessaria l'esistenza di un server che accetti connessioni e che replichi a tutti i client i messaggi che riceve o che li indirizzi al solo utente destinatario. Dopo due lezioni mi sembra troppo ;)

m@cCo
Scusate ma come va intesa l'alternanza?
Il server può rispondere al client? O semplicemente restituisce la stessa stringa inserita dal client?

Ciao

m@cCo
Ma l'alternanza viene eseguita automaticamente dalla gestione delle seocket di java?
Se io client scrivo il server rimane in attesa fino a che il canale non viene chiuso, e allo stesso modo il client rimane in attesa del server?

Mi riferisco all'esempio di mayetta.

Ciao

mayetta
il prof l'ha spiegato così:

client chiede connessione
server accetta e aspetta
client scrive per primo e va avanti così:

client -> server : ciao
server -> client: ciao a te
client -> server: ...
....

:)

0m4r
Originally posted by futurbaggio
Ecco il mio codice, se a qualcuno va di confrontarlo (sperando che l'indentazione resti):

code:
import java.io.*; import java.net.*; class Client{ String testo; InputStreamReader reader; BufferedReader myInput; Socket s; OutputStream NetOut; public Client(String host, int porta){ try{ reader = new InputStreamReader (System.in); myInput = new BufferedReader (reader); s = new Socket(host, porta); NetOut = s.getOutputStream(); } catch(Exception e) { System.out.println("Errore nell'inizializzazione del Client: "+ e.getMessage() ); System.exit(-1); } } public void disconnetti(){ try { s.close(); System.out.println("Alla prossima chattata!"); System.exit(-1); } catch(Exception e) { System.out.println("Errore nella chiusura della connessione"); System.exit(-1); } } public void invia(){ try { for (int i=0; i < testo.length(); i++) { NetOut.write((int)testo.charAt(i)); } if(testo.equals("quit\n")) disconnetti(); } catch(Exception e) { System.out.println("Errore nell'invio dei dati"); System.exit(-1); } } public void scrivi(){ try { System.out.print("Io scrivo:"); testo = myInput.readLine(); testo = testo + '\n'; invia(); } catch(Exception e) { System.out.println("Errore nell'inserimento dei dati da tastiera"); System.exit(-1); } } } class Server{ public boolean connesso; String testo; InputStreamReader reader; BufferedReader myInput; ServerSocket ss; Socket s; InputStream NetIn; public Server(int porta){ try{ ss = new ServerSocket(porta); s = ss.accept(); NetIn = s.getInputStream(); connesso = true; } catch(Exception e) { System.out.println("Errore nell'inizializzazione del Server"); System.exit(-1); } } public void disconnetti(){ try { s.close(); ss.close(); System.out.println("Alla prossima chattata!"); System.exit(-1); } catch(Exception e) { System.out.println("Errore nella chiusura della connessione"); System.exit(-1); } } public void ricevi(){ testo = ""; int c; try { System.out.print("Lui scrive: "+ testo); while ((c = NetIn.read()) != 10) { System.out.print((char)c); testo = testo + (char)c; } System.out.println(); if(testo.equals("quit")) disconnetti(); } catch(Exception e) { System.out.println("Errore nella ricezione dei dati"); System.exit(-1); } } } class futurbaggio { public static void main(String[] args){ Client Cli = new Client("127.0.0.1",10000); Server Ser = new Server(10001); System.out.println("Benvenuto in chat, non devi sapere nulla se non che la sequenza 'quit', senza apici, ti consente di uscire ;)"); while(true){ Cli.scrivi(); Ser.ricevi(); } } } class roberto { public static void main(String[] args){ System.out.println("Benvenuto in chat, non devi sapere nulla se non che la sequenza 'quit', senza apici, ti consente di uscire ;)"); Server Ser = new Server(10000); Client Cli = new Client("127.0.0.1",10001); while(true){ Ser.ricevi(); Cli.scrivi(); } } }


Alcune considerazioni (dubbi), il prof ha utilizzato come codice intero per il termine della ricezione di dati il -1... ma a me il suo stesso codice ha dato problemi, in pratica il server si bloccava restando in attesa di non so cosa... per questo ho considerato il codice 10 che è quello dell'accapo (ogni messaggio inserito infatti viene fatto terminare da '\n'). Qualcuno mi illumina????

Per l'esecuzione va lanciato prima il client roberto e poi futurbaggio... se non riuscite chiedetemi!

Roberto


Off-Topic:
usa i tag [ code ] e [/ code ] (senza spazi ;P)

yeah
Ecco la mia versione di questo esercizio:

Server - Chat_s.java
code:
import java.net.*; import java.io.*; class Chat_s { public static void main(String args[]) { int c; String localPrompt = "Local> ", // richiesta di input remotePrompt = "Remote> "; // visualizzazione dei caratteri ricevuti ServerSocket listener; // socket di accettazione delle connessioni Socket established; // socket della connessione accettata InputStream sock_in; // Stream di input del Socket OutputStream sock_out; // Stream di output del Socket System.out.println("Server avviato"); try { // Apertura del socket di ascolto listener = new ServerSocket(6000, 300); established = listener.accept(); //connessione accettata listener.close(); //Chiusura del socket di ascolto, non più necessario sock_in = established.getInputStream(); sock_out = established.getOutputStream(); while(true) { /* * Visualizzazione dei caratteri ricevuti * fino alla fine del messaggio, caratterizzato * dal codice del tasto [INVIO] */ System.out.print(remotePrompt); while((c = sock_in.read()) != 13) System.out.print((char) c); // Ritorno a capo System.out.println(); /* * Visualizzazione della richiesta di input * e lettura e invio dei caratteri fino * alla pressione di [INVIO] */ System.out.print(localPrompt); while((c = System.in.read()) != 10) sock_out.write((int) c); } //established.close(); // codice irraggiungibile a causa del while(true) } catch(IOException e) {} } }


Client - Chat_c.java
code:
import java.net.*; import java.io.*; class Chat_c { public static void main(String args[]) { int c; String localPrompt = "Local> ", // Richiesta di input remotePrompt = "Remote> "; // Visualizzazione dei caratteri ricevuti Socket connection; // Socket di connessione col server InputStream sock_in; // Stream di input del Socket OutputStream sock_out; // Stream di output del Socket System.out.println("Client avviato"); try { // Tentativo di connessione col server connection = new Socket("localhost", 6000); sock_in = connection.getInputStream(); sock_out = connection.getOutputStream(); while(true) { /* * Visualizzazione della richiesta di input * e lettura e invio dei caratteri fino * alla pressione di [INVIO] */ System.out.print(localPrompt); while((c = System.in.read()) != 10) sock_out.write((int) c); /* * Visualizzazione dei caratteri ricevuti * fino alla fine del messaggio, caratterizzato * dal codice del tasto [INVIO] */ System.out.print(remotePrompt); while((c = sock_in.read()) != 13) System.out.print((char) c); // Ritorno a capo System.out.println(); } // connession.close(); // codice irraggiungibile a causa del while(true) } catch(IOException e) {} } }


:)

Se vi doveste chiedere: "Ma come, il ciclo di input termina con la lettura di 10 e il ciclo di ricezione dal socket termina col 13?"

Il tasto INVIO equivale a 2 codici ascii, 13 e 10 (carriage return e line feed, o il contrario, non ricordo). Quando si preme INVIO, il carattere 10 viene inviato sulla connessione e il 13 termina il ciclo.

Quindi, dall'altra parte, il messaggio ricevuto terminerà con il 10 :)

m735
Ma il prof a lezione ha detto che è troppo complicato questo codice... che lui non può correggere 200 compiti così...
lo ignoriamo?

Lunik
ma non è stato gfp (non chiamatelo MAI PROF!!!!) a darvi questo esercizio??

mayetta
il codice di futurbaggio è stato definito troppo complicato per quello che in realtà è stato richiesto. credo che il mio e quello di yeah si avvicinino di più alla soluzione corretta.... credo :asd:

Irdwins
Ma i vostri li avete postati?

mayetta
Originally posted by Irdwins
Ma i vostri li avete postati?


Intervento del moderatore
prima di postare messaggi inutili è meglio leggere T U T T O il thread. se l'avessi fatto avresti scoperto che, sì, abbiamo postato i nostri codici. per favore cerchiamo di non riempire questo forum di messaggi senza senso: leggete bene e solo dopo postate! grazie.

gfp
>Ma il prof a lezione ha detto che è troppo complicato questo codice...
>che lui non può correggere 200 compiti così... lo ignoriamo?

Confermo quanto detto a lezione: soluzioni semplici, senza fronzoli,
usando solo le primitive di base-base-base-base-base-base-base, etc.

Sono felice se alcuni di voi si dilettano di input bufferizzato, di gestione
di eccezioni esotiche, di controllo di condizioni che si verificano solo e
tutt'al più la notte di Halloween, etc. La loro arte raffinata sarebbe
oltremodo utile per un corso di Software Engineering. Ma qui siamo nel
corso di Reti: qualunque dettaglio che oscuri l'obbiettivo principale (che è
poi quello di imparare a mettere in fila, nell'ordine giusto, le primitive per la
manipolazione delle socket) è ridondante per me, e potenzialmente
pericoloso e frustrante per i non aficionados, i quali potrebbero essere
portati a credere che, senza conoscere i dettagli suddetti, l'esame non si
passa. All'esame di guida si richiede che il candidato mostri di saper
cambiare dalla prima alla seconda e dalla seconda alla prima (possibilmente
senza "grattare"), di saper curvare a destra e a sinistra, e di saper
parcheggiare lungo il marciapiedi in uno spazio libero di lunghezza doppia
rispetto a quella dell'autovettura. I parcheggi in derapata in uno spazio
minore della lunghezza della vettura, i sorpassi in curva e a marcia indietro,
etc. non costituiscono materia di esame. Chi li sa fare, li faccia pure, nella
sua vita privata, ma per favore non sia così perfido da postarne un filmato
in questo sito...

Lo dico e lo ripeto: quanto presentato finora a lezione, e nello stile di
programmazione iperspartano che ho usato a lezione, basta e avanza
per superare l'esame di Laboratorio (parte Java con stream socket -
ancora dobbiamo vedere la parte di Java con datagram socket, e le
corrispondenti parti C, ovviamente). Ogni divagazione che vada al di là
di quanto sopra, è tutto tempo prezioso sottratto ad altre attività assai
più remunerative (ivi incluso lo studio di quella che chiamate "la teoria"...).

gfp
Il codice postato da Yeah il giorno 11-10-2004 alle 20:24
(l'ultimo post di pagina 1 di questo thread) è quello che più
si avvicina allo spirito del corso, e a ciò che mi aspetto da voi.

Esteticamente parlando, l'unico particolare che avrei
migliorato è il trattamento dei caratteri ASCII 10 e 13.
Anzitutto avrei introdotto due variabili per rappresentarli,
e poi avrei fatto di tutto per rimuovere la dissimmetria
che essi inducono nel codice. Ma qui stiamo discutendo
della differenza tra 30 e lode e 30 e superlode... ;-)

gfp
>il codice di futurbaggio è stato definito troppo complicato per quello che
>in realtà è stato richiesto. credo che il mio e quello di yeah si avvicinino
>di più alla soluzione corretta.... credo

Nel tuo codice, a parte dettagli del second'ordine, avrei preferito se tu
non avessi usato il metodo readline() e la sua classe di appartenenza,
usando invece una semplice read()

Inoltre, faccio presente che "la soluzione corretta" non esiste. [Almeno
nella programmazione, cercate di mettere da parte il senso del peccato
che ci è stato inculcato da piccoli in quasi tutti noi sudeuropei...] Esistono
solo soluzioni e non-soluzioni. Tra le prime, alcune sono più gradite di
altre. Il gradimento è dipendente dal contesto in cui ci si trova a operare.
Ciò che è gradito a Reti potrebbe non esserlo a Software Engineering, e
viceversa. Per il corso di Reti, i principi cui ispirarsi sono due:

1. Tutto quello che non c'è non si rompe.

2. La migliore soluzione non è quella in cui non c'è più nulla da
aggiungere, ma quella in cui non c'è più nulla da togliere.

Francesko
chiedo scusa ma sono nel panico...
ho compilato il codice postato da yeah (l'ultimo post di pagina 1 di questo thread) e funge.
poi devo eseguire prima chat_s.java e poi chat_c.java, giusto? solo che quando li avvio mi appaiono rispettivamente due messaggi con scritto "server avviato" e "client avviato" e poi devo chiudere perchè non posso fare più niente.
forse è per il fatto che il mio pc non è in rete? io ho copiato e incollato il codice di yeah pari pari...
aiuto!

yeah
Non afferro appieno come fai a eseguire server e client :)
Mi pare di capire che cerchi di farli andare insieme sulla stessa riga di comando.

Io faccio così:
ci vogliono due prompt dei comandi.

- nel primo scrivo
"java Chat_s"

- nel secondo
"Java Chat_c"

E' importante fare andare prima il server e poi il client, se fai il contrario il client esce senza fare nulla :)

Una volta che i due programmi sono partiti (qualche istante dopo i messaggi di "... avviato") sul server compare "Remote> " e sul client compare "Local> ".

"Local>" identifica dove si deve scrivere. Una volta inviato il messaggio tale apparirà sull'altro programma dopo un "Remote> "


:cool:

Francesko
ma infatti io faccio come te!! solo che dopo che eseguo Chat_s mi appare la scritta "server avviato" e poi si blocca, non appare nessuna scritta, non posso fare più niente e quindi devo chiudere tutto... mah!! :sad:

yeah
Ma java non era fatto per essere più portabile del C? :)

Sicuro che avvii prima il server (Chat_s) e poi il client Chat_c?

Se avvii solo il server questo si blocca sulla riga che visualizza, aspettando la connessione del client.

Francesko
io avvio prima il server, ma il client non riesco ad avviarlo perchè dopo che avvio il server mi rimane la scritta "server avviato" e non riesco più a fare nulla... va beh, ci rinuncio... grazie comunque!!

yeah
Allora scusa, ma davvero usi un prompt solo :), per forza non riesci ad usarlo.

Apri 2 diversi prompt, su uno avvii il server e sull'altro il client

boban
Originally posted by yeah
Ecco la mia versione di questo esercizio:

Server - Chat_s.java
code:
import java.net.*; import java.io.*; class Chat_s { public static void main(String args[]) { int c; String localPrompt = "Local> ", // richiesta di input remotePrompt = "Remote> "; // visualizzazione dei caratteri ricevuti ServerSocket listener; // socket di accettazione delle connessioni Socket established; // socket della connessione accettata InputStream sock_in; // Stream di input del Socket OutputStream sock_out; // Stream di output del Socket System.out.println("Server avviato"); try { // Apertura del socket di ascolto listener = new ServerSocket(6000, 300); established = listener.accept(); //connessione accettata listener.close(); //Chiusura del socket di ascolto, non più necessario sock_in = established.getInputStream(); sock_out = established.getOutputStream(); while(true) { /* * Visualizzazione dei caratteri ricevuti * fino alla fine del messaggio, caratterizzato * dal codice del tasto [INVIO] */ System.out.print(remotePrompt); while((c = sock_in.read()) != 13) System.out.print((char) c); // Ritorno a capo System.out.println(); /* * Visualizzazione della richiesta di input * e lettura e invio dei caratteri fino * alla pressione di [INVIO] */ System.out.print(localPrompt); while((c = System.in.read()) != 10) sock_out.write((int) c); } //established.close(); // codice irraggiungibile a causa del while(true) } catch(IOException e) {} } }


Client - Chat_c.java
code:
import java.net.*; import java.io.*; class Chat_c { public static void main(String args[]) { int c; String localPrompt = "Local> ", // Richiesta di input remotePrompt = "Remote> "; // Visualizzazione dei caratteri ricevuti Socket connection; // Socket di connessione col server InputStream sock_in; // Stream di input del Socket OutputStream sock_out; // Stream di output del Socket System.out.println("Client avviato"); try { // Tentativo di connessione col server connection = new Socket("localhost", 6000); sock_in = connection.getInputStream(); sock_out = connection.getOutputStream(); while(true) { /* * Visualizzazione della richiesta di input * e lettura e invio dei caratteri fino * alla pressione di [INVIO] */ System.out.print(localPrompt); while((c = System.in.read()) != 10) sock_out.write((int) c); /* * Visualizzazione dei caratteri ricevuti * fino alla fine del messaggio, caratterizzato * dal codice del tasto [INVIO] */ System.out.print(remotePrompt); while((c = sock_in.read()) != 13) System.out.print((char) c); // Ritorno a capo System.out.println(); } // connession.close(); // codice irraggiungibile a causa del while(true) } catch(IOException e) {} } }


:)

Se vi doveste chiedere: "Ma come, il ciclo di input termina con la lettura di 10 e il ciclo di ricezione dal socket termina col 13?"

Il tasto INVIO equivale a 2 codici ascii, 13 e 10 (carriage return e line feed, o il contrario, non ricordo). Quando si preme INVIO, il carattere 10 viene inviato sulla connessione e il 13 termina il ciclo.

Quindi, dall'altra parte, il messaggio ricevuto terminerà con il 10 :)


Ho provato a compilare il tuo codice...compilo il server e tutto ok--attende..poi il client e mi da questo errore:

Exception in thread "main" java.net.ConnectException: Connection refused: connec
t
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:305)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:171)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:158)
at java.net.Socket.connect(Socket.java:452)
at java.net.Socket.connect(Socket.java:402)
at java.net.Socket.<init>(Socket.java:309)
at java.net.Socket.<init>(Socket.java:124)
at Client.main(Client.java:12)

Che significa???Help!!!
Cosa devo fare??

yeah
L'unico modo per ottenere il tuo stesso errore è stato aggiungere e.printStackTrace() tra le graffe del catch e passare un indirizzo sbagliato al costruttore della Socket, dove c'è
code:
connection = new Socket("localhost", 6000);


In questo caso ho aggiunto uno spazio dopo 'localhost'.


Magari hai scritto male quella riga?
Oppure il tuo firewall blocca il tentativo di connessione del client, senza avvisarti?

:ciao:

boban
ho già controllato e ricontrollato quella riga ma nulla....
ti posto il mio cod, è un po diverso dal tuo, ma molto molto simile....
poi ho provato anche a compilare il tuo codice uguale uguale e mi da un problemino...quando compilo il Client(dopo il programma Server) mi compare Client avviato e non mi stampa a video Local>...per poter digitare...esce e basta....
....cmq questo è il miio cod...gli puoi dare un'occhaitaGRAZIE!!


code:
import java.io.*; import java.net.*; class Client { public static void main (String args[]) throws Exception { Socket connection; InputStream Sock_in; OutputStream Sock_out; int c; connection = new Socket("localhost", 6000); System.out.println("Stabilita la connessione"); Sock_in = connection.getInputStream();//Sock_in è di tipo InputStream (=stream di dati in ingresso) Sock_out = connection.getOutputStream();//Sock_out è di tipo OutputStream (=stream di dati in uscita) while (System.in.read() != 10){ System.out.println("Io:"); c = System.in.read(); Sock_out.write((int) c);//che fa??sto metodo? } while (Sock_in.read() != 13){ System.out.println("Server:"+(char)Sock_in.read()); } System.out.println(); connection.close(); } }

yeah
L'unico altro modo in cui sono riuscito a replicare l'errore del tuo post precedente è usare due porte diverse nel client e nel server.

Ho poi provato il tuo codice e grosso modo funziona.

Puoi postare anche il codice del server che usi quando, usando il mio codice per il client, ti da il problema di "Client avviato" e poi più nulla?

Anzi, prima fai un'altra prova. Sono solito omettere vari controlli quando scrivo codice alla buona: nel server e nel client, tra le graffe che seguono la catch() metti

e.printStackTrace();

Probabilmente si verifica una eccezione dopo che il client viene avviato.

boban
Ho aggiunto la riga che mi hai detto (al tuo codice, sia al server che client) e....è esattamente questo il risultato (come mi dicevi mi da questa eccezione--molto simile a quella che mi da col mio codice):

Client avviato
java.net.ConnectException: Connection refused: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:305)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:171)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:158)
at java.net.Socket.connect(Socket.java:452)
at java.net.Socket.connect(Socket.java:402)
at java.net.Socket.<init>(Socket.java:309)
at java.net.Socket.<init>(Socket.java:124)
at Chat_c.main(Chat_c.java:23)

Perchè non si vuole connettere?????????????
:?:?:?:?:?:?:?:?:?:?:?:(:(:(:(:?:?:?:?:?:?

papousek
boban...quante volte ti ho detto di cambiare i criceti nel tuo PC!!!!

yeah
Allora il problema è della socket.
O:
1) Server e client usano 2 porte diverse
2) Qualcosa (es il firewall) blocca la connessione
3) Avvii il client prima che il server sia pronto a ricevere connessioni (dovrebbe essere possibile solo se avvii il client prima del server, ma non mi sembra tu faccia così)


4) Sei terribilmente sfortunato


Se l'opzione è la 4a, riposta il codice di client e server che lo provo sul mio e vedo se a me funziona

[edit] Post 2^9 :cool:

boban
Originally posted by yeah
Allora il problema è della socket.
O:
1) Server e client usano 2 porte diverse
2) Qualcosa (es il firewall) blocca la connessione
3) Avvii il client prima che il server sia pronto a ricevere connessioni (dovrebbe essere possibile solo se avvii il client prima del server, ma non mi sembra tu faccia così)
4) Sei terribilmente sfortunato



Se l'opzione fosse la 2° che dovrei fare?
...va beh cmq, in attesa...inizio col postarti il mio cod e grazie...

Client.java
code:
import java.io.*; import java.net.*; class Client { public static void main (String args[]) throws Exception { Socket connection; InputStream Sock_in; OutputStream Sock_out; int c; connection = new Socket("localhost", 6000); System.out.println("Stabilita la connessione"); Sock_in = connection.getInputStream();//Sock_in è di tipo InputStream (=stream di dati in ingresso) Sock_out = connection.getOutputStream();//Sock_out è di tipo OutputStream (=stream di dati in uscita) while (System.in.read() != 10){ System.out.println("Io:"); c = System.in.read(); Sock_out.write((int) c); } while (Sock_in.read() != 13){ System.out.println("Server:"+(char)Sock_in.read()); } System.out.println(); connection.close(); } }

Server.java
code:
import java.io.*; import java.net.*; class Server { public static void main (String args[]) throws Exception { ServerSocket Connessione; Socket Conn; InputStream Sock_out; OutputStream Sock_in; int c; Connessione = new ServerSocket(6000, 300); Conn = Connessione.accept(); Connessione.close(); System.out.println("Stabilita la connessione"); Sock_out = Conn.getInputStream();//Sock_out è di tipo InputStream (=stream di dati in ingresso) Sock_in = Conn.getOutputStream();//Sock_in è di tipo OutputStream (=stream di dati in uscita) while (Sock_out.read() != 13){ System.out.println("Client:"+(char)Sock_out.read()); } while (System.in.read() != 10){ c = System.in.read(); System.out.println("Server:"); Sock_in.write((int) c); } System.out.println(); Conn.close(); } }


GRAZIE!!:)

yeah
A me funziona senza problemi.
La (2) sembrerebbe quindi essere il problema.

Prova a disattivare il firewall :)

Tanto per andare sul sicuro, non è che per caso hai una scheda madre Asus con chipset NForce3? Perchè, se non ricordo male, potresti avere un firewall hardware.

boban
Originally posted by yeah
A me funziona senza problemi.
La (2) sembrerebbe quindi essere il problema.

Prova a disattivare il firewall :)

Tanto per andare sul sicuro, non è che per caso hai una scheda madre Asus con chipset NForce3? Perchè, se non ricordo male, potresti avere un firewall hardware.


Scusa l'ignoranza, ma non so ne cosa sia il firewall, ne come fare a disattivarlo....:?
e la mia scheda madre è un AsusA7V880:D.
grazie ancora

yeah
Il firewall è quel programma che fra le altre cose controlla i pacchetti in entrata e in uscita sulle tue connessioni di rete.

Che so, hai Norton Internet Security, Zone Alarm, Kerio Personal Firewall?

In caso affermativo disattivalo :)

boban
macchè....stessa eccezione....non so più che fare, ne a chi chiedere....mah?!?
:?:?:?

BadPinguin pensaci tu!!:D

rox102
Anche io non riesco a far funzionare Chat_c e Chat_s... li apro su due diversi prompt e prima il Server... ma ho sempre il seguente mex:

java.lang.NoClassDefFoundError: ser Exception in thread "main"

Qualcuno puo' aiutarmi??

R

rox102
Ho risolto! Quando si fa 'java nomefile' non si deve mettere l'estensione .java!!!

R

papousek
lol

papousek
problema risolto!!!

Powered by: vbHome (lite) v4.1 and vBulletin v2.3.1 - Copyright ©2000 - 2002, Jelsoft Enterprises Limited
Mantained by dsy crew (email) | Collabora con noi | Segnalaci un bug | Archive | Regolamento |Licenze | Thanks | Syndacate