PDA

View Full Version : server e client in Java...Help


SteR9
11-11-2003, 19:54
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

cn73
12-11-2003, 09:34
Il codice mi pare corretto... Personalmente l'ho provato e funziona... che jdk usi?? Che Sistema Operativo?

SteR9
12-11-2003, 13:31
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ò...

Molz
12-11-2003, 13:59
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));

cn73
12-11-2003, 16:07
Ovviamente lanci il client e il server da due console separate giusto?

SteR9
12-11-2003, 16:38
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...

SteR9
12-11-2003, 16:39
Originariamente inviato da cn73
Ovviamente lanci il client e il server da due console separate giusto?
si ovviamente uso due console diverse :)

cn73
12-11-2003, 17:58
firewall??

SteR9
12-11-2003, 18:11
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...

cn73
12-11-2003, 20:56
Non so, prova a cambiare porta! e mettere della System.out di debug x capire qual è il pezzo che nn esegue...

SteR9
13-11-2003, 16:26
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:

cn73
13-11-2003, 16:43
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!

SteR9
13-11-2003, 18:39
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?!

cn73
13-11-2003, 20:01
Veramente io ho copiato ed incollato il tuo aggiungendo delle System.out :D

SteR9
13-11-2003, 20:20
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!

SteR9
14-11-2003, 17:53
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

SteR9
18-11-2003, 22:33
UP :rolleyes:

recoil
18-11-2003, 23:18
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

cn73
19-11-2003, 10:51
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.

SteR9
19-11-2003, 17:01
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:

recoil
19-11-2003, 17:06
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())

SteR9
19-11-2003, 17:47
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??

cn73
20-11-2003, 09:51
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...