【问题标题】:I/O Socket error (Java)I/O 套接字错误 (Java)
【发布时间】:2012-03-30 01:26:30
【问题描述】:

我在使用套接字时遇到问题:

        socket = new Socket(hostname, port);
        os = socket.getOutputStream();
        oos = new ObjectOutputStream(os);
        is = socket.getInputStream();
        ois = new ObjectInputStream(is);  // THIS ALWAYS RAISES EXCEPTION

我检查了“is”不为空(使用 println): java.net.SocketInputStream@403a7c5e

IOexception 消息为:null

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.my.Comunication.sendData(Netw.java:140)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:616)
        at com.sun.xml.ws.api.server.InstanceResolver$1.invoke(InstanceResolver.java:246)
        at com.sun.xml.ws.server.InvokerTube$2.invoke(InvokerTube.java:146)
        at com.sun.xml.ws.server.sei.EndpointMethodHandler.invoke(EndpointMethodHandler.java:257)
        at com.sun.xml.ws.server.sei.SEIInvokerTube.processRequest(SEIInvokerTube.java:95)
        at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:629)
        at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:588)
        at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:573)
        at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:470)
        at com.sun.xml.ws.server.WSEndpointImpl$2.process(WSEndpointImpl.java:295)
        at com.sun.xml.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:515)
        at com.sun.xml.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:285)
        at com.sun.xml.ws.transport.http.servlet.ServletAdapter.handle(ServletAdapter.java:143)
        at com.sun.xml.ws.transport.http.servlet.WSServletDelegate.doGet(WSServletDelegate.java:155)
        at com.sun.xml.ws.transport.http.servlet.WSServletDelegate.doPost(WSServletDelegate.java:189)
        at com.sun.xml.ws.transport.http.servlet.WSServlet.doPost(WSServlet.java:76)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
        at java.lang.Thread.run(Thread.java:636)

有人知道发生了什么吗?谢谢。

编辑:对象是 ObjectInputStream

【问题讨论】:

    标签: java sockets io ioexception


    【解决方案1】:

    为了扩展 Eli 的回答,输入流不仅不是由对等点的ObjectOutputStream 生成的有效ObjectInputStream,而且也是空的。对等方已关闭连接,根本没有在其上实例化 ObjectOutputStream,也没有执行任何 I/O。

    【讨论】:

      【解决方案2】:

      我的第一个猜测是你得到的输入流不是一个有效的 object 流。 ObjectInputStream 被特定的流标头识别。

      重要的是不仅要理解这个异常,还要学习如何分析异常和失败。我建议如下:

      1. 检查程序的输出(日志文件或控制台)。查看它是否显示了确切的异常类型和完整的堆栈跟踪。
      2. 使用调试器。在有问题的行设置断点,使用调试器停止,然后单步执行代码,直到遇到异常。

      编辑:

      堆栈跟踪显示ObjectInputStream 尝试从输入流中读取short 值,但该流中没有更多数据。听起来服务器没有发送您期望的数据。 (或者它根本不发送任何数据。)

      为了分析您从套接字接收的数据,您可以临时更改代码,以便它从输入流中读取并转储内容(例如到System.out)。或者您可以使用网络嗅探器(例如Wireshark),它会显示您的机器和服务器之间的所有网络流量。

      【讨论】:

      • 是的,对不起。我添加了真正的堆栈跟踪。它说“EOF”......嗯......我真的不知道为什么,因为我什至没有开始阅读。我会研究一下。有什么建议吗?
      • 您没有开始阅读,但 ObjectInputStream 代码开始阅读。请参阅上面的编辑。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-24
      • 2012-02-22
      • 2021-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-27
      相关资源
      最近更新 更多