|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Mar 2004
Messaggi: 1118
|
[java]problemi con semplice programmino client server
Vorrei fare un piccolo programma client-server in cui un client,una volta connesso,invia stringhe di testo lette da tastiera al server fino a quando non digito una particolare stringa
Ecco i codici di client e server Server Codice:
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author giovanni
*/
public class Server {
public static void main(String args[]) {
ServerSocket ss = null;
Socket cs = null;
DataOutputStream dos = null;
try {
ss = new ServerSocket(22222);
while (true) {
System.out.println("Server in attesa di richieste...");
cs = ss.accept();
System.out.println("Un client si e' connesso...");
InputStream is = cs.getInputStream();
BufferedReader dis = new BufferedReader(new InputStreamReader(is));
System.out.println("Risposta del server: " + dis.readLine());
}
} catch (IOException ex) {
Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
Codice:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author giovanni
*/
public class Client {
public static void main (String args[]) {
System.out.println("client");
Socket s = null;
String ss = new String();
InputStreamReader i = new InputStreamReader(System.in);
BufferedReader b = new BufferedReader(i);
try {
s = new Socket("localhost", 22222);
OutputStream s1out = s.getOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s1out));
while( ss == null ? "quit" != null : !ss.equals("quit"))
{
ss = b.readLine();
bw.write(ss);
}
s.close();
} catch (UnknownHostException ex) {
Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
Grazie |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2787
|
Quali sarebbero i problemi?
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Mar 2004
Messaggi: 1118
|
ops,ho dimenticato di scrivere il problema
il server non riceve i messaggi dal client,riceve solo un null quando il client si disconnette |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Dec 2006
Messaggi: 314
|
Sei sicuro di poter utilizzare i BufferedReader e Writer per leggere e scrivere stream di byte da socket?
__________________
Athlon64 x2 5600 - AsRock ALiveNF5eSata2+ - kingston 2GB ddr2 800 - GeForce 8800gts 320MB |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Sep 2004
Città: Cosenza
Messaggi: 2971
|
come immaginavi, è un problema molto semplice.
il "b.readline()" ritorna una stringa SENZA fine linea ("\n" o "\r" o "\r\n", in base ai diversi sistemi operativi) quindi quando tu mandi la tua stringa al server con "bw.write(ss)", non gli mandi il fine linea, quindi il server, che è in attesa con "din.readline()", resterà in attesa, proprio perchè "readline()" ritorna una stringa solo quando raggiunge il fine linea. quindi la prima cosa da modificare, è appendere uno "\n" alla stringa ss altra piccola cosa, bisogna fare il "flush()" all'output stream per mandare "subito" il messaggio al server. a quel punto il tuo programmino funziona, ma c'è ancora un piccolo problema, ovvero che il server accetta un client, legge una sola riga mandata da questo, e poi esce e si mette in ascolto di un altro client... come risolvere questo, spetta a te |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Quote:
|
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Sep 2004
Città: Cosenza
Messaggi: 2971
|
Quote:
Codice:
ss = new ServerSocket(22222);
while (true) {
System.out.println("Server in attesa di richieste...");
cs = ss.accept();
System.out.println("Un client si e' connesso...");
InputStream is = cs.getInputStream();
BufferedReader dis = new BufferedReader(new InputStreamReader(is));
System.out.println("Risposta del server: " + dis.readLine());
}
è la base da cui partire per rendere il server multiclient... |
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Quote:
|
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Mar 2004
Messaggi: 1118
|
ho modificato il client come mi avete detto ma il risultato non cambia anche se durante un tentativo mi è spuntato qualcosa di diverso da null nel server
ecco il codice del client modificato Codice:
public class Client {
public static void main (String args[]) {
System.out.println("client");
Socket s = null;
String ss = new String();
InputStreamReader i = new InputStreamReader(System.in);
BufferedReader b = new BufferedReader(i);
try {
s = new Socket("localhost", 22222);
OutputStream s1out = s.getOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s1out));
while( ss == null ? "quit" != null : !ss.equals("quit"))
{
ss = b.readLine();
bw.write(ss+"\n\r");
s1out.flush();
}
s.close();
} catch (UnknownHostException ex) {
Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
se mi corregete il codice dato che si tratta di un paio di righe me lo salvo e me lo prendo come riferimento in futuro grazie |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Sep 2004
Città: Cosenza
Messaggi: 2971
|
ecco cosa devi cambiare:
Codice:
bw.write(ss+"\n"); bw.flush(); Ultima modifica di deadlyomen17 : 27-05-2010 alle 16:48. |
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Mar 2004
Messaggi: 1118
|
Quote:
|
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Sep 2004
Città: Cosenza
Messaggi: 2971
|
bene...a questo punto sarebbe interessante renderlo multiclient...un server che serve più client, come avviene normalmente..
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:19.




















