【问题标题】:Peer-to-peer chat not receiving/sending messages点对点聊天不接收/发送消息
【发布时间】:2019-05-10 11:17:00
【问题描述】:

我正在尝试创建相互连接的对等点,并且能够向他们同时连接的每个人发送/接收消息。它们都在同一台机器上运行。一旦连接到对等点并获得套接字连接,我将启动两个线程,一个正在读取,一个正在写入。但是,readLine() 无限期地阻塞,我不确定问题出在哪里。对等方成功连接,但消息交换失败。中断一个对等点会导致从与其连接的其他对等点读取"null" 消息。

编辑:在PrintWriter 中使用autoflush = true 会将"ConnectionReset" 异常抛出到连接到中断对等点的其他对等点。

我尝试在发送消息之前等待读取线程启动,从对等端的任一端获取套接字连接,将输入/输出流存储在存储为成员变量的列表中,并且只传递套接字/所有流到每个线程。也尝试了不同的阅读方式,在阅读线程中以 cmets 显示。


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));
}


【问题讨论】:

  • 能否得到socket的创建以及服务器读取和发送消息的方式?您是否尝试过在写入器之后立即使用 flush() ?
  • 添加了套接字创建。我尝试使用 flush 导致相同的异常(与 printWriter 构造函数中的 autoFlush = true 相同的行为)。读取/发送消息在 2 个线程中完成

标签: java multithreading sockets p2p


【解决方案1】:

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

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

您应该以与 ConnectionListener 相同的方式创建一个名为 ClientConnection,它有自己的写入器和读取器。

【讨论】:

  • 我不确定你的意思。我创建了 2 个其他线程,一个用于读取,另一个用于写入,将套接字传递给这些线程并创建读取器和写入器。在那里我告诉他们分别读和写。
  • for (String peer : peers) { new Socket("127.0.0.1", Integer.valueOf(peer));这些套接字连接到您的 ConnectionPeers,但不发送数据。 Reader/Writer 类仅在您的服务器类“ConnectionListerner”中链接。因此,当连接了一个“客户端”(普通套接字)时,您的服务器确实发送了您代码中的字节,但您的客户端套接字不做任何事情来读取它。打印也是如此,一旦连接了客户端套接字,它什么也不做。
  • Sami Tahri 是正确的,你所说的也是正确的,但是你正在做的是在服务器端收到一些东西,你必须首先在你的客户端写,目前只是一个也永远不会关闭的套接字连接(这就是导致异常的原因)你永远不会在这个套接字连接上写,所以不会读取任何行。尝试为客户端创建一个新的 PeerWriter 并调用 socket.close()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-31
  • 1970-01-01
  • 1970-01-01
  • 2015-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多