Укажите для сервера TCP, что клиент Java TCP завершил запись в поток - PullRequest
0 голосов
/ 21 июня 2019

Я пишу 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
}

1 Ответ

1 голос
/ 21 июня 2019

Вызовите shutdownOputput , чтобы сопоставить код в клиенте Go.

...