2014-03-27 49 views
2

我創建了一個允許通過本地wifi發送數據的應用程序。首先,我試圖恢復我的IP地址和我在哪裏的域,它工作正常(我用Log.d驗證過)。Android UDP通過本地wifi進行通信

這是類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(); 
     } 
    } 

此外,我創造了這個服務來運行ServerThread:

公共類ChatService延伸服務{

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); 
     } 
} 

在我的活動(叫集體活動)我創建了方法SendMessage:

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

而我把它叫做按鈕「提交」被點擊時:

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(""); 
       } 
      }) ; 

,我並沒有忘記廣播接收器:

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); 
        } 
       }); 

      } 
     } 
    }; 

而且finnaly,這些都是其他方法我的活動:

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

當我運行應用程序,我不能發送/接收任何消息,並在兩個警告在LO g:

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

我想知道這是什麼問題,我該如何糾正它。 謝謝

+0

請提供線整個堆棧跟蹤和源極線數'公共無效的run(){',使我們可以在與那些在該方法中的跟蹤涉及的行號。 – scottt

+0

問題是在包含的線 ChatService.socket.send(packet1); –

回答

1

謝謝Scott,finnaly我可以修復它!它只是創建serversocket的問題。我在ClientThread中添加了DatagramPacket作爲屬性,並且我更改了構造函數。 。

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(); 
}  

}

1

我會註銷所有相關的值;其中一個沒有價值。因此,或許:

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())); 

或者,你可以通過調試運行此。這真的會讓你看到發生了什麼。

+0

消息是[mssgyassine:hello];它的大小是18 地址是[192.168.93.103];它的大小是14 端口是5555 InetAddress是[/192.168.93.103] packet1是[[email protected]];它的大小是18 –

+0

然後剩下的唯一東西是ChatService.socket或者在send方法內部。有沒有可能你沒有在代碼中將套接字設置爲一個值?我已經添加了另一個日誌行。記錄套接字時的輸出可能不是很有意義,但應該告訴你它是否爲null; – scottt

+0

最後一個日誌不能工作(java.lang.NullPointerException) –