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:
a quanto pare non riconosce i flussi di input-output verso il client...ma perchè?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
mi scuso per la prolissità e ringrazio in anticipo coloro che mi daranno una mano.
lellone

Rispondi quotando

