向 TCP 服务器指示 Java TCP 客户端已完成写入流
Indicate to Go TCP Server that Java TCP Client Has Finished Writing to the Stream
我正在编写一个 Java 连接到 Golang TCP 服务器的 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 客户端和 Golang TCP 服务器代码。
注意: 服务器是这样写的,因为我们的 Go TCP 客户端使用以下代码:
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
}
调用shutdownOputput匹配Go客户端中的代码
我正在编写一个 Java 连接到 Golang TCP 服务器的 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 客户端和 Golang TCP 服务器代码。
注意: 服务器是这样写的,因为我们的 Go TCP 客户端使用以下代码:
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
}
调用shutdownOputput匹配Go客户端中的代码