Discussione:
[Java] Realizzare una Chat testuale - 2 Client e 1 Server
(troppo vecchio per rispondere)
The.Beat.83
2006-03-25 14:30:33 UTC
Permalink
Ciao a tutti, mi servirebbe un aiuto con un esercizio di reti da
svolgere con Java. Sono alle prime armi sia con Java che con la
programmazione per i socket di rete..

Dovrei realizzare un server che permetta di eseguire un chat testuale
tra due client.
Se non ho capito sbagliato, la parte più importante è il server, che
riceve una stringa da un client e la ridireziona verso l'altro client
collegato.

Attualmente ho disponibile il codice esempio di un client che invia una
stringa alfanumerica verso un server, questo la legge e rimanda il
medesimo messaggio mettendo però le lettere in maiuscolo.
Il client non mi sembra quindi da modificare, perchè la parte di
letture dei dati scritti dall'utente e spedizione verso il server già
la esegue.
Il server di esempio però rimandava la stringa verso il clientr di
partenza, mentre nell'esercizio che devo svolgere, deve rimandarla
all'altro client.
Il client conosce in anticipo l'indirizzo ip del server.
Come posso modificare il codice per far si che si possa fare ciò ?

Metto qui sotto i codici del client e il codice del server che ho come
esempio

"code:SERVER"

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

class TCPServer {

public static void main(String argv[]) throws Exception
{
String clientSentence;
String capitalizedSentence;

ServerSocket welcomeSocket = new ServerSocket(6860);

while(true) {

Socket connectionSocket = welcomeSocket.accept();

System.out.println("connesso con " +
connectionSocket.getInetAddress());

BufferedReader inFromClient =
new BufferedReader(new

InputStreamReader(connectionSocket.getInputStream()));

DataOutputStream outToClient =
new
DataOutputStream(connectionSocket.getOutputStream());

clientSentence = inFromClient.readLine();

System.out.println("FROM CLIENT: " + clientSentence);

capitalizedSentence = clientSentence.toUpperCase() +
'\n';

System.out.println("TO CLIENT: " + capitalizedSentence);


outToClient.writeBytes(capitalizedSentence);
}
}
}



- - - - - - -

" code:CLIENT "


import java.io.*;
import java.net.*;
class TCPClient {

public static void main(String argv[]) throws Exception
{
String sentence;
String modifiedSentence;

BufferedReader inFromUser =
new BufferedReader(new InputStreamReader(System.in));

for (int i=0; i < argv.length; i++)
System.out.println("argv[" + i + "]" + argv[i]);

Socket clientSocket = new Socket(argv[0], 6860);

DataOutputStream outToServer =
new DataOutputStream(clientSocket.getOutputStream());

BufferedReader inFromServer =
new BufferedReader(new
InputStreamReader(clientSocket.getInputStream()));

sentence = inFromUser.readLine();

outToServer.writeBytes(sentence + '\n');

modifiedSentence = inFromServer.readLine();

System.out.println("FROM SERVER: " + modifiedSentence);

clientSocket.close();

}
}
The.Beat.83
2006-03-26 16:52:48 UTC
Permalink
Nessun aiuto ??

Praticamente dovrei fare una cosa del genere

Client 1 scrive qualcosa -> passaggio attaverso il server -> Client 2
legge
Client 2 risponde -> passaggio sempre attraverso il server -> Client 1
legge

Ho visto su vari siti esempi di chat molto complesse, che potevano
accettare un numero di client molto elevato, ed in cui tutti potevano
vedere ciò che un client aveva inviato verso il server. Utilizzavano
la tecnica del multithread, che io non saprei però realizzare...
(purtroppo le mie conoscenze su Java sono abbastanza limitate)

Avendo solo due client connessi, non esiste un sistema più semplice
per realizzare il server di questa piccola "chat a due" ?
Come faccio a reindirizzare quello che ha scritto un client verso
l'altro ?
Stefanomnn
2006-03-26 19:49:54 UTC
Permalink
ciao,
puoi fare cosi:

un client che vuole entrare in chat manda una richiesta al server,
il quale conferma la cosa e avverte l'altro client.

Ogni client dovrebbe essere composto da due thread,
uno che riceve i messaggi dal server, l'altro che li invia.
il serve riceve il messaggio di un client e lo propaga agli altri

un esempio di formato di messaggi in ricezione da parte del client
potrebbe essere

REC_MESS from lunghezzaMessaggio messaggio

NEW_USER nick

DISCONNECTED nick

un esempio di formato dati da inviare al server potrebbe essere:

SEND lunghezzaMessaggio messaggio

spero di averti ato qualche dritta
Dott. Hellboy
2006-03-27 10:43:31 UTC
Permalink
Post by The.Beat.83
Nessun aiuto ??
[CUT]
Post by The.Beat.83
Avendo solo due client connessi, non esiste un sistema più semplice
per realizzare il server di questa piccola "chat a due" ?
Come faccio a reindirizzare quello che ha scritto un client verso
l'altro ?
Per fare quello che devi fare devi per forza usare i Thread.
Il server dovrà avere un thread per ogni utente collegato. A questo
thread dovrai passare il socket. dal socket prendi il comando e invi il
tutto con un socket in uscita verso il client destinatario.
Pure il client deve essere multithread. lui deve avere un thread per
l'invio e uno per l'ascolto.
Io ho fatto un programma analogo. Ora lo sto migliorando e sto creando
un protocollo a linea di comando.
CMQ se vuoi ti posso mandare il mio vecchio progetto (o anche una
anteprima del nuovo).
Ciao
--
Dott. Hellboy
MSN: ***@hotmail.com
IChat: ***@mac.com
http://www.hardboiled.it
The.Beat.83
2006-03-28 11:28:28 UTC
Permalink
Grazie per il chiarimento !!!

Ti ho mandato una mail al tuo indirizzo Gmail, ciao !

Loading...