2012-11-29 66 views
0

我想通過UDP套接字發送一個對象(ClientModel)。套接字部分工作正常,因爲如果我嘗試發送一個簡單的字符串它的作品。我遇到了一個例外,錯誤在哪裏?客戶說「客戶:失敗」。下面的代碼,就目前唯一的客戶端,因爲這個問題是在發送過程中,比我能想到的接受這個東西:)Android通過UDP套接字發送對象

感謝

public class ClientActivity extends Activity { 
    public static final int SERVERPORT = 5050; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.client); 

     try { 
      InetAddress serverAddr = getBroadcastAddress(); 

      DatagramSocket socket = new DatagramSocket(); 

      //byte[] buf = "whatsup bitches".getBytes(); 

      ClientModel sendingMessage = new ClientModel(); 
      sendingMessage.data = 999; 
      sendingMessage.name = "sample"; 
      System.out.println(sendingMessage); 

      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      ObjectOutputStream oos = new ObjectOutputStream(baos); 
      oos.writeObject(sendingMessage); 
      byte[] buf = baos.toByteArray(); 


      DatagramPacket packet = new DatagramPacket(buf, buf.length, 
      serverAddr, SERVERPORT); 
      socket.send(packet); 
      Log.d("UDP", "Client: Packet sent to server on address: " + serverAddr); 
     } 
     catch (Exception e) { 
      Log.d("UDP", "Client: Fail"); 
     } 
    } 

    private InetAddress getBroadcastAddress() throws IOException { 
     WifiManager myWifiManager = (WifiManager) getSystemService(WIFI_SERVICE); 
     DhcpInfo myDhcpInfo = myWifiManager.getDhcpInfo(); 
     if (myDhcpInfo == null) { 
      System.out.println("Could not get broadcast address"); 
      return null; 
     } 
     int broadcast = (myDhcpInfo.ipAddress & myDhcpInfo.netmask) 
        | ~myDhcpInfo.netmask; 
     byte[] quads = new byte[4]; 
     for (int k = 0; k < 4; k++) 
     quads[k] = (byte) ((broadcast >> k * 8) & 0xFF); 
     return InetAddress.getByAddress(quads); 
    } 

    class ClientModel { 
     public int data; 
     public String name; 
    } 
} 

這裏的日誌,不好意思:

11-29 17:10:09.933: I/System.out(5700): [email protected] 
11-29 17:10:09.964: W/System.err(5700): java.io.NotSerializableException: com.example.ClientActivity$ClientModel 
11-29 17:10:09.964: W/System.err(5700):  at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1535) 
11-29 17:10:09.964: W/System.err(5700):  at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1847) 
11-29 17:10:09.964: W/System.err(5700):  at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1689) 
11-29 17:10:09.964: W/System.err(5700):  at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1653) 
11-29 17:10:09.964: W/System.err(5700):  at com.example.ClientActivity.onCreate(ClientActivity.java:39) 
11-29 17:10:09.964: W/System.err(5700):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
11-29 17:10:09.964: W/System.err(5700):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722) 
11-29 17:10:09.964: W/System.err(5700):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784) 
11-29 17:10:09.964: W/System.err(5700):  at android.app.ActivityThread.access$1500(ActivityThread.java:123) 
11-29 17:10:09.964: W/System.err(5700):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939) 
11-29 17:10:09.964: W/System.err(5700):  at android.os.Handler.dispatchMessage(Handler.java:99) 
11-29 17:10:09.964: W/System.err(5700):  at android.os.Looper.loop(Looper.java:130) 
11-29 17:10:09.964: W/System.err(5700):  at android.app.ActivityThread.main(ActivityThread.java:3835) 
11-29 17:10:09.964: W/System.err(5700):  at java.lang.reflect.Method.invokeNative(Native Method) 
11-29 17:10:09.964: W/System.err(5700):  at java.lang.reflect.Method.invoke(Method.java:507) 
11-29 17:10:09.964: W/System.err(5700):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864) 
11-29 17:10:09.964: W/System.err(5700):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622) 
11-29 17:10:09.964: W/System.err(5700):  at dalvik.system.NativeStart.main(Native Method) 
11-29 17:10:09.964: D/UDP(5700): Client: Fail 
+1

也許如果你實際登錄異常而不只是一個硬編碼的消息,你會得到更多的信息.​​.....(提示:你應該幾乎從不* *不理你捕獲異常) –

+0

你能告訴我們堆棧跟蹤嗎?這將有所幫助。 – LuigiEdlCarno

+0

我不知道該怎麼做,我只是從幾天的Android編程:) – phcaze

回答

3

您需要了解更多關於java中的序列化。

class ClientModel implements Serializable{ 
    public int data; 
    public String name; 
} 
+0

它不能解決問題,我仍然得到相同的錯誤。當然,我必須學習更多關於java/android :( – phcaze

+0

在主類ClientActivity中添加「implements Serializable」,它可以工作!我可以發送UDP數據包,非常感謝! – phcaze

0

不要忘了UDP連接少,不會在練習中100%的時間獲取數據。退房http://cs.nyu.edu/~bacon/phd-thesis/diss/node32.html

所以這裏是我會做的。驗證你的序列化是否正常,但是序列化內存中的對象,然後從內存中反序列化它。如果這項工作你知道它的網絡問題。

如果出現網絡問題,您可以嘗試切換到基於TCP的流並以這種方式發送該數據。此外,您可能需要爲數據添加校驗和以確保其正確到達。

+0

是的,我知道,這只是一個發現階段,我將在應用程序中使用TCP,但目前我必須發送廣播「hello」消息,因此我需要UDP – phcaze

0
ByteArrayInputStream bais = new ByteArrayInputStream(packet.getData()); 
    ObjectInputStream ois = new ObjectInputStream(bais); 
    bais.close(); // move this to end of code 
    ois.close(); // move this to end of code 

    receivingMessage = (ClientModel) ois.readObject(); //you can't read if you've closed the streams 
+0

您應該至少包含對答案的解釋 –

+0

解釋:如果您關閉了流,則無法閱讀 – Chuck