.dsy:it.
Show 150 posts per page

.dsy:it. (http://www.dsy.it/forum/)
- Reti di calcolatori (http://www.dsy.it/forum/forumdisplay.php?forumid=68)
-- [ESERCIZIO] Chat Java (http://www.dsy.it/forum/showthread.php?threadid=13912)


Posted by futurbaggio on 07-10-2004 00:53:

[ESERCIZIO] Chat Java

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

__________________
E lo sceriffo americano non lo sa / ma quando parla ride tutta la città / vile fellone vieni a singolar tenzone / unza unza umpappà troppe truppe mariscià.
Non ci voleva l'eruzione della lava / e due piccioni si contendono la fava / sposa bagnata, bambina svergognata / la questione è delicata / come bolle la patata.
Basta! E' finita la festa
[L'ovile delle vanità, Folkabbestia]


Posted by yeah on 07-10-2004 22:53:

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 ;)

__________________
?


Posted by X-ICEMAN on 08-10-2004 00:30:

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

__________________
Supervisore di xbox.multiplayer.it


Posted by mayetta on 08-10-2004 09:34:

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:

:)


Posted by Francesko on 08-10-2004 10:20:

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?


Posted by yeah on 08-10-2004 12:20:

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.

__________________
?


Posted by CUBA on 09-10-2004 12:35:

Red face Esercizio chat base base base

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


Posted by mayetta on 09-10-2004 12:48:

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


Posted by futurbaggio on 09-10-2004 19:56:

Re: Esercizio chat base base base

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?

__________________
E lo sceriffo americano non lo sa / ma quando parla ride tutta la città / vile fellone vieni a singolar tenzone / unza unza umpappà troppe truppe mariscià.
Non ci voleva l'eruzione della lava / e due piccioni si contendono la fava / sposa bagnata, bambina svergognata / la questione è delicata / come bolle la patata.
Basta! E' finita la festa
[L'ovile delle vanità, Folkabbestia]


Posted by DeepBlue on 10-10-2004 13:31:

Re: Re: Esercizio chat base base base

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 ;)

__________________
~ get Debian! ~ get FreeBSD! ~ get OpenBSD! ~


Posted by m@cCo on 10-10-2004 17:26:

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

Ciao


Posted by m@cCo on 10-10-2004 17:47:

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


Posted by mayetta on 10-10-2004 18:15:

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: ...
....

:)


Posted by 0m4r on 10-10-2004 18:43:

Re: [ESERCIZIO] Chat Java

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)

__________________
http://www.twitter.com/0m4r


Posted by yeah on 11-10-2004 20:24:

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 :)

__________________
?


Posted by m735 on 12-10-2004 18:11:

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

__________________
Killer Coca-Cola

REBOC

www.nococacola.info


Posted by Lunik on 12-10-2004 18:22:

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

__________________
Il DSY su Facebook!!!


Posted by mayetta on 12-10-2004 19:13:

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:


Posted by Irdwins on 14-10-2004 16:19:

Ma i vostri li avete postati?


Posted by mayetta on 14-10-2004 16:28:

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.


Posted by gfp on 14-10-2004 21:50:

>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"...).


Posted by gfp on 14-10-2004 22:19:

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... ;-)


Posted by gfp on 14-10-2004 22:34:

>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.


Posted by Francesko on 27-10-2004 09:31:

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!


Posted by yeah on 27-10-2004 21:12:

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:

__________________
?


Posted by Francesko on 29-10-2004 10:37:

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:


Posted by yeah on 29-10-2004 10:44:

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.

__________________
?


Posted by Francesko on 29-10-2004 11:29:

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!!


Posted by yeah on 29-10-2004 11:35:

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

__________________
?


Posted by boban on 14-03-2005 11:48:

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??


Posted by yeah on 14-03-2005 20:36:

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:

__________________
?


Posted by boban on 15-03-2005 11:17:

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(); } }


Posted by yeah on 15-03-2005 20:56:

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.

__________________
?


Posted by boban on 16-03-2005 12:44:

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?????????????
:?:?:?:?:?:?:?:?:?:?:?:(:(:(:(:?:?:?:?:?:?


Posted by papousek on 16-03-2005 15:50:

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

__________________
Break Out


Posted by yeah on 16-03-2005 20:08:

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:

__________________
?


Posted by boban on 17-03-2005 11:04:

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!!:)


Posted by yeah on 17-03-2005 14:45:

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.

__________________
?


Posted by boban on 17-03-2005 15:46:

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


Posted by yeah on 17-03-2005 19:45:

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 :)

__________________
?


Posted by boban on 18-03-2005 12:30:

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

BadPinguin pensaci tu!!:D


Posted by rox102 on 23-03-2005 14:13:

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


Posted by rox102 on 23-03-2005 14:31:

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

R


Posted by papousek on 23-03-2005 16:38:

lol

__________________
Break Out


Posted by papousek on 25-03-2005 14:32:

problema risolto!!!

__________________
Break Out


All times are GMT. The time now is 12:57.
Show all 45 posts from this thread on one page

Powered by: vBulletin Version 2.3.1
Copyright © Jelsoft Enterprises Limited 2000 - 2002.