WebRTC android to android 应用笔记

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):**

这里写图片描述

这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值