Visualizzazione dei risultati da 1 a 8 su 8

Hybrid View

  1. #1
    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

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    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.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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

  4. #4
    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 © 2025 vBulletin Solutions, Inc. All rights reserved.