1 通信 P2Pjava
1.1.net
關鍵字【java udp 打洞】code
參考文章 http://www.oschina.net/code/snippet_165555_17279server
關鍵代碼blog
package org.renlr.test; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class UDPServer { public static void main(String[] args) { try { DatagramSocket server = new DatagramSocket(2008); byte[] buf = new byte[1024]; DatagramPacket packet = new DatagramPacket(buf, buf.length); String sendMessage132 = ""; String sendMessage129 = ""; int port132 = 0; int port129 = 0; InetAddress address132 = null; InetAddress address129 = null; for (;;) { server.receive(packet); String receiveMessage = new String(packet.getData(), 0, packet.getLength()); System.out.println(receiveMessage); //接收到clientA if (receiveMessage.contains("132")) { port132 = packet.getPort(); address132 = packet.getAddress(); sendMessage132 = "host:" + address132.getHostAddress() + ",port:" + port132; } //接收到clientB if (receiveMessage.contains("129")) { port129 = packet.getPort(); address129 = packet.getAddress(); sendMessage129 = "host:" + address129.getHostAddress() + ",port:" + port129; } //兩個都接收到後分別A、B址地交換互發 if (!sendMessage132.equals("") && !sendMessage129.equals("")) { send132(sendMessage129, port132, address132, server); send129(sendMessage132, port129, address129, server); sendMessage132 = ""; sendMessage129 = ""; } } } catch (Exception e) { e.printStackTrace(); } } private static void send129(String sendMessage132, int port132, InetAddress address132, DatagramSocket server) { try { byte[] sendBuf = sendMessage132.getBytes(); DatagramPacket sendPacket = new DatagramPacket(sendBuf, sendBuf.length, address132, port132); server.send(sendPacket); System.out.println("消息發送成功!"); } catch (Exception e) { e.printStackTrace(); } } private static void send132(String sendMessage129, int port129, InetAddress address129, DatagramSocket server) { try { byte[] sendBuf = sendMessage129.getBytes(); DatagramPacket sendPacket = new DatagramPacket(sendBuf, sendBuf.length, address129, port129); server.send(sendPacket); System.out.println("消息發送成功!"); } catch (Exception e) { e.printStackTrace(); } } }
package org.renlr.test; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.SocketAddress; public class UDPClientB { public static void main(String[] args) { try { //向server發起請求 SocketAddress target = new InetSocketAddress("10.1.11.137", 2008); DatagramSocket client = new DatagramSocket(); String message = "I am UDPClientB 192.168.85.129"; byte[] sendbuf = message.getBytes(); DatagramPacket pack = new DatagramPacket(sendbuf, sendbuf.length, target); client.send(pack); //接收server的回覆內容 byte[] buf = new byte[1024]; DatagramPacket recpack = new DatagramPacket(buf, buf.length); client.receive(recpack); //處理server回覆的內容,而後向內容中的地址與端口發起請求(打洞) String receiveMessage = new String(recpack.getData(), 0, recpack.getLength()); String[] params = receiveMessage.split(","); String host = params[0].substring(5); String port = params[1].substring(5); System.out.println(host + ":" + port); sendMessage(host, port, client); } catch (Exception e) { e.printStackTrace(); } } //向UPDClientA發起請求(在NAT上打孔) private static void sendMessage(String host, String port, DatagramSocket client) { try { SocketAddress target = new InetSocketAddress(host, Integer.parseInt(port)); for (;;) { String message = "I am master 192.168.85.129 count test"; byte[] sendbuf = message.getBytes(); DatagramPacket pack = new DatagramPacket(sendbuf, sendbuf.length, target); client.send(pack); //接收UDPClientA回覆的內容 receive(client); } } catch (Exception e) { e.printStackTrace(); } } //收到UDPClientA的回覆內容,穿透已完成 private static void receive(DatagramSocket client) { try { for (;;) { //將接收到的內容打印 byte[] buf = new byte[1024]; DatagramPacket recpack = new DatagramPacket(buf, buf.length); client.receive(recpack); String receiveMessage = new String(recpack.getData(), 0, recpack.getLength()); System.out.println(receiveMessage); //記得從新收地址與端口,而後在以新地址發送內容到UPDClientA,就這樣互發就能夠了。 int port = recpack.getPort(); InetAddress address = recpack.getAddress(); String reportMessage = "I am master 192.168.85.129 count test"; //發送消息 sendMessage(reportMessage, port, address, client); } } catch (Exception e) { e.printStackTrace(); } } private static void sendMessage(String reportMessage, int port, InetAddress address, DatagramSocket client) { try { byte[] sendBuf = reportMessage.getBytes(); DatagramPacket sendPacket = new DatagramPacket(sendBuf, sendBuf.length, address, port); client.send(sendPacket); System.out.println("send success"); } catch (Exception e) { e.printStackTrace(); } } }