eofException при настройке потока

Я пытаюсь отправить строку в сервлет из java-программы и получить ту же строку с некоторым дополнением. Вот код, над которым я работаю, и проблема в том, что java.io.EOFException возникает при создании входного потока в программе Java.
почему происходит конец потока, когда я его настраиваю. пожалуйста, развейте мои сомнения.

Программа сервлета

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ProgServlet implements Servlet {
public void init(ServletConfig sc){
}
public void service (ServletRequest req,ServletResponse res)
throws ServletException, java.io.IOException
{

}
public void destroy(){

}
public ServletConfig getServletConfig() {
    // TODO Auto-generated method stub
    return null;
}
public String getServletInfo() {
    // TODO Auto-generated method stub
    return null;
}

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    System.out.println("doPost");
    //Setting up streams
    ObjectInputStream ois = new ObjectInputStream(request.getInputStream());
    ObjectOutputStream oos = new ObjectOutputStream(response.getOutputStream());
    String p = "Server String";
    //Receiving data from client and resends by padding
    try {
        p =  (String) ois.readObject();
        p = p.concat(" -sever padding");
        oos.writeObject(p);
        oos.flush();
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    finally{
    }

}

}

Java-программа на клиенте

public static void main(String arg[]) throws IOException{
    System.out.println("Enter a string :");
    Scanner s = new Scanner(System.in);
    String data = s.next();
    s.close();
    URL serv = null;
    try {
        serv = new URL("http://10.0.0.9:8080/project/projectservlet");
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    HttpURLConnection servletConnection = null;
    System.out.println("establishing communication with server....");
    try {
        servletConnection = (HttpURLConnection) serv.openConnection();
        System.out.println("connection with the server established"+servletConnection.getRequestMethod());
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    try {
        servletConnection.setRequestMethod("POST");
    } catch (ProtocolException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    System.out.println(""+servletConnection.getRequestMethod());
    servletConnection.setDoOutput(true);
    servletConnection.setRequestProperty("Content-Type", "application/octet-stream");

    System.out.println("setting up streams to communicate...");
    ObjectOutputStream dos = null;
    ObjectInputStream dis = null;
    try {
        dos = new ObjectOutputStream(servletConnection.getOutputStream());


        System.out.println("Streams are up and ready to go");
        System.out.println("Sending data to the server...");
        dos.flush();
        dos.writeObject(data);
         dos.flush();
         System.out.println("Data sent successfullyy \n Retrieving data from server");
         dis = new ObjectInputStream(servletConnection.getInputStream());
         data = (String) dis.readObject();
         System.out.println("Data retrieved from the server is "+data);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    finally{
        dos.close();
        dis.close();
        servletConnection.disconnect();
    }
}

вывод и трассировка стека

Enter a string : jaggu
establishing communication with server....
connection with the server established
GET
POST
setting up streams to communicate...
Streams are up and ready to go
Sending data to the server...
Data sent successfully
Retrieving data from server
java.io.EOFException
at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(Unknown Source)
at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
at java.io.ObjectInputStream.<init>(Unknown Source)
at ServletInvokation.main(ServletInvokation.java:57)
Exception in thread "main" java.lang.NullPointerException
at ServletInvokation.main(ServletInvokation.java:69)


person jagadeesh    schedule 05.02.2014    source источник


Ответы (2)


В Java-клиенте выходной поток представляет собой запрос, отправленный на сервер, а входной поток представляет собой ответ, полученный от сервера. Когда вы вызываете servletConnection.getInputStream(), вы запрашиваете ответ у сервера, поэтому он немедленно отправляет HTTP-запрос на сервер. Но если вы посмотрите на свой код, в этот момент вы еще ничего не записали в поток вывода, поэтому вы фактически пытаетесь отправить пустой запрос, и поэтому вы получаете EOFException.

Вместо этого попробуйте сделать это в два этапа. Сначала получите выходной поток, напишите в него и закройте. Затем получите входной поток и прочитайте его.

См. также этот ответ.

person David Levesque    schedule 05.02.2014
comment
я изменил эти утверждения и все та же проблема. dis.available()=0 я узнал - person jagadeesh; 05.02.2014
comment
Пожалуйста, опубликуйте свой последний код и полную трассировку стека ошибки. - person David Levesque; 05.02.2014
comment
обновил код и добавил вывод и трассировку стека. взгляните на это и дайте мне знать мою ошибку. Спасибо - person jagadeesh; 05.02.2014
comment
До сервера доходит? Вы видите что-то в журнале сервера? - person David Levesque; 05.02.2014
comment
10.0.0.9 - - [06 февраля 2014:00:00:03 +0530] POST /project/projectservlet HTTP/1.1 200 - 10.0.0.9 - - [06 февраля 2014:00:16:18 +0530] POST /project/projectservlet HTTP/1.1 200 — это то, что я получил в журнале. Код 200 означает, что все в порядке, верно? - person jagadeesh; 05.02.2014
comment
В сервлете попробуйте прочитать и закрыть входной поток перед получением выходного потока. Это все, о чем я могу думать... - person David Levesque; 06.02.2014

Закройте OutPutStream в сервлете после завершения работы сервлета.

person Htaras    schedule 07.02.2014