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

时间:2011-10-08 05:04:27

标签: java android iostream eof

我正在设计一个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(通过)

  1. TestServer项目,将其作为Java应用程序运行
  2. TestClient项目,将其作为Android应用程序运行
  3. 控制台输出

    服务器套接字已打开/127.0.0.1

    接受客户端套接字

    创建输入流

    创建输出流

    读取对象创建

    测试2(失败)

    1. TestServer项目,将其作为Java应用程序运行
    2. TestClient项目,将其作为Android Junit测试运行
    3. 控制台输出

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

4 个答案:

答案 0 :(得分:1)

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

  1. 创建ObjectOutputStream
  2. 冲洗
  3. 创建ObjectInputStream
  4. 我发现至少在服务器端首先创建了ObjectInputStream并且没有刷新可能导致问题的流。

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我认为这是因为,您的客户端在执行

后退出
objectOutputStream.writeObject(message) ;

因此,尝试在此行之后引入人工延迟并查看。

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

因此请确保在客户端终止之前服务器正确读取客户端写入的内容。所以在客户端引入一些延迟并看看。

答案 3 :(得分:0)

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