技术专题!浅谈WebSocket应用

Posted 通付盾移动安全实验室

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了技术专题!浅谈WebSocket应用相关的知识,希望对你有一定的参考价值。

WebSocket是一种在单个TCP连接上进行全双工通讯的协议。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

通过WebSocket定义可以了解到:

• WebSocket是一种网络通信协议;

•  建立在TCP协议之上;

•  允许服务端主动向客户端推送数据。

为什么需要WebSocket?

因为HTTP协议只能由客户端主动发起请求。在WebSocket协议之前,我们要实现即时通讯的功能只能使用AJAX轮询(每隔一段时间,就发出一个请求)等方式。轮询的效率是非常低的,而且也非常浪费资源。

轮询就类似于我们追电视剧的时候,每隔一天就需要去APP上查看是否有更新,而WebSocket协议则是APP在电视剧更新的时候主动给我们发送一条消息。

基本介绍

协议标识符是ws(如果加密,则为wss),服务器网址就是URL,

如:ws://example.com/wsapi

wss://secure.example.com/

Websocket使用和HTTP相同的TCP端口,可以绕过大多数防火墙的限制。默认情况下,Websocket协议使用80端口;运行在TLS之上时,默认使用443端口。Websocket通过HTTP/1.1协议的101状态码进行握手。

客户端API

WebSocket对象作为一个构造函数,用于新建WebSocket实例

var webSocket = new WebSocket('ws://localhost:8080');

WebSocket.readyState属性,只读属性readyState表示连接状态,可以是以下值:

•  WebSocket.CONNECTING:值为0,表示正在连接。

•  WebSocket.OPEN:值为1,表示连接成功,可以通信了。

•   WebSocket.CLOSING:值为2,表示连接正在关闭。

•   WebSocket.CLOSED:值为3,表示连接已经关闭,或者打开连接失败。

webSocket.onopen属性,用于指定连接成功后的回调函数。

webSocket.onopen = function(evnt) {
    console.log("链接服务器成功!")
};

webSocket.onclose属性,用于指定连接关闭后的回调函数。

webSocket.onclose = function(evnt) {
    console.log("与服务器断开了链接!")
}

webSocket.onmessage属性,用于指定收到服务器数据后的回调函数。

webSocket.onmessage = function(event) {
  var data = event.data;
  // 处理数据
};

webSocket.onerror属性,用于指定报错时的回调函数。

webSocket.onerror = function(evnt) {
     // handle error event
};

webSocket.send()方法,用于向服务器发送数据。

webSocket.send("Hello World!");

服务端的实现

由于WebSocket是一个协议,服务器具体怎么实现,取决于所用编程语言和框架本身。Node.js、Java、C++、Python 等多种语言都有自己的解决方案。

Java的web一般都依托于servlet容器。其中Tomcat7、Jetty7及以上版本均开始支持WebSocket

本篇文章采用node.js来实现服务端,略过安装node.js的过程,在项目空间下使用命令安装nodejs-websocket模块:

npm install --save nodejs-websocket

服务器端代码如下:

var log = console.log.bind(console);
var ws = require("nodejs-websocket"); //引入websocket模块
var server  = ws.createServer(function(conn){
    //服务端接收到消息后触发
    conn.on("text",function(msg){
        log("Recevied:"+msg); // 后台打印接受的信息
        // conn.sendText(msg); 向当前连接的客户端发生消息
        // 服务器就向全部客户端广播一条消息
        server.connections.forEach(function(connection) {
            connection.sendText(msg);
        });
    });
    conn.on("close",function(code,reason){
        log("Connection closed");
    });
    conn.on("error",function(err){
        log("Handle Error");
        log(err);
    });
}).listen(8009);

保存为index.js文件,然后运行命令:node index.js,此时服务器运行成功。

客户端的实现

客户端提供一个输入框用来输入消息,以及一个向服务端发生消息的按钮:

这时我们就完成了我们的聊天应用了。

互联网产品快速迭代更新,用户行为千变万化,攻击手段同时不断进化,通付盾移动安全实验室长期关注移动应用新技术,紧跟技术潮流变化,陆续推出机器学习、云计算、安卓逆向等移动安全技术,深耕移动安全领域,不断提升移动安全检测、加固、监测等防护能力。未来,我们还将持续推出更多更新技术专题,为移动互联网通过强有力的安全保障。

以上是关于技术专题!浅谈WebSocket应用的主要内容,如果未能解决你的问题,请参考以下文章

专题连载浅谈BIM之模块化设计,施工应用

2021-07-20 .NET高级班 114-直播项目专题(WebSocket实时统计排行榜)

可持久化专题——浅谈主席树:可持久化线段树

无线网络技术专题企业无线网络设备介绍

SpringBoot 企业级核心技术学习专题

无线网络技术专题企业WLAN网络典型组网架构分析