iostream 和读/写对象调用的基础知识

2022-09-03 03:07:20

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

然后,我在客户端上使用写对象发出请求,在服务器上读取对象以接收请求。处理它,将对象写回与响应相同的流上,并在客户端读取对象上处理响应。

现在,如果我在Android模拟器/设备上运行代码,工作正常。如果我在“android junit java测试用例”上运行,那么在它处理我的所有请求后,我会得到一个异常。异常是在服务器端的读取对象调用。

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(通过)

  1. TestServer 项目,将其作为 Java 应用程序运行
  2. TestClient 项目,将其作为 Android 应用程序运行

控制台输出

服务器套接字已打开/127.0.0.1

接受客户端套接字

已创建输入流

已创建输出流

读取已创建对象

测试 2(失败)

  1. TestServer 项目,将其作为 Java 应用程序运行
  2. 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)

答案 1

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

  1. 创造ObjectOutputStream
  2. 冲洗它
  3. 创造ObjectInputStream

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

以下是有关此订单背后的主题和原因的更多信息。


答案 2

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

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


推荐