【问题标题】:How to read socket response after writing to ObjectOutputStream?写入 ObjectOutputStream 后如何读取套接字响应?
【发布时间】:2016-01-20 23:25:49
【问题描述】:

我正在使用Socket将任务从一台服务器发送到另一台服务器,如下所示:

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;
}

第二台服务器接收任务如下:

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();
}

但我得到了错误

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

当我尝试从第一台服务器读取“完成”消息时: ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());.

是什么导致了这个错误?

【问题讨论】:

    标签: java sockets


    【解决方案1】:

    你搞砸了你的协议,因为

    • 服务器用PrintWriter.print("completed")写响应
    • 客户端用readObject()读取它

    我放了一个working demo on GitHub

    【讨论】:

      【解决方案2】:

      尝试使用

      BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
      
      String msg = in.readLine();
      
      if(msg.equals("complete")){
              requestComplete = true;
          }
      

      它在类似情况下对我有用

      【讨论】:

      • 这给了我一个NullPointerException 代表“味精”。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-28
      • 1970-01-01
      • 2020-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多