指示Go TCP Server Java TCP Client已完成写入流

时间:2019-06-21 05:41:32

标签: java go tcp client-server eof

我正在编写连接到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
}

1 个答案:

答案 0 :(得分:1)

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