1 通讯 P2P

1.1

关键字【java udp 打洞】

参考文章 http://www.oschina.net/code/snippet_165555_17279

关键代码

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();
}
}
}

  

视频聊天APP的更多相关文章

  1. Android Camera 使用一例,视频聊天app

    视频聊天的应用可以从下面的框图示意.  所以需要从camera获取视频数据(YUV420sp),压缩成H264/MPEG4/H263的包,再传递到对方.接收对方的压缩包,解压出来显示到LCD上. An ...

  2. 如何基于 ZEGO SDK 实现 Flutter 一对一音视频聊天应用?

    之前的文章发布了ZEGO SDK实现Android端音视频通话应用的开发教程,不少开发者反馈很实用,能不能也出一版Flutter的教程. 有求必应,这不小编来了- 我们封装了ZEGO Flutter ...

  3. 使用WebRTC搭建前端视频聊天室——点对点通信篇

    WebRTC给我们带来了浏览器中的视频.音频聊天体验.但个人认为,它最实用的特性莫过于DataChannel——在浏览器之间建立一个点对点的数据通道.在DataChannel之前,浏览器到浏览器的数据 ...

  4. 使用WebRTC搭建前端视频聊天室——信令篇

    博客原文地址 建议看这篇之前先看一下使用WebRTC搭建前端视频聊天室——入门篇 如果需要搭建实例的话可以参照SkyRTC-demo:github地址 其中使用了两个库:SkyRTC(github地址 ...

  5. 使用WebRTC搭建前端视频聊天室——入门篇

    http://segmentfault.com/a/1190000000436544 什么是WebRTC? 众所周知,浏览器本身不支持相互之间直接建立信道进行通信,都是通过服务器进行中转.比如现在有两 ...

  6. 循序渐进做项目系列(4)迷你QQ篇(2)——视频聊天!(附源码)

    一·效果展示 源码派送:MiniQQ1.1 文字聊天的实现参见:循序渐进做项目系列(3):迷你QQ篇(1)——实现客户端互相聊天 二·服务端设计 对于实现视频聊天而言,服务端最核心的工作就是要构造多媒 ...

  7. 视频聊天室可以用php制作吗?

    首先,告诉你单纯用php制作视频聊天室是实现不了的,需要配合其他技术手段一起操作,例如和FLASH配合,使用FLASH获取语音(FLASH可以获取访问端的设备,例如摄像头). PHP运行在服务器端,是 ...

  8. WebRTC实现网页版多人视频聊天室

    因为产品中要加入网页中网络会议的功能,这几天都在倒腾 WebRTC,现在分享下工作成果. 话说 WebRTC Real Time Communication 简称 RTC,是谷歌若干年前收购的一项技术 ...

  9. 在线教学、视频会议 Webus Fox(1)文本、语音、视频聊天及电子白板基本用法

    Webus Fox是基于网页的在线教学.视频会议软件,不用安装,直接使用.它提供文本.语音.视频聊天,文件共享.电子白板等功能. 1. 登录 访问 http://flash.webus.cn/#,用自 ...

随机推荐

  1. 在Ubuntu14.04系统POWER8服务器上搭建Docker Registry服务

    本文描述了如何在POWER8服务器上搭建一个本地化的Docker镜像仓库,主要涉及镜像制作,Docker Registry服务启动等.希望能够对在非X86服务器上搭建Docker仓库的同学提供参考. ...

  2. js嵌套对象相等比较的一种方法 (原创)

    做前端开发经常会遇到比较js对象是否相等的情况, 或者说其它问题往往会归结到这个问题上来:比如对象数组的去重复. 网上看到过很多例子, 但是基本上都是那种比较简单的对象结构, 而复杂的对象结构,比如对 ...

  3. HTML5 History API实现无刷新跳转

    在HTML5中, 新增了通过JS在浏览器历史记录中添加项目的功能. 在不刷新页面的前提下显示改变浏览器地址栏中的URL. 添加了当用户单击浏览器的后退按钮时触发的事件. 通过以上三点,可以实现在不刷新 ...

  4. 拥抱高效、拥抱 Bugtags 之来自用户的声音(三)

    小编按:这是一篇 Bugtags 用户来稿,主要是介绍了使用 Bugtags 前后对测试及解决 Bug 所带来的变化,感谢山西农业大学 - 高正炎同学对 Bugtags 的信赖和支持.小编在这里诚邀各 ...

  5. 13 年的 Bug 调试经验总结

    在<Learning From Your Bugs>一文中,我写了关于我是如何追踪我所遇到的一些最有趣的bug.最近,我回顾了我所有的194个条目(从13岁开始),看看有什么经验教训是我可 ...

  6. 【转】Oracle AWR 配置查看

    源地址:http://blog.sina.com.cn/s/blog_439628be0101d7l3.html

  7. 【转载】变更MySql数据存储路径的方法

    1.在mysql安装目录下找到my.ini文件,更改#Path to the database root datadir="希望存放数据的地址" 2.将默认存放路径(一般为&quo ...

  8. Burp SuiteBurp Suite使用详解

    http://www.2cto.com/Article/201209/153312.html Burp Suite是Web应用程序测试的最佳工具之一,其多种功能可以帮我们执行各种任务.请求的拦截和修改 ...

  9. C++设计模式-Proxy代理模式

    Proxy代理模式 作用:为其他对象提供一种代理以控制对这个对象的访问. 代理的种类: 如果按照使用目的来划分,代理有以下几种: 远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代 ...

  10. win7双系统安装ubuntu并配置常用软件

    首先在win7下磁盘清理出来空间具体方法找度娘就行了. 下面开始准备安装: 1.下载easyBCD 2.打开:添加新条目--NeoGub--安装 3.点击配置  修改menu.lst title In ...