Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339

    Java null pointer exception su comunicazione client e host

    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?

  2. #2
    Utente di HTML.it L'avatar di minomic
    Registrato dal
    Nov 2010
    Messaggi
    635
    Ciao,
    posta il testo completo dell'eccezione, che riporta anche la riga di codice che la provoca.

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339
    Quote Originariamente inviata da minomic Visualizza il messaggio
    Ciao,
    posta il testo completo dell'eccezione, che riporta anche la riga di codice che la provoca.
    Non porta la riga dell'eccezione ,
    Esce solo cosi :

    java.lang.NullPointerException.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Markus85 Visualizza il messaggio
    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.
    Almeno precisa la riga incriminata ...


    Quote Originariamente inviata da Markus85 Visualizza il messaggio
    Non porta la riga dell'eccezione
    Ok ... allora modifica il codice per far stampare lo stacktrace.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339
    Quote Originariamente inviata da andbin Visualizza il messaggio

    Ok ... allora modifica il codice per far stampare lo stacktrace.
    Giusto
    Ecco L'eccezione :
    java.lang.NullPointerException
    at appello4Febbraio2014.Client.inviaRichiesta(Client. java:80)
    at appello4Febbraio2014.Client.main(Client.java:121)

    le righe corrispondenti sono :

    out.write(cipher.doFinal(messaggio.getBytes())); riga 80

    if(client.inviaRichiesta("Gio@falco85@ciao")) riga 121

    a quanto pare sbaglio nel cifrare il messaggio

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Markus85 Visualizza il messaggio
    out.write(cipher.doFinal(messaggio.getBytes())); riga 80

    if(client.inviaRichiesta("Gio@falco85@ciao")) riga 121

    a quanto pare sbaglio nel cifrare il messaggio
    Beh, da una veloce verifica: inviaRichiesta non è invocato nel run del thread ma nel contesto del main, appena dopo la start(). La inizializzazione di cipher è verso la fine del run.
    Nel momento in cui invochi inviaRichiesta e si arriva alla riga incriminata, non è affatto detto che cipher sia già stato assegnato.
    E comunque anche se:

    cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

    fosse già eseguito, lo assegni nel contesto del tuo thread ma poi inviaRichiesta lo usa nel contesto del main-thread .... e non hai fatto nulla per garantire anche solo la "visibilità" della modifica a 'cipher'.
    Quindi il tuo design è "dubbio".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339
    Quindi dici di inizializzare il cifrario nel momento in cui invio la richiesta?

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Beh, da una veloce verifica: inviaRichiesta non è invocato nel run del thread ma nel contesto del main, appena dopo la start(). La inizializzazione di cipher è verso la fine del run.
    Nel momento in cui invochi inviaRichiesta e si arriva alla riga incriminata, non è affatto detto che cipher sia già stato assegnato.
    E comunque anche se:

    cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

    fosse già eseguito, lo assegni nel contesto del tuo thread ma poi inviaRichiesta lo usa nel contesto del main-thread .... e non hai fatto nulla per garantire anche solo la "visibilità" della modifica a 'cipher'.
    Quindi il tuo design è "dubbio".
    Ho modificato il client.... non l'ho istanziato come thread.

    Ancora mi da l'eccezione null pointer :

    java.lang.NullPointerException
    at appello4Febbraio2014.Client.inviaRichiesta(Client. java:93)
    at appello4Febbraio2014.Client.main(Client.java:124)

    return e.equals("Richiesta Accettata!"); riga 93
    if(client.inviaRichiesta("Gio@falco85@ciao")) riga 124

    E' sempre per il motivo che hai detto prima ?

    Client modificato :

    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 {
    	
    	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){
    			err.printStackTrace();
    		}
    		
    	}//COSTRUTTORE CLIENT
    	
    	public void riceviChiavePubblica(){
    		
    		try{
    			
    				
    				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){
    				err2.printStackTrace();
    			}
    		}
    	}
    	
    	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){
    			err.printStackTrace();
    		}
    		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){
    			err.printStackTrace();
    		}
    		
    	}// 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.riceviChiavePubblica();
    			if(client.inviaRichiesta("Gio@falco85@ciao"))
    				client.riceviMessaggio();
    			
    		}catch(Exception err){
    			err.printStackTrace();
    		}
    		
    	}//MAIN
    
    
    }//CLIENT

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.