您的位置:首页 > 其它

udp 内网穿透 互发消息

2015-08-07 14:00 246 查看
还差实现内网终端,向服务器发送请求,要对方的内网连接自己,实现打洞。在同一网段,或者公网运行,可以相互聊天。

没有实现检测客户端下线功能。

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: