WebRTC android to android 应用笔记
HTTP WebSocket Socket的关系:
HTTP(非持久化的,单向的网络协议)链接分为短链接,长链接,
短链接: 一个request对应一个response,每次请求都要三次握手才能发送自己的信息
长链接: HTTP请求头中添加一个字段 Connection: Keep-Alive实现。在一定的期限内保持链接,保持TCP连接不断开,必须要有客户端发起然后服务器返回结果。客户端是主动的,服务器是被动的
Connection:Keep-Alive,并不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间
WebSocket:
(同HTTP一样也是应用层的协议,但是它是一种双向通信协议,是建立在TCP之上可靠性传输协议)
只需要服务器和浏览器通过HTTP协议进行一个握手的动作,然后单独建立一条TCP的通信通道进行数据的传送
它实现了浏览器与服务器全双工通信(full-duplex)
Socket:
(Socket是传输控制层协议)
位于应用层和传输控制层之间的一组接口。
WebSocket API是HTML5标准的一部分,同时许多语言、框架和服务器都提供了WebSocket支持,如:
* 基于 Node.js 的 Socket.io
* 基于 C++ 的 WebSocket++
/××××××××××××××××××××××××××××××××××××××××××××××××××××/
WebRTC 的 Android 2 Android 实现(原文出处)
http://blog.csdn.net/youmingyu/article/details/53192714
Web 服务端:
ProjectRTC
— WebRTC Live Streaming on nodeJS
https://github.com/pchab/ProjectRTC
app.js:
//引入Nodejs express path等模块构建服务器
var io = require(‘socket.io’).listen(server); //socket.io, nodejs后台server应用websocket使用的框架
app/socketHandler.js:
实现服务器监听客户端,以及与客户端交互的接口
module.exports = function(io, streams) {
io.on('connection', function(client) {
...
if(streams.getStreams().length>0){
// 客户端连接服务器成功之后,发送首个客户端的client id信息给当前客户端,完成客户端到客户端的通道连接
client.emit('id2', streams.getOtherStream(client.id));
}else{
// 首个客户端连服务器接成功之后,发送回“其连接成功后的服务器端的连接标示--client id”
client.emit('id', client.id);
}
// 接收客户端发送消息
client.on('message', function (details) {
...
});
...
});
};
Android端:
AndroidRTC
—Android client for ProjectRTC - a WebRTC demo
https://github.com/pchab/AndroidRTC
RtcActivity.java:
// 局域网内测试:
// 两台android手机(ip0:192.168.1.2,ip1:192.168.1.4)+ PC(作web服务器,ip:192.168.1.3)
// 三者通过接入同一的wifi设备,构成局域网,所以我的R.string.host 更改为192.168.1.3
mSocketAddress = “http://” + getResources().getString(R.string.host);
mSocketAddress += (“:” + getResources().getString(R.string.port) + “/”); // web服务器访问地址
private void init() {
...
client = new WebRtcClient(this, mSocketAddress, params, VideoRendererGui.getEGLContext());
}
@Override
public void onCallReady(String callId) {
if (callerId != null) {
try {
answer(callerId);
} catch (JSONException e) {
e.printStackTrace();
}
} else {
call(callId);
}
}
@Override
public void onCallReady2(String callId) {
try {
answer(callId);
} catch (JSONException e) {
e.printStackTrace();
}
}
public void answer(String callerId) throws JSONException {
client.sendMessage(callerId, "init", null); //
startCam();
}
WebRtcClient.java:
public void sendMessage(String to, String type, JSONObject payload) throws JSONException {
JSONObject message = new JSONObject();
message.put("to", to); // RtcActivity.java的callId,callerId传入
message.put("type", type);
message.put("payload", payload);
client.emit("message", message);
// 信息传输对象为当前socket对应的client, 客户端发送信息
// socket.emit(event,data,function(data1,data2......){});
}
public WebRtcClient(RtcListener listener, String host, PeerConnectionParameters params, EGLContext mEGLcontext) {
...
MessageHandler messageHandler = new MessageHandler();
try {
client = IO.socket(host);
} catch (URISyntaxException e) {
e.printStackTrace();
}
// 设置监听接收,socket端口对象的on方法,对应emit方法
// socket.on(event,function(data,fn){});
// 首个接入服务器的客户端会收到服务器端client.emit('id', client.id)的"id"事件(须客户端连接服务器端成功)
client.on("id", messageHandler.onId);
// 第二个接入服务器的客户端会收到服务器端client.emit('id2', streams.getOtherStream(client.id))的"id2"事件(须客户端连接服务器端成功)
client.on("id2", messageHandler.onId2);
client.on("message", messageHandler.onMessage);
client.connect();
...
}
webrtc-client moudle:
build.gradle:
...
dependencies {
compile 'com.github.nkzawa:socket.io-client:0.4.2' //socket.io-client, websocket客户端
compile 'io.pristine:libjingle:8871@aar'
// Libjingle - Google Talk Voice及 P2P 的交互操作函数库,libjingle的UDP打洞是通过STUN/TURN协议实现
}
...
测试:
1、服务器端,命令行执行:
node app.js //然后开始侦听3000端口
2、android:
两台手机,根本点击运行AndroidRTC.apk,
成功,上面提到的命令行窗口会打印输出“– ** joined”信息,app上会显示对方传送的视频
**android(c) to pc(s) :**
**android to android(p2p):**