Ошибка сокета ввода / вывода (Java) - PullRequest
0 голосов
/ 13 марта 2012

У меня проблема с использованием сокета:

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

Я проверил "is" не равно NULL (с ​​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

Ответы [ 2 ]

1 голос
/ 13 марта 2012

Мое первое предположение состоит в том, что получаемый вами входной поток не является действительным объектом потоком. ObjectInputStream распознается определенным заголовком потока.

Однако важно не только понять это исключение, но и научиться анализировать исключения и сбои. Я предлагаю следующее:

  1. Проверьте вывод вашей программы (файлы журнала или консоль). Посмотрите, показывает ли он точный тип исключения и полную трассировку стека.
  2. Используйте отладчик. Поместите точку останова в проблемную строку, остановитесь там с помощью отладчика, а затем переходите к коду, пока не доберетесь до исключения.

EDIT:

Трассировка стека показывает, что ObjectInputStream пытается прочитать значение short из входного потока, но в потоке больше нет данных. Похоже, сервер не отправляет данные, которые вы ожидаете. (Или просто не отправляет никаких данных.)

Чтобы проанализировать данные, которые вы получаете из сокета, вы можете временно изменить код, чтобы он считывал из входного потока и выводил содержимое (например, на System.out). Или вы можете использовать сетевой анализатор (например, Wireshark ), который покажет вам весь сетевой трафик между вашей машиной и сервером.

0 голосов
/ 14 марта 2012

Чтобы немного расширить ответ Эли, входной поток не только не является действительным ObjectInputStream, выдаваемым ObjectOutputStream на одноранговом узле, но и пустым.Одноранговый узел закрыл соединение, не создав на нем ObjectOutputStream и не выполнив никаких операций ввода-вывода.

...