Сокет Java многократная запись и чтение - PullRequest
0 голосов
/ 13 июня 2018

Я хочу написать клиент, который может общаться с Vowpal Wabbit по TCP.По сути, мне нужно отправлять сообщения типа a b | c d e на хост VW через порт 26542. VW отвечает сообщением типа 0.400000 0.200000 0.200000 0.200000 (не уверен, как заканчивается сообщение).

Итак, мне нужно сделать это несколькоtimes - отправить сообщение, получить сообщение, отправить сообщение, получить сообщение и т. д.

У меня есть следующий код в Java.

public class MyClient {
    protected String host;
    protected int port;
    protected Socket socket;
    protected PrintWriter outputWriter;
    protected BufferedReader inputReader;

    public MyClient(String host, int port) throws IOException {
        socket = new Socket(host, port);
        outputWriter = new PrintWriter(socket.getOutputStream());
        inputReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    }

    public void send(final String message) throws IOException {
        outputWriter.print(message+"\n"); // important to add a newline
        outputWriter.flush();

        String responseStr = inputReader.readLine();
        System.out.println(responseStr);
        if (StringUtils.isBlank(responseStr)) {
            return;
        }
    }
}

Я использую этот класс следующим образом:

MyClient client = new MyClient("host_ip", 26542); // the port used by VW
client.send("1:0.5:0.3 | feature11 feature21 feature31");
client.send("1:0.5:0.3 | feature12 feature22 feature32");
client.send("1:0.5:0.3 | feature13 feature23 feature33");

При использовании приведенного выше кода печатается только ответ первой отправки.Два других ответа возвращаются null.

Я также пытался использовать только код "отправить":

    public void send(final String message) throws IOException {
        outputWriter.print(message+"\n"); // important to add a newline
        outputWriter.flush();
    }

Оказывается, отправляется только первое сообщение (у меня есть способпроверка / регистрация на стороне сервера того, что он получает от моего клиента).

Почему только первая отправка успешна, но все остальные отправляются неудачно (хотя исключение не возникает)?Как мне это исправить?

1 Ответ

0 голосов
/ 13 июня 2018

Если readLine() возвращает ноль, одноранговый узел закрыл соединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...