视频聊天APP
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的更多相关文章
- Android Camera 使用一例,视频聊天app
视频聊天的应用可以从下面的框图示意. 所以需要从camera获取视频数据(YUV420sp),压缩成H264/MPEG4/H263的包,再传递到对方.接收对方的压缩包,解压出来显示到LCD上. An ...
- 如何基于 ZEGO SDK 实现 Flutter 一对一音视频聊天应用?
之前的文章发布了ZEGO SDK实现Android端音视频通话应用的开发教程,不少开发者反馈很实用,能不能也出一版Flutter的教程. 有求必应,这不小编来了- 我们封装了ZEGO Flutter ...
- 使用WebRTC搭建前端视频聊天室——点对点通信篇
WebRTC给我们带来了浏览器中的视频.音频聊天体验.但个人认为,它最实用的特性莫过于DataChannel——在浏览器之间建立一个点对点的数据通道.在DataChannel之前,浏览器到浏览器的数据 ...
- 使用WebRTC搭建前端视频聊天室——信令篇
博客原文地址 建议看这篇之前先看一下使用WebRTC搭建前端视频聊天室——入门篇 如果需要搭建实例的话可以参照SkyRTC-demo:github地址 其中使用了两个库:SkyRTC(github地址 ...
- 使用WebRTC搭建前端视频聊天室——入门篇
http://segmentfault.com/a/1190000000436544 什么是WebRTC? 众所周知,浏览器本身不支持相互之间直接建立信道进行通信,都是通过服务器进行中转.比如现在有两 ...
- 循序渐进做项目系列(4)迷你QQ篇(2)——视频聊天!(附源码)
一·效果展示 源码派送:MiniQQ1.1 文字聊天的实现参见:循序渐进做项目系列(3):迷你QQ篇(1)——实现客户端互相聊天 二·服务端设计 对于实现视频聊天而言,服务端最核心的工作就是要构造多媒 ...
- 视频聊天室可以用php制作吗?
首先,告诉你单纯用php制作视频聊天室是实现不了的,需要配合其他技术手段一起操作,例如和FLASH配合,使用FLASH获取语音(FLASH可以获取访问端的设备,例如摄像头). PHP运行在服务器端,是 ...
- WebRTC实现网页版多人视频聊天室
因为产品中要加入网页中网络会议的功能,这几天都在倒腾 WebRTC,现在分享下工作成果. 话说 WebRTC Real Time Communication 简称 RTC,是谷歌若干年前收购的一项技术 ...
- 在线教学、视频会议 Webus Fox(1)文本、语音、视频聊天及电子白板基本用法
Webus Fox是基于网页的在线教学.视频会议软件,不用安装,直接使用.它提供文本.语音.视频聊天,文件共享.电子白板等功能. 1. 登录 访问 http://flash.webus.cn/#,用自 ...
随机推荐
- NAT 网络地址转换
NAT 网络地址转换(Network Address Translation) NAT(Network Address Translation,网络地址转换)是1994年提出的. 属接入广域网(WA ...
- Oracle 违反协议 OALL8 处于不一致状态
http://blog.sina.com.cn/s/blog_a45aac720100yu3h.html ERROR-util.JDBCExceptionReporter>: 违反协议ERROR ...
- ACM入门
1.给n个数字,将它们重新排序得到一个最大的数字 例子 4123 124 56 90--------------90561241235123 124 56 90 9------------990561 ...
- 设置maven默认的JDK版本
在pom文件中添加如下 : <build> <plugins> <plugin> <groupId>org.apache.maven.plugins&l ...
- 燕十八MySQL优化学习笔记
观察 show status; 里面的这三个参数;Queries Threads_connected Threads_running判断周期性变化 -------------------------- ...
- Android高手速成
第一部分 个性化控件(View) http://www.cnblogs.com/huwei0814/p/3796659.html 第二部分 工具库 http://www.cnblogs.c ...
- Django进阶篇(二)
中间件 解析 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后, django会根据自己的规则在合适的时机执行中间件中相应的方法. 在dja ...
- [转]云计算研究必备——精典Google论文
Google云计算技术奠定其在业界的领先地位,收集经典云计算技术公开文章供大家研究学习: 01)GFS-The Google File System 02) Bigtable - A Distribu ...
- 【解决】SharePoint 2013 with SP1安装问题及解决
安装环境 操作系统:Windows Server 2008 R2 SP1 安装包:SharePoint Server 2013 with SP1 问题及解决 I. 必备组件(prerequisitei ...
- inux grep 命令 搜索含有"zynq"字符的文件
使用命令grep -rl 'zynq' /work/xilinx/u-boot-xlnx-master (有引号)-r 选项表示递归(recursive)遍历所有子目录-l 选项表示只列出文件名 /w ...