2012-11-29 112 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