对等聊天不接收/发送消息

时间:2019-05-10 11:17:00

标签: java multithreading sockets p2p

我正在尝试创建相互连接的对等方,并能够向每个并发连接的人发送/接收消息。它们都在同一台计算机上运行。连接到对等方并获得套接字连接后,我将启动两个线程,一个正在读取,另一个正在写入。但是,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 个答案:

答案 0 :(得分:1)

您正在创建多个套接字,但是从不使用它们。

现在,ConnectionListener得到您的连接,在连接的套接字上发送字节,但是套接字从未响应...因为您从未告诉过它们。

您应该以与ConnectionListener相同的方式,创建一个名为 ClientConnection,具有自己的作者和读者。

相关问题