Java-P2P多播聊天程序-在对等方之间实现1-1聊天时出错
我正在使用Java套接字实现一个P2P多播聊天程序。首先,这是我的目标:在一个有许多客户端的网络中,我希望每个客户端都能够与另一个客户端进行1-1聊天(一次多个客户端,但仅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类的代
- 首先,在向服务器注册后,客户端将启动自己的“服务器”,用于处理来自其他客户端的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()
这是“我的当前错误”的描述: 在服务器上注册3个客户端:A、B和C后: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()); } } }
- 客户端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,以便接收方可以知道此消息属于哪个窗口。。。 - 下面是