View Full Version : server e client in Java...Help
allora ho questo server...
import java.io.*;
import java.net.*;
public class server {
public static void main(String args[]) {
ServerSocket echoServer = null;
String line;
DataInputStream is;
Socket clientSocket = null;
PrintStream os = null;
try {
echoServer = new ServerSocket(9999);
}
catch (IOException e) {
System.out.println(e);
}
try {
clientSocket = echoServer.accept();
is = new DataInputStream(clientSocket.getInputStream());
os = new PrintStream(clientSocket.getOutputStream());
while (true) {
line = is.readLine();
System.out.print(line);
os.println("c");
}
}
catch (IOException e) {
System.out.println(e);
}
}
}
e questo è il client
import java.io.*;
import java.net.*;
import javax.swing.*;
public class client1 {
public static void main(String[] args) {
Socket smtpSocket = null;
PrintStream os = null;
DataInputStream is = null;
String mess;
try {
smtpSocket = new Socket("localhost", 9999);
os = new PrintStream(smtpSocket.getOutputStream());
is = new DataInputStream(smtpSocket.getInputStream());
} catch (UnknownHostException e) {
System.err.println("Don't know about host: hostname");
} catch (IOException e) {
System.err.println("Couldn't get I/O for the connection to: hostname");
}
if (smtpSocket != null && os != null && is != null) {
try {
os.println("ciao");
String responseLine;
while ((responseLine = is.readLine()) != null) {
System.out.println("Server: " + responseLine);
if (responseLine.indexOf("Ok") != -1) {
break;
}
}
os.close();
is.close();
smtpSocket.close();
} catch (UnknownHostException e) {
System.err.println("Trying to connect to unknown host: " + e);
} catch (IOException e) {
System.err.println("IOException: " + e);
}
}
}
}
il mio problema è che dal client a inviare al server riesco ma non riesco a ricevere dal client ciò che gli invia il server...come mai??cosa c'è che non va?
grazie
Il codice mi pare corretto... Personalmente l'ho provato e funziona... che jdk usi?? Che Sistema Operativo?
Originariamente inviato da cn73
Il codice mi pare corretto... Personalmente l'ho provato e funziona... che jdk usi?? Che Sistema Operativo?
uso la 1.4.2_01....
infatti anche a me sembra corretto...
non è che c'è un bug in questa versione???dubito però...
Lo ho compilato e mi funziona
Cmq con qella versione il metodo readLine() di java.io.DataInputStream è deprecato.
Prova a sostituirlo.
Nel tutorial delle API di Sun c'è scritto di sostituire
DataInputStream d = new DataInputStream(in);
con
BufferedReader d = new BufferedReader(new InputStreamReader(in));
Ovviamente lanci il client e il server da due console separate giusto?
Originariamente inviato da Molz
Lo ho compilato e mi funziona
Cmq con qella versione il metodo readLine() di java.io.DataInputStream è deprecato.
Prova a sostituirlo.
Nel tutorial delle API di Sun c'è scritto di sostituire
DataInputStream d = new DataInputStream(in);
con
BufferedReader d = new BufferedReader(new InputStreamReader(in));
l'avevo lettoanche io questo ma non cambiava niente...cmq dal client se provo a connettermi ad un altro server mi legge ciò che mi manda il server...non va solo dal mio client...
Originariamente inviato da cn73
Ovviamente lanci il client e il server da due console separate giusto?
si ovviamente uso due console diverse :)
Originariamente inviato da cn73
firewall??
no,non ho firewall :muro: :muro:
non riesco proprio a capire perchè non funziona ho riprovato ancora con BufferedReader ma non va...
Non so, prova a cambiare porta! e mettere della System.out di debug x capire qual è il pezzo che nn esegue...
Originariamente inviato da cn73
Non so, prova a cambiare porta! e mettere della System.out di debug x capire qual è il pezzo che nn esegue...
niente non va nemmeno cambiando la porta...che System.out potrei mettere?
:muro: :muro: :muro:
Una cosa del genere:
import java.io.*;
import java.net.*;
import javax.swing.*;
public class MyClient {
public static void main(String[] args) {
Socket smtpSocket = null;
PrintStream os = null;
DataInputStream is = null;
String mess;
try {
smtpSocket = new Socket("xxxx", 10000);
os = new PrintStream(smtpSocket.getOutputStream());
is = new DataInputStream(smtpSocket.getInputStream());
} catch (UnknownHostException e) {
System.err.println("Don't know about host: hostname");
} catch (IOException e) {
System.err.println("Couldn't get I/O for the connection to: hostname");
}
if (smtpSocket != null && os != null && is != null) {
try {
os.println("Messaggio al server: mi sono collegato!");
String responseLine;
while ((responseLine = is.readLine()) != null) {
System.out.println("Server: " + responseLine);
if (responseLine.indexOf("Ok") != -1) {
break;
}
}
os.close();
is.close();
smtpSocket.close();
} catch (UnknownHostException e) {
System.err.println("Trying to connect to unknown host: " + e);
} catch (IOException e) {
System.err.println("IOException: " + e);
}
}
}
}
e poi
import java.io.*;
import java.net.*;
public class MyServer {
public static void main(String args[]) {
ServerSocket echoServer = null;
String line;
DataInputStream is;
Socket clientSocket = null;
PrintStream os = null;
try {
echoServer = new ServerSocket(9999);
System.out.println("Creato il ServerSocket: " + echoServer);
}
catch (IOException e) {
System.out.println(e);
}
try {
clientSocket = echoServer.accept();
System.out.println("Creato il ClientSocket: " + clientSocket);
is = new DataInputStream(clientSocket.getInputStream());
os = new PrintStream(clientSocket.getOutputStream());
while (true) {
line = is.readLine();
System.out.print(line);
os.println("Benvenuto client " + clientSocket);
}
}
catch (IOException e) {
System.out.println(e);
}
}
}
Riporta esattamente quanto viene scritto in console!
questo è il client Server: Benvenuto client Socket[addr=/indirizzoIp,port=1365,localport=9999]
e questo il server
Creato il ServerSocket: ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=9999]
Creato il ClientSocket: Socket[addr=/indirizzoIp,port=1365,localport=9999]
Messaggio al server: mi sono collegato!
quindi sembrerebbe funzionare!
perchè il mio non andava?!
Veramente io ho copiato ed incollato il tuo aggiungendo delle System.out :D
Originariamente inviato da cn73
Veramente io ho copiato ed incollato il tuo aggiungendo delle System.out :D
mah....è un mistero :muro:
vabbè tutto è bene ciò che finisce bene :sofico:
grazie!
due domande :)
allora ho provato a fare una cosa così
line = is.readLine();
if (line == "ciao"){
System.out.print(line);
os.println("ciao client ");
}
però nn funziona...come mai?non posso fare il confronto fra stringhe in questa maniera??
un'altra cosa...come mai se io vado a inviare con os.println quando lo stampo dal server nn va a capo??
grazie
Originariamente inviato da SteR9
due domande :)
allora ho provato a fare una cosa così
line = is.readLine();
if (line == "ciao"){
System.out.print(line);
os.println("ciao client ");
}
però nn funziona...come mai?non posso fare il confronto fra stringhe in questa maniera??
un'altra cosa...come mai se io vado a inviare con os.println quando lo stampo dal server nn va a capo??
grazie
la stringa non è un tipo di dato primitivo quindi non puoi fare il confronto con == ma devi usare dei metodi. la classe String ne ha uno che si chiama equals
s.equals("ciao") restituisce true se la variabile s è "ciao" e false negli altri casi
Scusa non mi connettevo da un po'! La soluzione ti è stata già postata... Il tuo è un errore comune, non preoccuparti :D
La classe String offre numerosi metodi, dai un occhio alla documentazione (se l'avessi fatto non avresti postato questa domanda ;))
Approfitto per spiegarti perchè non funziona il confronto con ==.
String mia_stringa = "Marco".
quando fai questa dichiarazione viene allocata una zona di memoria con un certo indirizzo, puntata da mia_stringa. Praticamente mia:stringa è una variabile che contiene un valore numerico che indica la zona di memoria che contiene "Marco".
Se tu fai il cofronto mia_stringa == "Marco" ti darà quindi sempre false!
Lo stesso se dichiari
String mia_stringa2 = "Marco" e poi fai il confronto
mia_stringa2 == mia_stringa
diverso se tu dichiari:
String mia_stringa2 = mia_stringa.
Questo perchè assegni al puntatore mia_stringa2 lo stesso calore che contiene mia_stringa e punteranno alla stessa zona di memoria.
avevo già provato con equals...ma nn va...
while (true) {
line = is.readLine();
if ( line.equals("ciao") == true){
System.out.print(line);
os.println("Benvenuto client " + clientSocket);
}
}
ho provato sia con = che == ma nn va...con == compila ma non va mentre con = mida errore in compilazione...
dove sbaglio??:muro:
ho rivisto il codice e ho notato che usi DataInputStream per la lettura della stringa.
tuttavia la documentazione di J2SE sconsiglia di utilizzare DataInputStream per leggere una stringa con il metodo readline()
per farlo è meglio utilizzare BufferedReader. i dettagli li trovi naturalmente nella documentazione di cui ti parlavo cmq BufferedReader ha un construttore che accetta InputStreamReader il quale a sua volta accetta InputStream.
dovresti fare una cosa del tipo
BufferedReader lettore = new BufferedReader(new InputStreamReader(socket.getInputStream())
Originariamente inviato da recoil
ho rivisto il codice e ho notato che usi DataInputStream per la lettura della stringa.
tuttavia la documentazione di J2SE sconsiglia di utilizzare DataInputStream per leggere una stringa con il metodo readline()
per farlo è meglio utilizzare BufferedReader. i dettagli li trovi naturalmente nella documentazione di cui ti parlavo cmq BufferedReader ha un construttore che accetta InputStreamReader il quale a sua volta accetta InputStream.
dovresti fare una cosa del tipo
BufferedReader lettore = new BufferedReader(new InputStreamReader(socket.getInputStream())
si lo so però visto che funziona anche così ho tenuto questo...tanto ora sto facendo solo delle prove :)
cmq per confrontare la stringa come faccio??
xxx.equals(yyyy) restituisce un booleano, non c'è bisogno di testare == true (anche se non è scorretto). Se il test è false significa che xxx non è uguale sintatticamente a yyy, di li non scappi... fai delle System.out di xxx e yyy...
Può darsi che ci sia qualche carattere di formattazione alla fine della stringa, tipo "\n" l'a capo...
Per confrontare le stringhe e capire cosa capita puoi usare altri metodi, tipo xxx.compareTo(yyy) che restituisce un intero > 0 se xxx > yyy , < 0 se xxx < yyy e = 0 se sono uguali...
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.