我希望借助具有静态IP的服务器与两个客户端进行UDP打孔.服务器在端口7070和7071上等待两个客户端.之后,它会相互发送IP地址和端口.这部分工作正常.但是我无法在两个客户之间建立通信.我在不同的Wifi网络和3G移动网络中尝试了代码.客户端程序抛出IO-Exception"无路由到主机".客户端代码用于两个客户端.一旦用7070端口执行,一次用7071执行.
您认为我是否正确实施了UDP打孔概念?有什么想法让它发挥作用?这是服务器代码,然后是客户端代码.
谢谢你的帮助.
服务器代码:
public class UDPHolePunchingServer { public static void main(String args[]) throws Exception { // Waiting for Connection of Client1 on Port 7070 // //////////////////////////////////////////////// // open serverSocket on Port 7070 DatagramSocket serverSocket1 = new DatagramSocket(7070); System.out.println("Waiting for Client 1 on Port " + serverSocket1.getLocalPort()); // receive Data DatagramPacket receivePacket = new DatagramPacket(new byte[1024], 1024); serverSocket1.receive(receivePacket); // Get IP-Address and Port of Client1 InetAddress IPAddress1 = receivePacket.getAddress(); int port1 = receivePacket.getPort(); String msgInfoOfClient1 = IPAddress1 + "-" + port1 + "-"; System.out.println("Client1: " + msgInfoOfClient1); // Waiting for Connection of Client2 on Port 7071 // //////////////////////////////////////////////// // open serverSocket on Port 7071 DatagramSocket serverSocket2 = new DatagramSocket(7071); System.out.println("Waiting for Client 2 on Port " + serverSocket2.getLocalPort()); // receive Data receivePacket = new DatagramPacket(new byte[1024], 1024); serverSocket2.receive(receivePacket); // GetIP-Address and Port of Client1 InetAddress IPAddress2 = receivePacket.getAddress(); int port2 = receivePacket.getPort(); String msgInfoOfClient2 = IPAddress2 + "-" + port2 + "-"; System.out.println("Client2:" + msgInfoOfClient2); // Send the Information to the other Client // ///////////////////////////////////////////////// // Send Information of Client2 to Client1 serverSocket1.send(new DatagramPacket(msgInfoOfClient2.getBytes(), msgInfoOfClient2.getBytes().length, IPAddress1, port1)); // Send Infos of Client1 to Client2 serverSocket2.send(new DatagramPacket(msgInfoOfClient1.getBytes(), msgInfoOfClient1.getBytes().length, IPAddress2, port2)); //close Sockets serverSocket1.close(); serverSocket2.close(); }
客户代码
public class UDPHolePunchingClient { public static void main(String[] args) throws Exception { // prepare Socket DatagramSocket clientSocket = new DatagramSocket(); // prepare Data byte[] sendData = "Hello".getBytes(); // send Data to Server with fix IP (X.X.X.X) // Client1 uses port 7070, Client2 uses port 7071 DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, InetAddress.getByName("X.X.X.X"), 7070); clientSocket.send(sendPacket); // receive Data ==> Format:"- " DatagramPacket receivePacket = new DatagramPacket(new byte[1024], 1024); clientSocket.receive(receivePacket); // Convert Response to IP and Port String response = new String(receivePacket.getData()); String[] splitResponse = response.split("-"); InetAddress ip = InetAddress.getByName(splitResponse[0].substring(1)); int port = Integer.parseInt(splitResponse[1]); // output converted Data for check System.out.println("IP: " + ip + " PORT: " + port); // close socket and open new socket with SAME localport int localPort = clientSocket.getLocalPort(); clientSocket.close(); clientSocket = new DatagramSocket(localPort); // set Timeout for receiving Data clientSocket.setSoTimeout(1000); // send 5000 Messages for testing for (int i = 0; i < 5000; i++) { // send Message to other client sendData = ("Datapacket(" + i + ")").getBytes(); sendPacket = new DatagramPacket(sendData, sendData.length, ip, port); clientSocket.send(sendPacket); // receive Message from other client try { receivePacket.setData(new byte[1024]); clientSocket.receive(receivePacket); System.out.println("REC: " + new String(receivePacket.getData())); } catch (Exception e) { System.out.println("SERVER TIMED OUT"); } } // close connection clientSocket.close(); }
更新 代码通常正常工作.我现在已经在两个不同的家庭网络中尝试了它并且它正在工作.但它不适用于我的3G或大学网络.在3G中,我验证了NAT正在将两个端口(客户端端口和路由器分配的端口)再次映射到一起,即使在关闭并打开clientSocket之后也是如此.有谁知道为什么它不工作呢?