Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-P2P多播聊天程序-在对等方之间实现1-1聊天时出错_Java_Sockets_P2p - Fatal编程技术网

Java-P2P多播聊天程序-在对等方之间实现1-1聊天时出错

Java-P2P多播聊天程序-在对等方之间实现1-1聊天时出错,java,sockets,p2p,Java,Sockets,P2p,我正在使用Java套接字实现一个P2P多播聊天程序。首先,这是我的目标:在一个有许多客户端的网络中,我希望每个客户端都能够与另一个客户端进行1-1聊天(一次多个客户端,但仅1-1聊天)。 这是我目前的代码: 首先,在向服务器注册后,客户端将启动自己的“服务器”,用于处理来自其他客户端的1-1连接 Thread starter = new Thread(new ClientListenerStart()); starter.start(); 下面是ClientListenerStart类的代

我正在使用Java套接字实现一个P2P多播聊天程序。首先,这是我的目标:在一个有许多客户端的网络中,我希望每个客户端都能够与另一个客户端进行1-1聊天(一次多个客户端,但仅1-1聊天)。 这是我目前的代码:

  • 首先,在向服务器注册后,客户端将启动自己的“服务器”,用于处理来自其他客户端的1-1连接

    Thread starter = new Thread(new ClientListenerStart());
    starter.start();
    
    • 下面是
      ClientListenerStart
      类的代码:

      public class ClientListenerStart implements Runnable {
      public void run() {
          currentConnectedClientsWriter = new ArrayList();
          currentChattingUsers = new ArrayList<String>();
          try {
              // create a ServerSocket to listen to another clients' requests
              ServerSocket serverSock = new ServerSocket(port);
              while (true) {
                  Socket _clientSocket = serverSock.accept();
                  PrintWriter _clientWriter = new PrintWriter(_clientSocket.getOutputStream());
                  currentConnectedClientsWriter.add(_clientWriter);
                  Thread clientToClientHandler = new Thread(new ClientToClientHandler(_clientSocket, _clientWriter));
                  clientToClientHandler.start();
              } // end while
          } // end try // end try
          catch (Exception ex) {
              System.out.println("ERROR at server: ServerStart > run " + ex.toString());
          } // end catch
      } // end go()
      
      public class ClientToClientHandler implements Runnable {
              Socket clientSock;
              //declare buffer & writer used for communicate with CLIENT
              BufferedReader clientReader;
              PrintWriter clientWriter;
              public ClientToClientHandler(Socket clientSocket, PrintWriter _clientPrintWriter) {
                  // new inputStreamReader and then add it to a BufferedReader
                  clientWriter = _clientPrintWriter;
                  try {
                      clientSock = clientSocket;
                      InputStreamReader isReader = new InputStreamReader(clientSock.getInputStream());
                      clientReader = new BufferedReader(isReader);
                  } // end try
                  catch (Exception ex) {
                      System.out.println("ERROR at client: ClientToClientHandler constructor " + ex.toString());
                  } // end catch
              } // end ClientToClientHandler()
              public void run() {
                  String stream;
                  try {
                      while ((stream = clientReader.readLine()) != null) {
                          System.out.println("CLIENT " + username +"'s stream from another client: " + stream);
                          switch (getMsgType(stream)) {
                              // this part handle the requestMsg from another client
                          }
                      }
                  } catch (Exception ex) {
                      System.out.println("ERROR at client: IncomingReaderClient > run " + ex.toString());
                  }
              }
          }
      
    • 这是
      ClientToClientHandler
      类的代码:

      public class ClientListenerStart implements Runnable {
      public void run() {
          currentConnectedClientsWriter = new ArrayList();
          currentChattingUsers = new ArrayList<String>();
          try {
              // create a ServerSocket to listen to another clients' requests
              ServerSocket serverSock = new ServerSocket(port);
              while (true) {
                  Socket _clientSocket = serverSock.accept();
                  PrintWriter _clientWriter = new PrintWriter(_clientSocket.getOutputStream());
                  currentConnectedClientsWriter.add(_clientWriter);
                  Thread clientToClientHandler = new Thread(new ClientToClientHandler(_clientSocket, _clientWriter));
                  clientToClientHandler.start();
              } // end while
          } // end try // end try
          catch (Exception ex) {
              System.out.println("ERROR at server: ServerStart > run " + ex.toString());
          } // end catch
      } // end go()
      
      public class ClientToClientHandler implements Runnable {
              Socket clientSock;
              //declare buffer & writer used for communicate with CLIENT
              BufferedReader clientReader;
              PrintWriter clientWriter;
              public ClientToClientHandler(Socket clientSocket, PrintWriter _clientPrintWriter) {
                  // new inputStreamReader and then add it to a BufferedReader
                  clientWriter = _clientPrintWriter;
                  try {
                      clientSock = clientSocket;
                      InputStreamReader isReader = new InputStreamReader(clientSock.getInputStream());
                      clientReader = new BufferedReader(isReader);
                  } // end try
                  catch (Exception ex) {
                      System.out.println("ERROR at client: ClientToClientHandler constructor " + ex.toString());
                  } // end catch
              } // end ClientToClientHandler()
              public void run() {
                  String stream;
                  try {
                      while ((stream = clientReader.readLine()) != null) {
                          System.out.println("CLIENT " + username +"'s stream from another client: " + stream);
                          switch (getMsgType(stream)) {
                              // this part handle the requestMsg from another client
                          }
                      }
                  } catch (Exception ex) {
                      System.out.println("ERROR at client: IncomingReaderClient > run " + ex.toString());
                  }
              }
          }
      
      这是“我的当前错误”的描述: 在服务器上注册3个客户端:A、B和C后:

    • 客户端A正常连接并与客户端B聊天。(一)

    • 然后客户端A正常连接并与客户端C聊天。(二)

      • 问题在于:在(2)之后,客户机A仍然可以向客户机B和客户机C发送消息。但是当客户机B尝试与A进行1-1聊天时,B的所有消息都显示在A与C的聊天窗口中。所以我认为客户端A只使用一个通道来监听从其他客户端发送的消息。但我还不知道如何修复它

    这个问题我已经讨论了好几个小时了,真的希望你们能帮忙!任何帮助都将不胜感激。非常感谢您的光临

    我不是很直截了当的回答,但有两件事,(1)A不是已经连接到B了吗?那么为什么B要建立与A的新连接,而B只能通过已建立的连接发送MSG呢?(2) 当然,每个客户端都需要有不同的端口,因此a->B[端口10],a->C[端口11],B->C[端口16]。。。etcif如果你想使用1个端口,你必须实现你自己的协议,它可能简单,也可能复杂,在建立连接时首先进行握手,这样对等方交换一些唯一的ID,这个ID可以与套接字和聊天窗口相关联(使用映射或列表),从现在开始,发送给对等方的所有消息都应包含该ID,以便接收方可以知道此消息属于哪个窗口。。。