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