|
|
|
|
| |
|
futurbaggio |
[ESERCIZIO] Chat Java |
07-10-2004 00:53 |
|
|
futurbaggio |
U Frikkettone
Registered: Feb 2003
Posts: 774 (0.10 al dì)
Location: Foggia
Corso: TIC
Anno: 1° Magistrale
Time Online: 13 Days, 16:44:00: [...]
Status: Offline
Edit | Report | IP: Logged |
[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]
Last edited by mayetta on 09-10-2004 at 12:20
|
07-10-2004 00:53 |
|
|
| |
|
yeah |
Azz! Io l'ho tenuto mooolto più semplice :)
... |
07-10-2004 22:53 |
|
|
yeah |
.grande:maestro.
Registered: Nov 2003
Posts: 1644 (0.21 al dì)
Location: Cologno Monzese
Corso: Informatica Magistrale
Anno: II
Time Online: 12 Days, 21:36:41 [...]
Status: Offline
Edit | Report | IP: Logged |
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
__________________
?
|
07-10-2004 22:53 |
|
|
| |
|
X-ICEMAN |
sigh per me è ancora fuori quota :) ho fatto java ... |
08-10-2004 00:30 |
|
|
X-ICEMAN |
The Chosen One
Registered: Jun 2002
Posts: 332 (0.04 al dì)
Location: Sunnydale
Corso: Comunicazione Digitale
Anno: 2
Time Online: 5 Days, 15:10:20 [...]
Status: Offline
Edit | Report | IP: Logged |
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
|
08-10-2004 00:30 |
|
|
| |
|
Francesko |
scusate l'ignoranza abissale, ma questi sono progr ... |
08-10-2004 10:20 |
|
|
Francesko |
.illuminato.
Registered: Apr 2004
Posts: 216 (0.03 al dì)
Location: milano
Corso:
Anno: 3
Time Online: 4 Days, 20:34:26 [...]
Status: Offline
Edit | Report | IP: Logged |
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?
|
08-10-2004 10:20 |
|
|
| |
|
yeah |
Francesco:
... |
08-10-2004 12:20 |
|
|
yeah |
.grande:maestro.
Registered: Nov 2003
Posts: 1644 (0.21 al dì)
Location: Cologno Monzese
Corso: Informatica Magistrale
Anno: II
Time Online: 12 Days, 21:36:41 [...]
Status: Offline
Edit | Report | IP: Logged |
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.
__________________
?
|
08-10-2004 12:20 |
|
|
| |
|
CUBA |
Esercizio chat base base base |
09-10-2004 12:35 |
|
|
CUBA |
.precettore.
Registered: Mar 2003
Posts: 88 (0.01 al dì)
Location: Seveso (MI)
Corso: TI.COM
Anno: 2
Time Online: 21:10:53 [...]
Status: Offline
Edit | Report | IP: Logged |
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
|
09-10-2004 12:35 |
|
|
| |
|
mayetta |
io credo che lo scopo dell'esercizio fosse dimostr ... |
09-10-2004 12:48 |
|
|
mayetta |
--
Registered: Nov 2001
Posts: 1319 (0.16 al dì)
Location:
Corso:
Anno:
Time Online: 32 Days, 23:40:30 [...]
Status: Offline
Edit | Report | IP: Logged |
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
Last edited by mayetta on 09-10-2004 at 12:57
|
09-10-2004 12:48 |
|
|
| |
|
futurbaggio |
Re: Esercizio chat base base base |
09-10-2004 19:56 |
|
|
futurbaggio |
U Frikkettone
Registered: Feb 2003
Posts: 774 (0.10 al dì)
Location: Foggia
Corso: TIC
Anno: 1° Magistrale
Time Online: 13 Days, 16:44:00: [...]
Status: Offline
Edit | Report | IP: Logged |
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
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]
|
09-10-2004 19:56 |
|
|
| |
|
DeepBlue |
Re: Re: Esercizio chat base base base |
10-10-2004 13:31 |
|
|
DeepBlue |
tired guy
Registered: Sep 2003
Posts: 4258 (0.55 al dì)
Location: CSN
Corso: Info tlc
Anno:
Time Online: 52 Days, 8:40:31 [...]
Status: Offline
Edit | Report | IP: Logged |
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! ~
|
10-10-2004 13:31 |
|
|
| |
|
m@cCo |
Scusate ma come va intesa l'alternanza?
... |
10-10-2004 17:26 |
|
|
m@cCo |
Steek Huzzee
Registered: Sep 2003
Posts: 936 (0.12 al dì)
Location: Trecate - Novara - Piedmont - Italy
Corso: Computer Science (magistrale)
Anno: II
Time Online: 9 Days, 0:20:33 [...]
Status: Offline
Edit | Report | IP: Logged |
Scusate ma come va intesa l'alternanza?
Il server può rispondere al client? O semplicemente restituisce la stessa stringa inserita dal client?
Ciao
|
10-10-2004 17:26 |
|
|
| |
|
m@cCo |
Ma l'alternanza viene eseguita automaticamente dal ... |
10-10-2004 17:47 |
|
|
m@cCo |
Steek Huzzee
Registered: Sep 2003
Posts: 936 (0.12 al dì)
Location: Trecate - Novara - Piedmont - Italy
Corso: Computer Science (magistrale)
Anno: II
Time Online: 9 Days, 0:20:33 [...]
Status: Offline
Edit | Report | IP: Logged |
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
|
10-10-2004 17:47 |
|
|
| |
|
mayetta |
il prof l'ha spiegato così:
... |
10-10-2004 18:15 |
|
|
mayetta |
--
Registered: Nov 2001
Posts: 1319 (0.16 al dì)
Location:
Corso:
Anno:
Time Online: 32 Days, 23:40:30 [...]
Status: Offline
Edit | Report | IP: Logged |
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: ...
....
|
10-10-2004 18:15 |
|
|
| |
|
0m4r |
Re: [ESERCIZIO] Chat Java |
10-10-2004 18:43 |
|
|
0m4r |
.grande:maestro.
Registered: Mar 2002
Posts: 7287 (0.87 al dì)
Location: Düsseldorf (DE)
Corso:
Anno: ESAMI FINITI
Time Online: 49 Days, 0:42:50 [...]
Status: Offline
Edit | Report | IP: Logged |
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
|
10-10-2004 18:43 |
|
|
| |
|
yeah |
Ecco la mia versione di questo esercizio:
... |
11-10-2004 20:24 |
|
|
yeah |
.grande:maestro.
Registered: Nov 2003
Posts: 1644 (0.21 al dì)
Location: Cologno Monzese
Corso: Informatica Magistrale
Anno: II
Time Online: 12 Days, 21:36:41 [...]
Status: Offline
Edit | Report | IP: Logged |
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
__________________
?
|
11-10-2004 20:24 |
|
|
| |
|
All times are GMT. The time now is 15:55. |
|
|
|
|
|
|
|
| |
Forum Rules:
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
|
HTML code is OFF
vB code is ON
Smilies are ON
[IMG] code is ON
|
|
|
|
|
|