udp 内网穿透 互发消息
2015-08-07 14:00
246 查看
还差实现内网终端,向服务器发送请求,要对方的内网连接自己,实现打洞。在同一网段,或者公网运行,可以相互聊天。
没有实现检测客户端下线功能。
1,服务器代码
View Code
没有实现检测客户端下线功能。
1,服务器代码
package router; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashSet; import java.util.Set; import java.util.Timer; import java.util.TimerTask; public class HeartBeat { private static final long INTERVAL_TIME = 1 * 5 * 1000; private Timer timer; static Set<SocketAddress> dests = new HashSet(); DatagramSocket socket; public HeartBeat(DatagramSocket socket) { this.socket = socket; try { this.timer = new Timer(); this.timer.schedule(new ConnSvrTask(), 1000, INTERVAL_TIME); } catch (Exception e) { e.printStackTrace(); } } private class ConnSvrTask extends TimerTask { public ConnSvrTask() { super(); } public void run() { Set<SocketAddress> tmpDests = new HashSet<SocketAddress>(); byte[] b = "skip".getBytes(); // 发送心跳 println("====heartbeat===="); for (SocketAddress dest : dests) { println(dest.toString()); sendP2P("skip", dest); // DatagramPacket packet = new DatagramPacket(b, b.length); // packet.setSocketAddress(dest); // socket.send(packet); tmpDests.add(dest); } dests = tmpDests; } } private void sendP2P(String msg, SocketAddress dest) { try { ByteArrayOutputStream bous = new ByteArrayOutputStream(); ObjectOutputStream oos; oos = new ObjectOutputStream(bous); oos.writeObject(msg); oos.flush(); byte[] data = bous.toByteArray(); DatagramPacket sendip = new DatagramPacket(data, data.length); sendip.setSocketAddress(dest); socket.send(sendip); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void add(SocketAddress a){ dests.add(a); } public Set<SocketAddress> getDests() { return dests; } public void setDests(Set<SocketAddress> dests) { this.dests = dests; } SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd H:m:s"); public void println(String s) { System.out.println(format.format(new Date()) + ": " + s); } }
View Code