سؤال

I have created an application which allows sending datas via local wifi. First, I tried to recuperate my ip address and the domain where i am in and it worked correctly (i verified it with Log.d).

This is the class ClientThread:

import java.net.DatagramPacket;
import java.net.InetAddress;

public class ClientThread extends Thread implements Runnable{
    String address;
    String message;
    int port;
    boolean broadcast;
    public ClientThread(String address, String message, int port,boolean broadcast)
    {   super();
        this.address = address;
        this.message = message;
        this.port = port;
        this.broadcast = broadcast;
    }
    public void run() {
        try {   
            DatagramPacket packet1 = new DatagramPacket(message.getBytes()
                    , message.length(), InetAddress.getByName(address), port);
            ChatService.socket.send(packet1);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Besides, I have created this service to run the ServerThread:

public class ChatService extends Service{

public static DatagramSocket socket;
private ServerThread sThread;
public static String serverIP;
public static final int SERVERPORT = 5555;
private Handler handler = new Handler(); 
private ServerSocket serverSocket;
public static final String BROADCAST_ACTION = "UpdateEvent";
static Intent intent;

@Override
public IBinder onBind(Intent arg0) {
    return null;
}

@Override
public void onCreate() {
    super.onCreate();
    try {
        socket = new DatagramSocket(SERVERPORT);// initialisation du datagramme UDP
        sThread = new ServerThread();
        sThread.start();
    } catch (SocketException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
public class ServerThread extends Thread implements Runnable{

     public void run() {
            try {
                  serverIP = getLocalIpAddress(); 
                  Log.v("addr", serverIP);
                  if (serverIP != null) {
                     serverSocket = new ServerSocket(SERVERPORT);
                     Log.v("socket", "created");
                     while(true) {  //boucle infini                  
                         Socket client = serverSocket.accept();
                         Log.v("client", "received");
                         try {
                            byte[] buf = new byte[1024]; 
                            DatagramPacket packet = new DatagramPacket(buf, buf.length); 
                            ChatService.socket.receive(packet);
                            byte[] result = new byte[packet.getLength()];
                            System.arraycopy(packet.getData(), 0, result, 0, packet.getLength());
                            String msg = new String(result);
                            updateGui(msg, packet.getAddress());
                            ChatService.socket.close();

                         } catch (Exception e) {

                         }
                     }
                  } 
               } catch (Exception e) {}
        }

      private String getLocalIpAddress() {
            try {
                    for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
                        NetworkInterface intf = en.nextElement();
                        for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
                            InetAddress inetAddress = enumIpAddr.nextElement();
                            if (!inetAddress.isLoopbackAddress()) { return inetAddress.getHostAddress().toString(); }
                        }
                    }
                } catch (SocketException ex) {
                    Log.e("ServerActivity", ex.toString());
                }
                return null;
       }

        public void updateGui(String msg, InetAddress addr) {

            intent = new Intent(BROADCAST_ACTION);
            intent.putExtra("message", msg);
            intent.putExtra("senderAddr", addr.toString().substring(1, addr.toString().length()));
            if(msg.substring(0, 4).equals("idfu"))
            {
                CollectiveActivity.receiverAddr = addr.toString().substring(1, addr.toString().length());
            }
            sendBroadcast(intent);
        }
}

In my activity (Called CollectiveActivity) I i created the methode SendMessage :

 private void sendMessage(String address, String msg, boolean bcast) {
        wifi.ClientThread cThread;
        cThread = new wifi.ClientThread(address, msg, 5555, bcast);
        cThread.start();
    }

And the i called it when the button "Submit" was clicked:

Button submit = (Button) findViewById(R.id.Button); 
             submit.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View arg0) {
                      chatArea.append(Html.fromHtml("<font color='red' style='bold'>"+User.username+": </font>"));
                      chatArea.append(Html.fromHtml("<font color='black'>"+textBox.getText()+"</font> <br/>"));
                      sendMessage("192.168.93.103", "mssg"+User.username+": "+textBox.getText().toString(), true);
                      textBox.setText("");
                }
            })  ;

And i didn't forget the BroadcastReceiver:

 private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.v("msg", "received");
            String message = intent.getStringExtra("message");
            String code = message.substring(0, 4); // message= code(4) + msg 
            String msg = null;
            if(message.length()>4) msg = message.substring(4, message.length());
            if(code.equals("idfr"))
            {
                 if(receiverAddr != null) 
                 {
                    // si qq entre à la chambre de chat
                     addUser(msg, intent.getStringExtra("senderAddr"));
                     Toast toast = Toast.makeText(CollectiveActivity.this, msg+" entered chat room", 1000);
                     toast.show();
                     sendMessage(receiverAddr, "idfu"+DataUser.User.username, false);
                 }
            }
            else if(code.equals("idfu"))
            {
                 addUser(msg, intent.getStringExtra("senderAddr"));
                 Toast toast = Toast.makeText(CollectiveActivity.this, msg+" entered chat room", 1000);
                 toast.show();
                 Log.v("user added with name and address", msg + " " + intent.getStringExtra("senderAddr"));
            }
            else if(code.equals("mssg"))
            {
                 int temp = 0;
                 while(msg.charAt(temp)!=' ') temp++; 
                sender+' '+message1
                 String sender;
                 String message1;
                 sender = msg.substring(0, temp);
                 message1 = msg.substring(temp, msg.length());

                 chatArea.append(Html.fromHtml("<font color='red'>"+sender+" </font>"));
                 chatArea.append(Html.fromHtml("<font color='black'>"+message1+"</font> <br/>"));

                 scrollView.post(new Runnable() {
                    public void run() {
                        scrollView.fullScroll(View.FOCUS_DOWN);
                    }
                 });

            }
        }
    };

And finnaly, these are the others methods of my activity:

    public void onResume() {
        super.onResume();
        registerReceiver(broadcastReceiver, new IntentFilter(ChatService.BROADCAST_ACTION));
    }  
    public void onPause() {
        super.onPause();
        unregisterReceiver(broadcastReceiver);
    }   
    public void onDestroy() {
        super.onDestroy();
    }

When i run the application , i can't send/receive any message and there is two warning in the log:

java.lang.NullPointerException
at wifi.ClientThread.run(ClientThread.java:31)

I would like to know what's is the problem, i how can i correct it. Thanks

هل كانت مفيدة؟

المحلول 2

Thank you Scott, finnaly i could fix it simply !! it just a problem of creating the serversocket. I added a DatagramPacket as an attribut in the ClientThread, and i changed the constructor. .

public class ClientThread extends Thread implements Runnable{
String address;
String message;
int port;
boolean broadcast;
public DatagramSocket socket;
public ClientThread(String address, String message, int port,boolean broadcast, DatagramSocket socket)
{   super();
    this.address = address;
    this.message = message;
    this.port = port;
    this.broadcast = broadcast;
    this.socket = socket;
}
public void run() {
    try {   
        DatagramPacket packet1 = new DatagramPacket(message.getBytes(), message.length(), InetAddress.getByName(address), port);
        socket.send(packet1);
    } catch (Exception e) {
        e.printStackTrace();

    }
    socket.close();
}    

}

نصائح أخرى

I would log out all the relevant values; one of them doesn't have a value. So perhaps:

Log.v(TAG, String.format("message is [%s]; it's size is %d", message, message.length()));                      Log.v(TAG, String.format("address is [%s]; it's size is %d", address, address.length()));
Log.v(TAG, String.format("port is %d", address, port));
Log.v(TAG, String.format("InetAddress is [%s]",  InetAddress.getByName(address), port)));
Log.v(TAG, String.format("packet1 is [%s]; it's size is %d",  packet1, packet1.length()));

Log.v(TAG, String.format("socket is [%s]",  ChatService.socket.toString()));

Alternatively, you could run this via the debugger. That would really let you see what's going on.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top