2013-03-15 30 views
0

我现在的情况是非常有线的,我有一个Android应用程序运行带有网络线程的服务。使用可序列化对象的java套接字和android之间的通信

另一方面,我的笔记本电脑上运行的Java应用程序(win8)。 java应用程序正在侦听一个serversocket,等待android应用程序与它交流。一旦android应用程序创建一个套接字并将其绑定到正确的端口并在java应用程序中寻址服务器套接字,接受它并创建一个新的套接字。

这个新套接字正在等待来自Android应用(客户端)的数据包。 android应用程序发送一个可序列化的对象。

问题是,Java应用程序从来没有读过它,但我用wireshark嗅探和数据包正在接收。

所以我尝试读取一个字节数组,并工作良好,套接字读取没有问题。

对此有何猜测?我认为我的代码很好,这是一个非常基本的东西,我在android应用程序之间做了几次,不知道为什么现在不工作。

服务器(Java应用程序)

mServerSocket = new ServerSocket(port); 

     mReceivedSocket = new Socket(); 

     mReceivedSocket = mServerSocket.accept(); 

     System.out.println("Accepted"); 

     mInput = new ObjectInputStream(mReceivedSocket.getInputStream()); 

     mOutput = new ObjectOutputStream(mReceivedSocket.getOutputStream()); 

     byte[] buf = new byte[4096]; 

     while (mReceivedSocket.isConnected()) { 

      System.out.println("Waiting for packets"); 

      mInput.read(buf, 0, 4096); 

      //NotificationPacket packet = (NotificationPacket) mInput.readObject(); 

      System.out.println("Packet received: "+buf.toString()); 

      //renderPacket(packet); 

     } 

客户端发送(Android应用程序)

mOutput.writeObject(packet); 

     mOutput.flush(); 

的序列化包是在两侧是相同的。

谢谢。

+0

readObject()被调用时会发生什么?它无限期地坐着吗? – 2013-03-15 22:46:24

+0

是的,我使用调试器,它停留在那里...不知道为什么,看起来像在等待阅读更多 – Marcel 2013-03-15 23:20:23

+0

您不能使用isConnected()作为连接运行状况检查。事实并非如此。捕捉异常。这就是他们的目的。 – EJP 2013-03-15 23:55:10

回答

1

您必须在ObjectInputStream之前构造ObjectOutputStream,否则可能会导致死锁。您还必须在读取对象,两端。你正在写一个对象,但读入一个字节数组。这没有意义。

+0

是的,我正在阅读两边的对象,这段代码是在尝试查看它是否准备好之后,我没有注意到...我会尝试您对订单的说明... – Marcel 2013-03-16 16:41:41

+0

我昨天试了一下,订单是重要......嘿,谢谢。我不知道这很重要。 – Marcel 2013-03-18 08:04:33

相关问题