Newsgroup: it.comp.java
Titolo: Client e Server

Sto leggendo un manuale su come programmare in Java, e sono arrivato al
capito sul networking.
Ho copiato dal manuale i seguenti due programmi, ma non riesco a farli
funzionare, in che ordine devo eseguirli?
Posso lanciare i programmi dall'interno di Eclipse o devo lanciarli da
riga di comando del DOS?
********** SimpleServer.java **********
package simpleServer;
import java.net.*;
import java.io.*;
public class SimpleServer {
   /**
    * @param args
    */
   public static void main(String[] args) {
  // TODO Auto-generated method stub
 ServerSocket s=null;
 try
 {
  s=new ServerSocket(9999);
  System.out.println("Server avviato, in ascolto"+
   "sulla porta 9999");
 }
 catch (IOException exc)
 {
  System.out.println(exc.toString());
 }
 while (true)
 {
  try
  {
   Socket s1=s.accept();
   OutputStream s1out=s1.getOutputStream();
   BufferedWriter bw=new BufferedWriter
    (new OutputStreamWriter(s1out));
   bw.write("Ciao client sono il server.");
   System.out.println("Messaggio spedito a "+
    s1.getInetAddress());
   bw.close();
   s1.close();
  }
  catch (Exception exc)
  {
   System.out.println(exc.toString());
  }
 }
}
}
********** SimpleClient.java **********
package simpleClient;
import java.net.*;
import java.io.*;
public class SimpleClient {
   /**
    * @param args
    */
   public static void main(String[] args) {
 // TODO Auto-generated method stub
 try
 {
  String host="127.0.0.1";
  Socket s=new Socket(host,9999);
  BufferedReader br=new BufferedReader
   (new InputStreamReader(s.getInputStream()));
  System.out.println(br.readLine());
  br.close();
  s.close();
 }
 catch (Exception exc)
 {
  System.out.println(exc.toString());
 }
}
}

 riga di comando del DOS?
Visto che stai imparando consiglio vivamente di laciarli dal prompt
(anzi da sue prompt differenti).
ciao e buon divertimento


Come devo fare per lanciarli dal prompt?

 Come devo fare per lanciarli dal prompt?
java <nome_della_classe>
oppure
java -jar <nome_del_jarfile>


Quando provo a lanciare i programmi ".class" dal prompt mi appare un
messaggio con scritto che la JVM non trova la "main class".
Ho provato a lanciare i programmi dall'interno di Eclipse e i programmi
partono, pero' non capisco come funzionano:
quando lancio il server appare la scritta "Server avviato, in ascolto
sulla porta 9999", e dopo quando lancio il client appare "Messaggio
spedito a /
127.0.0.1
", non c'e' qualche errore?
In "SimpleClient.java" c'e' il metodo "readLine()", non e' che il
client dovrebbe farmi digitare delle stringhe fino a quando non premo
il tasto "Invio" ? Invece di terminare subito?

 il tasto "Invio" ? Invece di terminare subito?
Non c'e' nessun errore. Ecco il codice del client:
String host="127.0.0.1";
  Socket s=new Socket(host,9999);
questa riga crea un socket verso il server
  BufferedReader br=new BufferedReader (new
InputStreamReader(s.getInputStream()));
Questa riga apre un buffered reader (ovvero un canale un lettura sul
socket aperto verso il server
  System.out.println(br.readLine());
scrive il risultato di br.readLine() ovvero fa una readLine non da
tstiera ma sul socket.
In altre parole apre un canale verso il server
Legge la prima riga che il server scrive sul canale (con l'istruzione
"bw.write("Ciao client sono il server."); " della classe server)
chiude le comunicazioni ed esce.


Cosa devo scrivere dopo "-classpath" ?
Se scrivo la directory che contiene i file ".class" mi appare
sempre la solita eccezzione.

 sempre la solita eccezzione.
Prova scriverci (o meglio a copiare e incollare) la linea di comando che 
usi e l'output che ottieni.
Poi anche il risultato del comando
	dir <directory che contiene i file .class>
oppure ls se sei sotto linux.
Ciao


Per comodita' ho copiato di due file ".class" nella directory "c:\temp"
Da prompt scrivo:
java -classpath c:\temp SimpleServer.class
e ottengo il seguente output:
Exception in thread "main" java.lang.NoClassDefFoundError: 
SimpleServer/class


Scusami tanto... ma nel manuale di cui parli non c'e' scritto come si
lancia un programma java???
Quando compili dovresti avere i due file .class in due directory
distinte (simpleServer e simpleClient). SUpponiamo che a directory che
contiente queste due directory cia c:\temp. allora scrivi
java -classpath c:\temp SimpleServer (senza .class)
Pero' se vuoi capiere cosa stai facendo leggi anche le pagine che del
manuale che hai saltato :-)

 manuale che hai saltato :-)
Sono riuscito a lanciare i programmi, ma quando lancio "SimpleServer"
il computer si blocca, va bene cosi? (quando invece lo lancio da
Eclipse non si blocca)

 Eclipse non si blocca)
Si blocca TUTTO il computer? Devi riavviarlo?


No, basta che premo "Ctrl+C"


Allora va bene, se il tuo server č rimasto quello del primo post allora 
il processo si blocca in corrispondenza della linea
    Socket s1=s.accept();
Vedi anche
http://java.sun.com/javase/6/docs/api/java/net/ServerSocket.html#accept()
 >public Socket accept()
 >              throws IOException
 >
 >    Listens for a connection to be made to this socket and accepts it. 
 >The method blocks until a connection is made.
Adesso se avvii il client su un'altro Prompt dovresti vedere che il 
server riceve il messaggio.

Bracco Baldo ha scritto:

Hai lanciato un server. Il task del prompt di linea di comandi ha 
passato il controllo al server.
Eclipse, essendo in un ambiente multitask lo avra' lanciato come task 
indipendente.