Одноранговый чат не получает / не отправляет сообщения - PullRequest
0 голосов
/ 10 мая 2019

Я пытаюсь создать одноранговые узлы, которые связаны друг с другом и могут отправлять / получать сообщения всем, к кому они подключены одновременно. Все они работают на одной машине. После подключения к одноранговому узлу и получения подключения к сокету, я запускаю два потока: один читает, а другой пишет. Однако readLine() блокируется бесконечно, и я не уверен, где проблема существует. Узлы успешно соединяются друг с другом, но обмен сообщениями не удается. Прерывание одного узла приводит к тому, что сообщение "null" читается от других подключенных к нему узлов.

РЕДАКТИРОВАТЬ : Использование autoflush = true в PrintWriter создает исключение "ConnectionReset" для других узлов, подключенных к прерванному узлу.

Я пытался дождаться начала потока чтения перед отправкой сообщения, получить соединение с сокетом с любого конца одноранговых узлов, сохранить потоки ввода / вывода в списках, хранящихся как переменные-члены, а также просто передать только сокет / все потоки к каждому потоку. Также пробовал разные способы чтения, показанные в комментариях в теме чтения.


class ConnectionListener extends  Thread{

        public void run(){

            try {
                while (!allPeersJoined()) {

                    Socket socket = null;
                    socket = peerServer.accept();



                    new PeerReader(socket).start();
                    new PeerWriter(socket).start();
                }

            }catch (IOException e){
                e.printStackTrace();
            }

        }

    }
}


    class PeerWriter extends Thread{


        PrintWriter writer;

        public PeerWriter(Socket socket){
            try {
                this.writer = new PrintWriter(socket.getOutputStream(), true);
            }catch (IOException e){
                e.printStackTrace();
            }

        }

        @Override
        public void run() {
            writer.println("Hello");
        }


    }

    class PeerReader extends Thread{

        BufferedReader reader;

        public PeerReader(Socket socket){
            try {
                this.reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            }catch (IOException e){
                e.printStackTrace();
            }

        }

        @Override
        public void run() {
            String input = "";


            System.out.println("Waiting to receive messages...");
            try {


                System.out.println(reader.readLine());


//                while((input = reader.readLine()) != null){
//                    System.out.println(input);
//                }

            }catch (IOException e){
                e.printStackTrace();
            }

        }
    }

РЕДАКТИРОВАТЬ : добавление создания сокетов


Thread t = new ConnectionListener();
t.start();

// Connect to all peers
for (String peer : peers) {
    new Socket("127.0.0.1", Integer.valueOf(peer));
}


1 Ответ

1 голос
/ 10 мая 2019

Вы создаете несколько сокетов, но затем никогда не используете их.

Сейчас ConnectionListener получает ваше соединение, отправляет байты на подключенные сокеты, но сокеты никогда не отвечают ... потому что вы никогда не говорили им.

Вы должны точно так же, как вы сделали это с ConnectionListener, создать объект с именем ClientConnection, который имеет свой собственный модуль записи и чтения.

...