1

I am using Socketto send a task from one server to another like so:

private boolean sendRequest(String address, int port) {
    boolean requestComplete = false;
    try {
        Socket socket = new Socket(address, port);
        ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
        oos.writeObject("task_to_complete");

        ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
        String msg = (String)ois.readObject();
        if(msg.equals("complete")){
            requestComplete = true;
        }
        ois.close();
        oos.close();
        socket.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return requestComplete;
}

The second server receives the task like so:

while (true) {

    // wait for connection
    Socket socket = serverSocket.accept();
    System.out.println("New connection accepted " + socket.getInetAddress() + ":" + socket.getPort());

    // retrieve request from server
    ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
    String msg = (String) ois.readObject();

    switch (msg) {
    case "task_to_complete":
        // do task 1
        break;
    }

    System.out.println("Task " + msg + " complete.");

    // send a message back to client with the result of the task it
    // requested
    PrintWriter out =
            new PrintWriter(socket.getOutputStream(), true);
        out.print("complete");
    ois.close();
    socket.close();
}

But I get the error

java.io.EOFException at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source)

when I attempt to read the message "complete" from the first server: ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());.

What is causing this error?

crmepham
  • 4,676
  • 19
  • 80
  • 155

2 Answers2

3

You messed up your protocol because

  • the server writes the response with PrintWriter.print("completed")
  • the client reads it with readObject()

I put a working demo on GitHub

Raffaele
  • 20,627
  • 6
  • 47
  • 86
0

try using

BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

String msg = in.readLine();

if(msg.equals("complete")){
        requestComplete = true;
    }

it worked for me in a similar situation

A. Steiner
  • 31
  • 6