我正在设计一个java服务器来响应多个客户端请求。所以设计基本上有一个服务器套接字,接受客户端套接字,从客户端输入/ outputStream创建一个inputObjectStream和一个outputObjectStream。
然后我在客户端上使用writeobject发出请求,在服务器上使用readObject来接收请求。处理它,将对象写回与响应相同的流,并在客户端readobject处理响应。
现在,如果我在Android模拟器/设备上运行代码工作正常。如果我在“android junit java测试用例”上运行,同样的代码,我处理完所有请求后得到一个异常。例外是在readObject调用的服务器端。
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)`
问题 在iostream上读取/写入对象是否是正确的设计?
被修改
我将示例项目上传到4shared.com(http://www.4shared.com/archive/98gET_pV/Issue15426tar.html) 要么 (http://www.sendspace.com/file/v04zjp)
测试1(通过)
控制台输出
服务器套接字已打开/127.0.0.1
接受客户端套接字
创建输入流
创建输出流
读取对象创建
测试2(失败)
控制台输出
服务器套接字已打开/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)
答案 0 :(得分:1)
不确定这是否会导致此特定问题,但在创建对象流时应始终使用此顺序:
ObjectOutputStream
ObjectInputStream
我发现至少在服务器端首先创建了ObjectInputStream
并且没有刷新可能导致问题的流。
Here是关于该订单背后的主题和原因的更多信息。
答案 1 :(得分:0)
您应该选择1024以上的服务器端口,因为下面的所有端口都是为已知服务保留的。只需选择1024和65535之间的端口,然后查看它是否有效。
另外我建议你将ObjectInputStream包装成BufferedInputStream;可能一旦你的连接不稳定,它就会失败。
答案 2 :(得分:0)
我认为这是因为,您的客户端在执行
后退出objectOutputStream.writeObject(message) ;
因此,尝试在此行之后引入人工延迟并查看。
在所有情况下,当客户端/服务器关闭连接/终止程序时,如果等待任何输入,另一端将抛出此EOF异常(例如,inputObjectStream.readObject())
因此请确保在客户端终止之前服务器正确读取客户端写入的内容。所以在客户端引入一些延迟并看看。
答案 3 :(得分:0)
请在客户端刷新流。我希望能解决这个问题。