2011-08-26 4 views
1

Je suis en train d'écrire le côté serveur d'un socket UDP en cours de traitement et de rencontrer une exception NullPointerException à chaque fois sur la ligne DatagramPacket receivePacket = new DatagramPacket(receiveData, 4096);. Le côté client est un fichier Python. Voici le code pour le serveur. Les méthodes setup() et draw() sont appelées via différents fichiers de traitement.Traitement des sockets UDP

import processing.net.*; 
import java.io.*; 
import java.net.*; 
import java.util.*; 

//Server myServer; 
DatagramSocket serverSocket; 
byte[] receiveData; 
InetAddress IPAddressList; 
int portList = -1; 

void setup(){ 
    try{ 
     DatagramSocket serverSocket = new DatagramSocket(21567); 
    } 
    catch (IOException e){ 
    e.printStackTrace(); 
    System.out.println(e); 
    } 

    byte[] receiveData = new byte[4096]; 
} 

void draw(){ 

    float P1,P2,P3; 
    print ("hello"); 
    try{ 
    DatagramPacket receivePacket = new DatagramPacket(receiveData, 4096); 
    serverSocket.receive(receivePacket); 
    String greeting = new String(receivePacket.getData()); 
    System.out.println("From Client: " + greeting); 
    IPAddressList = receivePacket.getAddress(); 
    portList= receivePacket.getPort(); 
    P1 = Integer.valueOf(greeting); 
    print(P1); 
    print (greeting); 
    } 
    catch (IOException e){ 
    System.out.println(e.getMessage()); 
    } 

    for (int i=0;i<receiveData.length;i++){ 
    print(receiveData[i]); 
    } 
} 

Répondre

5

La ligne sur laquelle vous avez indiqué NullPointerException est très utile.

Le problème est que vous avez initialisé une variable localereceiveData au lieu du champreceiveDatadans le champ extérieur. Pour résoudre ce problème, il suffit de remplacer la ligne byte[] receiveData = new byte[4096]; par receiveData = new byte[4096];.

En général, on appelle cela shadowing nom:

+0

Après avoir modifié le code comme vous avez dit, je reçois le 'NullPointerException' sur la ligne suivante maintenant .. .'serverSocket.receive (receivePacket); ' – dawnoflife

+1

Ah. Même problème avec la variable 'serverSocket': ne le déclarez pas localement. – Nayuki

+0

Pour réitérer explicitement, ce que vous avez fait est que dans le bloc 'try' vous avez créé les variables' serverSocket' et 'receiveData', qui sont ** différents ** des mêmes noms' serverSocket' et 'receiveData' créés plus loin ci-dessus dans la portée extérieure. Cet effet est appelé ombrage du nom. – Nayuki

Questions connexes