视频聊天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/#,用自 ...
随机推荐
- PowerProfile.java与power_profile.xml
转载自http://blog.csdn.net/green1900/article/details/42427871 现在诸多关于电池管理的应用做的极其绚烂,可实现如耗电应用排行.剩余时间计算.关闭耗 ...
- Cassandra 介绍
cassandra是一种NoSQL数据库,No是指No Relational.cassandra的数据模型结合了Dynamo的key/value和BigTable 的面向列的特点,主要被设计为存储大 ...
- maven添加仓库地址
mvn install时,好多包从mvn中央库下载不下来,搜索到一个maven库地址:http://conjars.org/repo/,将其添加到maven仓库中 编辑 conf/setting.xm ...
- PHP语法基础
1.PHP语法基础 PHP标记符 <?php ?> 常亮与变量 $a = 10; 变量 可以在运行过程中修改 $a = 10; $a = 20; $b = 5; echo $a+$b; c ...
- XXX esx.problem.syslog.nonpersistent.formatOnHost not found XXX
ESXi 主机的摘要选项卡报告以下错误:配置问题:XXX esx.problem.syslog.nonpersistent.formatOnHost 未找到 XXX (2101811) Sympt ...
- 记录一下emacs在window下的配置过程
今天重装WIN7 64位新系统,装完发现emacs无法加载以前的插件了.网上搜一下才记起来,emacs默认读取的配置文件在c盘,在这个原始配置文件中还需要添加一些路径转换的语句才能转到用户自己的配置文 ...
- 解决java文件编码和windows7系统(中文版)默认编码冲突所导致的乱码情况
开篇从一个比较简单但是也比较蛋疼的问题开始吧. 背景介绍:我是新手小白,初学java. 问题介绍:在使用UTF-8编码格式写java文件时,编译出现问题. 原因分析:1.java文件的编码格式是UTF ...
- Ionic发布成android
目前环境 1.ant的版本是1.9.4 2.jdk的版本是1.7 3.ionic安装版本是1.5.5 4.cordova版本是5.1.1 经测试,虽然ionic上面写的支持的最低版本是android- ...
- ASP.NET网站中获取当前虚拟目录的应用程序目录的方法(转)
[原创]ASP.NET网站中获取当前虚拟目录的应用程序目录的方法 ASP.NET网站中获取当前虚拟目录的应用程序目录的方法1.问题描述:有时候,某个网页控件会被不同目录下文件使用,此时如果该控件中有一 ...
- 安装了多个Oracle11g的客户端,哪个客户端的tnsnames.ora会起作用?
如果我们由于需要安装了多个Oracle的client,哪个客户端的tnsnames.ora会起作用呢? 答案是: 在安装好clinent端后,安装程序会把client的bin目录放到path里面,pa ...