Я пишу Java TCP Client, который подключается к Golang TCP Server.
Сервер использует следующий код для чтения сообщений от клиентов:
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, что я сделал запись в поток TCP из Java?Я могу изменить как коды 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
}