salve ragazzi,
vi prego cortesemente di leggere un attimo questo topic, per risolvere un problemino che mi sta facendo scervellare.
allora, vorrei implementare un'applicazione client server, con socket tcp e server multithreaded che consenta al server di leggere una stringa inviata dal client, e di replicare con la stringa medesima convertita in maiuscolo.
ho suddiviso l'intero codice in due package, uno per il client, l'altro per il server.
vi comincio a riportare il codice del server.
ho implementato 2 classi, chiamate rispettivamente server e main.
vi posto sotto il codice
codice:
// class server
package server;
import java.net.*;
import java.io.*;
public class server {
private ServerSocket socket_server;
private Socket socketclient;
private int numport;
server(int num) {
this.numport=num;
try{
socket_server = new ServerSocket(this.numport,100); // max 100 connessioni
} catch(IOException e) {e.printStackTrace();}
}
public void funzionamento() {
System.out.println("server in funzione");
while(true) {
try{
socketclient = socket_server.accept();
System.out.println("connessione con un client accettata");
// il server crea un apposito thread per gestire questo client
serverparallelo p = new serverparallelo(socketclient);
Thread t = new Thread(p);
t.start();
}
catch(IOException e) {e.printStackTrace();}
} // end while
} // end funzionamento()
// implementiamo la classe interna che emula il thread
protected class serverparallelo implements Runnable {
private Socket socket;
private BufferedReader dalclient;
private PrintStream alclient;
serverparallelo(Socket s) {
this.socket=s;
}
public void run() {
try{
dalclient = new BufferedReader(new InputStreamReader(socket.getInputStream()));
alclient = new PrintStream(socket.getOutputStream());
String letto = dalclient.readLine();
String risposta = letto.toUpperCase();
//invia risposta al client
alclient.println(risposta);
alclient.close();
dalclient.close();
socket.close();
}
catch(IOException e) {e.printStackTrace();}
} // end run()
}; // end inner class
// classe main
package server;
public class main {
public static void main(String[] args) {
server s = new server(7777);
s.funzionamento();
}
}
}
molto semplicemente, nella classe server ho creato una classe interna che implementa un thread. ogni volta che arriva la connessione di un client, creo una socket(restituitami da server_socket.accept() ), e lascio al thread la gestione dei flussi verso la socket del client
ora vi posto il codice del package client. sono 2 classi, rispettivamente main e client
codice:
// classe client
package client;
import java.net.*;
import java.io.*;
public class client {
private int numport;
private Socket client;
private BufferedReader dalserver;
private PrintStream alserver;
private static int contatore=0;
client (int numport) {
this.numport=numport;
try{
client = new Socket(InetAddress.getLocalHost(),this.numport);
System.out.println("sono il client " + contatore);
dalserver = new BufferedReader(new InputStreamReader(client.getInputStream()));
alserver = new PrintStream(client.getOutputStream());
}
catch(IOException e) {e.printStackTrace();}
}
public void funzionamento () {
System.out.println("digitare frase da convertire");
BufferedReader b = new BufferedReader(new InputStreamReader(System.in));
String frase = b.readLine();
try{
// invio il messaggio al server
alserver.println(frase);
// ricevo una risposta che memorizzo in risposta
String risposta = new String(dalserver.readLine());
System.out.println("il client " + contatore++ + "ha ricevuto dal server " + risposta);
// chiudo i flussi
dalserver.close();
alserver.close();
client.close();
}
catch(IOException e) {e.printStackTrace();}
}
}
// classe main
package client;
import java.io.*;
public class main {
public static void main(String[] args) {
// TODO Auto-generated method stub
client c = new client(7777);
}
}
ma dopo svariati tentativi, sempre lo stesso esito: il server funziona correttamente, e si mette in ascolto.
il client invece, una volta compilato, ecco l'output che si produce a console:
codice:
server in funzione
connessione con un client accettata
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
at sun.nio.cs.StreamDecoder.read(Unknown Source)
at java.io.InputStreamReader.read(Unknown Source)
at java.io.BufferedReader.fill(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at server.server$serverparallelo.run(server.java:49)
at java.lang.Thread.run(Unknown Source
a quanto pare non riconosce i flussi di input-output verso il client...ma perchè?
mi scuso per la prolissità e ringrazio in anticipo coloro che mi daranno una mano.
lellone