BufferedReader не получает сообщение через сокет - PullRequest
0 голосов
/ 24 ноября 2011

Ситуация такова, что существует 4 «вспомогательных» потока, каждый из которых связан со всеми помощниками (включая самого себя).Я действительно автозапуск.Ниже this.id - это int, используемый для идентификации помощника, выполняющего код.В отладке я наблюдал, как помощник 0 отправлял сообщение самому себе (отправляя по всем соединениям), но когда он должен получить сообщение (по соединению 0), он действует так, как будто его BufferedReader имеет пустой буфер.

Решено: Woops У меня был недостаток дизайна.Я удостоверился, что каждый помощник сохранил только один сокет на каждого помощника, с которым он должен общаться, но это неправильно, когда помощник соединяется с собой.В этом случае сохранение только одного сокета означает, что другая конечная точка связи (с самим собой) потеряна.

Моя программа вращается здесь вечно (должен быть пустой буфер):

        boolean clientStreamReady = false;
        boolean helperStreamReady = false;
        while (!(clientStreamReady || helperStreamReady)) {
            clientStreamReady = this.inFromClient.ready();
            helperStreamReady = this.helperIns.get(this.id).ready();

            if (clientStreamReady) {
                message = this.inFromClient.readLine();
            }
            else if (helperStreamReady){
                message = this.helperIns.get(this.id).readLine();
            }
        }

здесь сообщение «широковещательно»:

    for (PrintWriter out : this.helperOuts) {
        out.println(this.id + "," + kind + "," + this.clock.getTime());
    }

IO из сокетов, настроенный до того, как было сделано выше, выполняется здесь:

    for (Socket socket : this.helperSockets) {
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            this.helperOuts.add(out);
            this.helperIns.add(in);
    }

Если необходим код установки сокета, сообщитея и я добавлю это.

1 Ответ

1 голос
/ 24 ноября 2011

У ваших PrintWriters включена автоматическая промывка?Если нет, то простая out.flush () в конце вашего цикла широковещания может уже сработать.

...