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?