首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >iostream和read/writeObject调用的基础知识

iostream和read/writeObject调用的基础知识
EN

Stack Overflow用户
提问于 2011-10-08 13:04:27
回答 4查看 2.1K关注 0票数 17

我正在设计一个java服务器来响应多个客户端请求。因此,该设计基本上有一个服务器套接字,接受客户端套接字,从客户端输入/输出流创建一个inputObjectStream和一个outputObjectStream。

然后,我在客户机上使用writeobject发出请求,在服务器上使用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(通过)

安卓应用程序项目,将其作为Java Application

  • TestClient项目运行,并作为
  1. TestServer

运行。

控制台输出

服务器套接字打开的/127.0.0.1

客户端套接字已接受

已创建输入流

已创建输出流

已创建读取对象

测试2(失败)

单元测试项目,将其作为Application

  • TestClient项目运行,并将其作为Android Junit

运行

控制台输出

服务器套接字打开的/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)
EN

回答 4

Stack Overflow用户

发布于 2012-03-01 05:30:32

不确定这是否会导致此特定问题,但在创建对象流时应始终使用此顺序:

创建ObjectInputStream

  1. Create

it

我看到,至少在服务器端,您首先创建了ObjectInputStream,并且没有刷新流,这可能会导致您的问题。

Here是关于这个主题和这个订单背后的原因的更多信息。

票数 1
EN

Stack Overflow用户

发布于 2012-02-24 21:44:34

您应该选择大于1024的服务器端口,因为下面的所有端口都是为已知服务保留的。只需在1024和65535之间选择一个端口,然后看看它是否可以工作。

另外,我建议您将ObjectInputStream封装到BufferedInputStream中;可能一旦您的连接不稳定,它就会失败。

票数 0
EN

Stack Overflow用户

发布于 2012-03-01 02:20:58

我认为这是因为,您的客户端在执行完后退出

objectOutputStream.writeObject(message) ;

所以试着在这一行后面引入人为延迟,看看。

在所有情况下,当客户机/服务器关闭连接/终止程序时,如果另一端正在等待任何输入(例如,inputObjectStream.readObject()),则另一端将抛出此EOF异常

因此,请确保在客户端终止之前,服务器能够正确读取客户端写入的任何内容。因此,在客户端引入一些延迟,然后查看。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7694934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档