udp 内网穿透 互发消息
还差实现内网终端,向服务器发送请求,要对方的内网连接自己,实现打洞。在同一网段,或者公网运行,可以相互聊天。
没有实现检测客户端下线功能。
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.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.net.SocketException;
import java.util.HashSet;
import java.util.Set; public class Server {
// private Set<InetSocketAddress> clients= new HashSet();
DatagramSocket socket;
HeartBeat heart; Server(){
try {
socket = new DatagramSocket(9090);
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} public void startServer(){
try { while(true){
byte[] buf = new byte[1024]; DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
InetAddress addr=packet.getAddress();
int port = packet.getPort(); InetSocketAddress address = new InetSocketAddress(addr,port);
heart.add(address);
send(heart.getDests(), address); String s = address + " is comming.";
notifyClients(s);
}
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
private void send(Object clients, SocketAddress client) throws IOException {
ByteArrayOutputStream bous = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bous);
oos.writeObject(clients);
oos.flush(); byte[] data= bous.toByteArray();
DatagramPacket sendip = new DatagramPacket(data, data.length);
sendip.setSocketAddress(client);
socket.send(sendip); } void notifyClients(String s){ for( SocketAddress client:heart.getDests()){
try {
send(s, client);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} public static void main(String[] args) {
Server server =new Server();
server.heart = new HeartBeat(server.socket);
server.startServer();
} }
2,客户端
package router; import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.net.SocketException;
import java.util.Set; import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField; public class Client extends Thread {
String serverip = "211.100.75.221";//"192.168.11.100";//
private SocketAddress server = new InetSocketAddress(serverip, 9090);
DatagramSocket socket; JTextArea jta_receive = new JTextArea(10, 50); JComboBox jta_addList = new JComboBox(); public Client() {
try {
socket = new DatagramSocket();
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} public void run() {
try { while (true) {
byte[] buf = new byte[1024]; DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
// log(new String(buf,buf.length));
read(packet.getData());
}
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } private void read(byte[] data) throws IOException, ClassNotFoundException {
ByteArrayInputStream bous = new ByteArrayInputStream(data);
ObjectInputStream oos = new ObjectInputStream(bous);
Object obj = oos.readObject(); if (obj instanceof Set) {
Set<InetSocketAddress> clients = (Set) obj;
jta_addList.removeAll();
jta_addList.removeAllItems(); for (InetSocketAddress it : clients) {
log(" add item:"+ it);
jta_addList.addItem(it);
}
}else if(obj instanceof String){
String ss =(String) obj;
if(!ss.startsWith("skip")){
jta_receive.append(ss);
jta_receive.append("\r\n");
}
}
}
void log(String s){
System.out.println(s);
}
void setUpUI() {
JFrame jf = new JFrame("p2p test");
jf.setLayout(new FlowLayout());
jf.setSize(700, 400); JButton jb_get = new JButton("get others ip");
jf.add(jb_get);
jf.add(jta_addList);
jb_get.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
sendRequestMsg("getaddress"); } }); JLabel la_name = new JLabel("received:");
JLabel la_user = new JLabel("sendto:"); final JTextField jtf_send = new JTextField(20);
JButton bu_send = new JButton("send"); JScrollPane js = new JScrollPane(jta_receive); jf.add(la_name);
jf.add(js);
jf.add(la_user);
jf.add(jtf_send);
jf.add(bu_send); ActionListener sendListener = new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
String msg = jtf_send.getText();
InetSocketAddress dest = (InetSocketAddress) jta_addList
.getSelectedItem();
sendP2P(msg, dest);
jtf_send.setText("");
} }; bu_send.addActionListener(sendListener);
jtf_send.addActionListener(sendListener); jf.setVisible(true);
jf.setDefaultCloseOperation(3); } private void sendRequestMsg(String s) {
try {
byte[] buf = s.getBytes();
DatagramPacket packet; packet = new DatagramPacket(buf, buf.length, server); socket.send(packet); } catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} private void sendP2P(String msg, InetSocketAddress 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 static void main(String[] args) {
Client sender = new Client();
sender.start();
sender.setUpUI(); } }
3,心跳类
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);
}
}
udp 内网穿透 互发消息的更多相关文章
- udp内网穿透 两个内网互联
1,在有外网ip的机器上启动server. package udp; import java.net.DatagramPacket; import java.net.InetSocketAddress ...
- UDP 内网穿透 心跳
参考:http://blog.csdn.net/jacman/article/details/ 1: 启动一个Server. 2: 启动两个Client. 然后从Server端的Console里边可以 ...
- 内网穿透&UDP打洞
这两天找度度重新回忆了一下关于内网穿透的事情,在百度文库上找到了两三篇写的比较通俗易懂的文章,把内网穿透做个简单总结. 首先文章建议 Cone NAPT 还有希望,要是 Symmetri NAPT 就 ...
- 手写内网穿透服务端客户端(NAT穿透)原理及实现
Hello,I'm Shendi. 这天心血来潮,决定做一个内网穿透的软件. 用过花生壳等软件的就知道内网穿透是个啥,干嘛用的了. 我们如果有服务器(比如tomcat),实际上我们在电脑上开启了服务器 ...
- 基于C#的内网穿透学习笔记(附源码)
如何让两台处在不同内网的主机直接互连?你需要内网穿透! 上图是一个非完整版内外网通讯图由内网端先发起,内网设备192.168.1.2:6677发送数据到外网时候必须经过nat会转换成 ...
- 使用FRP做内网穿透
Github地址:https://github.com/fatedier/frp 什么是FRP? frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,为 http 和 h ...
- 一款带Web面板的轻量级、高性能内网穿透工具:nps使用教程
说明:内网穿透工具之前已经介绍了不少了,比如Frp.lanproxy.Holer等,现在再介绍个带Web面板的穿透工具nps,之前叫easyProxy,只是改名了而已,该工具是一款使用go语言编写的轻 ...
- frp内网穿透学习
前言 因为自己在内网,但是目标站在外网,这时候可以通过内网穿透工具,将接收到的请求转发到内网,实现在内网的msf可以控制外网的靶机. 也看了一些Ngrok,花生壳的,发现Ngrok.cc这个看文章说有 ...
- 如何使用 frp 实现内网穿透
这有一个专注Gopher技术成长的开源项目「go home」 背景 作为一名程序员,家里多多少少会有一些落了灰的电脑,如果把闲置的电脑变成服务器,不仅有良好的配置,还能用来做各种测试,那就再好不过了. ...
随机推荐
- 过滤掉combobox里名称相同的选项
var pname = ""; $('#PartName').combobox({ reload: url, formatter: function (row) {//过滤comb ...
- 使用CuteSlider做网站炫酷的幻灯片
cuteSlider 1.预览 官网:http://www.cuteslider.com/ 应用:http://www.dutphonelab.org/ 2.资料 文档:http://pan.baid ...
- 认识实验室信息管理系统(LIMS)
在当今互联网如日中天的大环境下,各种伴随着互联网的产物如p2p,o2o在如火如荼的进行着,吸引了大量的开发人员都涌向了这个行业,所有的技术似乎都在围绕着互联网发展,传统行业软件开发的人气和关注度就相形 ...
- 005医疗项目-模块一:用户的查找:1.用户表查询的sql语句
这是医疗项目的第一个模块:做一个用户的查询,可以根据用户的账号,用户的名称,单位的名称,用户的类型去查询.要求效果如下:
- 命令行参数(argc, argv)
每个C语言程序都必须有一个称为main()的函数,作为程序启动的起点.当执行程序时,命令行参数(command-line argument)(由shell逐一解析)通过两个入参提供给main()函数. ...
- [iOS翻译]《iOS7 by Tutorials》系列:iOS7的设计精髓(上)
简介: 本文翻译自<iOS7 by Tutorials>一书的第一章“Designing for iOS 7”,主要从程序员角度介绍了iOS7的新设计理念,堪称神作!本文翻译仅作学习交流之 ...
- WebAPI使用多个xml文件生成帮助文档(转)
http://www.cnblogs.com/idoudou/p/xmldocumentation-for-web-api-include-documentation-from-beyond-the- ...
- Brief introduce to Iometer
<本人原创,纯粹为了练习英文博客的写作.转载请注明出处谢谢!非技术博客 http://shiyanch.lofter.com/ > *:first-child { margin-top: ...
- 从0开始学Java——@override的作用
早上跟着<jsp&Servlet学习笔记>来学习jsp,在使用eclipse创建了一个servlet类之后,发现自动创建的类和书上相比,doGet方法的前面少了@override, ...
- 【java基础】IOC介绍及其简单实现
控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心. 控制反转一般分为两种类型,依赖注入 ...