.dsy:it. Pages (3): [1] 2 3 »
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 :)

__________________
?


All times are GMT. The time now is 14:56. Pages (3): [1] 2 3 »
Show all 45 posts from this thread on one page

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