iostream和read / writeObject调用的基本原理

我正在devise一个Java服务器来响应多个客户端请求。 所以devise基本上有一个服务器套接字,接受一个客户端套接字,从客户端input / outputStream创build一个inputObjectStream和一个outputObjectStream。

然后,我在客户端上使用writeobject发出请求,在服务器上的readObject接收请求。 处理它,将对象写回到响应的同一个stream中,并在客户端读取对象来处理响应。

现在,如果我运行的Android模拟器/设备上的代码工作正常。 如果我在“android junit javatesting用例”上运行相同的代码段,在处理完所有请求之后,我得到一个exception。 readObject调用服务器端的exception。

java.io.EOFException at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2570) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1314) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:368)` 

问题这是一个正确的devise读/写iostream上的对象?

编辑

我有4shared.com上的示例项目(http://www.4shared.com/archive/98gET_pV/Issue15426tar.html)或(http://www.sendspace.com/file/v04zjp)

testing1(PASS)

  1. TestServer项目,运行它作为Java应用程序
  2. TestClient项目,运行它作为一个Android应用程序

控制台输出

服务器套接字已打开/127.0.0.1

客户端套接字已接受

inputstream创build

输出stream创build

读取对象创build

testing2(FAIL)

  1. TestServer项目,运行它作为Java应用程序
  2. TestClient项目,运行它作为Android的Junittesting

控制台输出

服务器套接字已打开/127.0.0.1

客户端套接字已接受

 Error : Unable to open server socket. Server wont load. java.io.EOFException at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2297) at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2766) at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:797) at java.io.ObjectInputStream.<init>(ObjectInputStream.java:297) at com.test.server.myThread.run(Main.java:52) at com.test.server.Main.main(Main.java:32) 

Solutions Collecting From Web of "iostream和read / writeObject调用的基本原理"

不知道这是否会导致这个特定问题,但是在创build对象stream时应该总是使用这个顺序:

  1. 创buildObjectOutputStream
  2. 冲洗它
  3. 创buildObjectInputStream

我看到,至less在服务器端你首先创build了ObjectInputStream ,并没有刷新可能导致你的问题的stream。

这里是关于这个命令背后的主题和原因的更多信息。

您应该select1024以上的服务器端口,因为下面的所有端口都是为已知服务保留的。 只需select一个介于1024和65535之间的端口,然后查看是否有效。

另外我会build议你把你的ObjectInputStream包装成一个BufferedInputStream; 可能是一旦你的连接不稳定,就会失败。

我认为这是因为,你的客户执行后退出

 objectOutputStream.writeObject(message) ; 

所以试着在这一行后面介绍一下人为的延迟。

在所有情况下,当客户端/服务器closures连接/终止程序时,如果等待任何input(例如,inputObjectStream.readObject()),则另一端将引发此EOFexception

所以请确保在客户端终止之前,无论客户端写入的内容是否被服务器正确读取。 所以在客户端引入一些延迟,看看。

请在客户端刷新stream。 我希望能解决这个问题。