Ciao a tutti

Ho fatto un piccolo programmino che si occupa di far mandare da un client una richiesta ad un server (host) che la gestisce e poi ricontatta il client .

Utilizzo i socket
La richiesta è mandata in forma codificata ;

Su eclipse faccio partire il server (host) e ok , faccio partire il client e mi da un eccezione del tipo java.lang.NullPointerException.

Mi sapete dire come mai ? Non riesco ad individuare la falla.

Vi posto il codice relativo a client ed host:

client :

codice:
package appello4Febbraio2014;


import java.io.*;
import java.net.*;
import java.util.*;
import java.security.*;
import java.security.spec.*;
import javax.crypto.*;


public class Client extends Thread {
	
	MulticastSocket mSocket;
	InetAddress groupAddress;
	int multicastPort;
	InetAddress serverAddress;
	Socket gkSocket; //SOCKET PER RICHIEDERE E RICEVERE LA CHIAVE PUBBLICA
	int gkPort; 
	Socket socket;
	int serverPort;
	Cipher cipher;
	
	public Client(InetAddress groupAddress , InetAddress serverAddress , int multicastPort , int gkPort , int serverPort){
		
		this.groupAddress = groupAddress;
		this.serverAddress = serverAddress;
		this.multicastPort = multicastPort;
		this.gkPort = gkPort;
		this.serverPort = serverPort;
		
		try{
		mSocket = new MulticastSocket(multicastPort);
		mSocket.joinGroup(groupAddress);	
		gkSocket = new Socket(serverAddress , gkPort);
		socket = new Socket(serverAddress , serverPort);
		
		}catch(Exception err){
			System.out.println(err);
		}
		
	}//COSTRUTTORE CLIENT
	
	public void run(){
		
		try{
			while(true){
				
				OutputStream out = gkSocket.getOutputStream();
				out.write(1);
				InputStream in = gkSocket.getInputStream();
				byte [] publicKeyByte = new byte [1000];
				int numByte = in.read(publicKeyByte);
				publicKeyByte = Arrays.copyOf(publicKeyByte, numByte);
				
				X509EncodedKeySpec ks = new X509EncodedKeySpec(publicKeyByte);
				KeyFactory kf = KeyFactory.getInstance("RSA");
				PublicKey publicKey = kf.generatePublic(ks);
				
				cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
				cipher.init(Cipher.ENCRYPT_MODE, publicKey);
				
				out.close();
				in.close();
							
			}
		}catch(Exception err){
			try{
				gkSocket.close();
			}catch(Exception err2){
				System.out.println(err2);
			}
		}
	}//RUN
	
	public boolean inviaRichiesta(String messaggio){
		
		String e = "";
		
		try{
		OutputStream out = socket.getOutputStream();
		out.write(cipher.doFinal(messaggio.getBytes()));
		BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		e = in.readLine();
		out.close();
		in.close();
		socket.close();
		
		}catch(Exception err){
			System.out.println(err);
		}
		return e.equals("Richiesta Accettata!");
		
	}// INVIA RICHIESTA
	
	public void riceviMessaggio(){
		
		
		byte [] buf = new byte [256];
		DatagramPacket packet = new DatagramPacket(buf , buf.length);
		
		try{
		mSocket.receive(packet);
		
		System.out.println(packet);
		}catch(Exception err){
			System.out.println(err);
		}
		
	}// RICEVI MESSAGGIO
	
	public static void main (String [] args){
		
		try{
			InetAddress groupAddress = InetAddress.getByName("224.0.0.1");
			int multicastPort = 5700;
			InetAddress serverAddress = InetAddress.getByName("127.0.0.1");
			int serverPort = 5600;
			int gkPort = 5800;
			
			Client client = new Client(groupAddress , serverAddress , multicastPort , gkPort , serverPort );
			client.start();
			if(client.inviaRichiesta("Gio@falco85@ciao"))
				client.riceviMessaggio();
			
		}catch(Exception err){
			System.out.println(err);
		}
		
	}//MAIN


}//THREAD CLIENT
Host :

codice:
package appello4Febbraio2014;


import java.io.*;
import java.net.*;
import java.util.*;
import java.security.*;
import java.security.spec.*;
import javax.crypto.*;


public class Host extends Thread {
	
	int skPort;
	ServerSocket sSocket;
	KeyPair kp;
	Cipher decipher;
	int multicastPort;
	InetAddress groupAddress;
	MulticastSocket mSocket;
	
	public Host(InetAddress groupAddress , int multicastPort ,int skPort){
		
		this.groupAddress = groupAddress;
		this.multicastPort = multicastPort;
		this.skPort = skPort;
		
		try{
			sSocket = new ServerSocket(skPort);
			mSocket = new MulticastSocket(multicastPort);
		}catch(Exception err1){
			System.out.println(err1);
		}
	}// COSTRUTTORE
	
	public void run(){
		
		try{
			while(true){
				
				KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
				kpg.initialize(1024);
				kp = kpg.generateKeyPair();
				
				Socket s = sSocket.accept();
				InputStream in = s.getInputStream();
				in.read();
				
				OutputStream out = s.getOutputStream();
				out.write(kp.getPublic().getEncoded());
				
				decipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
				decipher.init(Cipher.DECRYPT_MODE, kp.getPrivate());
				
				in.close();
				out.close();
			}//WHILE
		}catch(Exception err2){
			try{
				sSocket.close();
			}catch(Exception err3){
				System.out.println(err3);
			}
		}//CATCH
	}//RUN
	
	class gestisciRichieste extends Thread{
		
		Socket socket;
	
		public gestisciRichieste(Socket socket){
			
			this.socket = socket;
			this.start();
			
		}//COSTRUTTORE
		
		public boolean VerificaUtente(String user , String password){
			return true;
		}
		
		public void run(){
			
			try{
				while(true){
					
					InputStream in = socket.getInputStream();
					byte [] richiestaByte = new byte [1000];
					int numByte = in.read(richiestaByte);
					richiestaByte = Arrays.copyOf(richiestaByte, numByte);
					
					byte [] richiestaDecriptata = decipher.doFinal(richiestaByte);
					String richiesta = new String(richiestaDecriptata);
					
					int pos = richiesta.indexOf("@");
					String user = richiesta.substring(0,pos);
					String password = richiesta.substring(pos+1);
					int pos2 = richiesta.indexOf(password);
					String messaggio = richiesta.substring(pos2+2);
					in.close();
					PrintWriter out = new PrintWriter(socket.getOutputStream(),true);
					
					if(VerificaUtente(user , password)){
						out.print("Richiesta Accettata");
						byte [] buf = new byte [256];
						DatagramPacket packet = new DatagramPacket(buf , buf.length , groupAddress , multicastPort);
						mSocket.send(packet);
						out.close();
					}
					else
						out.print("Richiesta Rifiutata!");
					    out.close();
				}
			}catch(Exception err4){
				try{
					mSocket.close();
				}catch(Exception err5){
					System.out.println(err5);
				}
			}
		}//RUN
		
	}//THREAD GESTISCI RICHIESTE
	
	public static void main (String [] args){
		
		try{
			InetAddress groupAddress = InetAddress.getByName("224.0.0.1");
			int multicastPort = 5700;
			int skPort = 5800;
			ServerSocket servSocket = new ServerSocket(5600);
			
			Host host = new Host(groupAddress , multicastPort , skPort);
			host.start();
			
			while(true){
				
				Socket s = servSocket.accept();
				gestisciRichieste gr = host.new gestisciRichieste(s);
			}
		}catch(Exception err5){
			System.out.println(err5);
		}
		
	}//MAIN


}//THREAD HOST
Qualcuno mi aiuta?