【问题标题】:Indicate to Go TCP Server that Java TCP Client Has Finished Writing to the Stream指示 Go TCP Server Java TCP Client 已完成写入 Stream
【发布时间】:2019-11-03 22:51:04
【问题描述】:

我正在编写一个连接到 Golang TCP 服务器的 Java TCP 客户端。

服务器使用以下代码从客户端读取消息:

func (tcpHandler TCPHandler) getClientMsgBytes(connection *net.TCPConn) ([]byte, error) {
    clientMsgBytes, err := ioutil.ReadAll(connection)
    if err != nil {            
        return nil, err
    }       

    return clientMsgBytes, nil
}

我的客户端使用以下代码向服务器发送消息:

try (Socket socket = new Socket("localhost", 9000)) {
    byte[] message = getMessage();

    DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream());

    outputStream.write(commandMessage);     

    // Read message from the sever...          
}

我的问题是,即使在消息的所有字节都已写入流之后,服务器仍在等待客户端写入其消息。这似乎是因为ioutil.ReadAll 函数正在等待io.EOF 错误作为停止从流中读取的信号。

如何告诉 Go 我已完成从 Java 向 TCP 流的写入?如果有帮助,我可以同时更改 Java TCP Client 和 Golang TCP Server 代码。

注意:服务器是这样写的,因为我们的 Go TCP Client 使用以下代码:

func writeToConnection(connection *net.TCPConn, tcpCommand structs.TCPCommand) error {
    messageBytes, err := json.Marshal(tcpCommand)
    if err != nil {
        err = merry.Wrap(err)
        return err
    }

    _, err = connection.Write(messageBytes)
    if err != nil {
        err = merry.Wrap(err)
        return err
    }

    err = connection.CloseWrite()
    if err != nil {
        err = merry.Wrap(err)
        return err
    }

    return nil
}

【问题讨论】:

  • 调用 shutdownOutput 匹配 Go 客户端。
  • @CeriseLimón 不幸的是,我的客户端在发送消息后无法关闭套接字,因为它还需要从服务器读取响应(只有在读取服务器消息后我才能关闭套接字)。我已经更新了我的问题以反映这一点,谢谢!
  • @CeriseLimón 从来不知道存在这样的功能。这可能只是工作! :) 请将此添加为答案,以便我可以接受它,如果它有效。谢谢!
  • @CeriseLimón 成功了!请将此添加为答案,以便我接受。谢谢!

标签: java go tcp client-server eof


【解决方案1】:

调用 shutdownOputput 匹配 Go 客户端中的代码。

【讨论】:

    猜你喜欢
    • 2016-08-26
    • 2020-10-11
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    • 2020-10-28
    • 2019-07-29
    相关资源
    最近更新 更多