socket 如今也出现在了 javascript 中,浏览器端有 html5 规范的 websocket
来完成客户端信息发送,服务器端则可以在 nodejs 平台上实现对应的服务器信息接收
(原生支持的异步io读取),而另一方面客户端 api 由 w3c 制定,具体的通信协议则由 IETF
指定,目前尚处于草稿阶段,最新的规范也已过期。
客户端发送:
目前只有 chrome 支持 websocket ,通过
var webSocket = new WebSocket('ws://xx.com:8081/');
来创建客户端 socket 对象,而具体通信协议则是采用更早的 draft-ietf-hybi-thewebsocketprotocol-00
。
通过 send 方法来发送 utf-8 编码的文本信息(二进制上尚不支持)。通过 onopen , onmessage 回调来获取服务器端的对应返回状态和数据。
基本原理:
首先是握手阶段(handshake):浏览器发送 http get 请求到对应 xx.com:8081 ,并携带对应协议头 :
注意最后的 (key3) 并不表示一个 http header,而是在头结束后第二行的8个字节为 0x7D 0x24 ....,这8字节不属于 header 部分,由于是 get 请求,也不属于 body部分,造成一般的 web 容器经过层层封装后应用根本读不出来。
服务器端然后设置返回状态码 101 ,并根据 sec-websocket-key1/2 以及最后的 8 个字节,计算出另外一个字符串回来确认(challenge response 为了安全?):
至此,握手完毕,该 http 链接的 tcp 链接保留,以后数据传输直接通过 socket 进行(也即提升为 websocket),不过数据开头以 0x00 开头,以 0xFF 结尾,服务器端也是如此,只不过浏览器端会自动进行数据解包,因而对应用透明。
服务器端接收:
服务器实际上是一个特殊的 web (http)服务器,不同于一般的 http server,应用完全不需要了解 http 底层的 tcp socket,在 websocket 请求时就要适当暴漏承载 http 链接的 tcp socket,所以目前的 servlet 容器例如 tomcat就不行了(不可能从 httpRequest 直接得到它关联的 socket,被 tomcat 屏蔽了,另一个原因是不能读到请求的 raw data 造成 key3 读不到),这才有了 jetty
经过改造后支持 websocket 的 servlet 容器,或者直接手写 websocket 专用服务器
。
nodejs 下实现
nodejs 的 http server 已经支持 websocket 的握手阶段,能够将握手阶段作为事件触发出来,并且读出 key3,一旦到了握手阶段,该 socket 就会暴露出来 :
server.on('upgrade', function(req, socket, upgradeHead) { });
这时应用就可以设置 socket 为 keepalive 一直保持打开状态:
socket.setKeepAlive(true, 0);
接下来就是读取对应的 key1 和 key2 以及 key3,计算需要返回的确认值,以及准备其他必要的信息头(origin,location...)发送到客户端
res = 'HTTP/1.1 101 WebSocket Protocol Handshake\r\n' +
'Upgrade: WebSocket\r\n' +
'Connection: Upgrade\r\n' +
'Sec-WebSocket-Origin: ' + websocket_origin(connection) + '\r\n' +
'Sec-WebSocket-Location: ' + location;
.......
connection._socket.write(res, 'binary');
完成了握手阶段后,客户端会直接通过 socket 发送信息,而服务器也会经过服务器端socket的data 事件来获取客户端信息处理:
socket.on('data', function(data) {
//todo
});
服务器通过 socket 的 write 来向客户端浏览器发送信息,这时也要将数据用 0x00 和 0xff 包裹起来:
Connection.prototype.write = function(data) {
return this.socket.write( '\u0000' + data + '\uffff');
};
问题:
使用 websocket 使得客户端和服务器端都可以重用同一个 tcp 链接,不用频繁建立销毁 http 链接,并且可以避免采用 http 请求冗余的头信息,大幅提高反应速度。但是估计会降低可访问的客户端数,毕竟服务器链接有限,都被早来的客户端占完了:(
Refer:
flash 模拟的 websocket
nodejs 的 websocket 服务器模块
websocket 介绍
客户端html5 api w3c规范
websocket IETF通信协议
如何通过握手建立连接
- 大小: 24.2 KB
- 大小: 7.7 KB
分享到:
相关推荐
即时聊天应用描述在Node js和socket.io的帮助下使用HTML和javascript制作的实时聊天应用程序预习运行程序$ git clone https://github.com/zaidajani/live-chat-app.git# Copy the project$ cd live-chat-app# Get ...
实例: <head> <script type="text/... } // Setup our socket in the div with the id="socket" socket.setup('#socket'); </script></body>}} 原文地址:http://code.google.com/p/jsocket/wiki/SimpleExample
Socket.IO Redis发射器 @socket.io/redis-emitter软件包使您可以轻松地与另一个Node.js进程(服务器端)中的一组Socket.IO服务器进行通信。 发射器还提供其他编程语言版本: Java: : Python: : ...
socket 地址结构 1. IPv4 的Socket 地址结构(定长) Struct in_addr{ In_addr_t s_addr; // 32 位IP 地址,网络字节序 } Struct sockaddr_in{ Uint8_t sin_len;//IPv4 为固定的16 字节长度 Sa_family_t sin_...
Smashing Node.js: JavaScript Everywhere equips you with the necessary tools to understand Node.js and its uses in developing efficient web apps. With more traditional web servers becoming obsolete, ...
使用express / socket.io https服务器JavaScript p2p组(定向)邻近语音演示简单对等方邻近语音聊天该项目的非邻近基础是demo-voice这是一个使用peerjs处理WebRTC的邻近团体语音聊天的演示。和socket.io来帮助客户端...
聊天应用程序是使用Flutter和Node.js使用Socket.io和Express.js构建的消息应用程序。 它可以作为在Heroku上部署的网站来使用,也可以作为移动应用程序来运行。 可从。 我还写了有关该应用程序的。 作者 :bust_in_...
we take an in-depth look at Vuex for state management and Vue Router to route in your single page applications, and integrate a variety of technologies ranging from Node.js to Electron, and Socket.io...
节点红色贡献socketcan 这是几个节点,可使用socketcan从中读取CAN帧并将CAN帧发送到CAN总线。...发送CAN帧 提供了socketcan-in节点用于发送CAN帧。 您可以发送标准或扩展ID帧,支持FD帧。 将接口设置为某些真实的CAN
we take an in-depth look at Vuex for state management and Vue Router to route in your single page applications, and integrate a variety of technologies ranging from Node.js to Electron, and Socket.io...
包括位于bin文件夹中的kinect2-socket.min.js文件: < script src =" kinect2-socket.min.js " > </ script > 初始化跟踪器和数据代理( ks.SocketStream或ks.Playback ): var tracker = new ks ...
flutter-socket.io-server:套接字快速基本服务器
Express.js is the most popular framework for building on top of Node.js, an exciting tool that is easy to use and allows you to build APIs and develop your backend in JavaScript. Express.js ...
Node.js is a server-side JavaScript platform using an event-driven, non-blocking I/O model allowing users to build fast and scalable data-intensive applications running in real time. This book gives ...
Socket.io-crud-app 小型Socket.io和Express.js应用程序。 应用程序使用Socket.io方法来检索,插入,更新和删除记录。 应用程序使用MySQL数据库存储...are in app/models/tags.js file Create appropriate table tag.
:bust_in_silhouette: 趣谈应用使用Node.js,Express和Socket.io和Vanilla JS在前端通过自定义UI与websockets进行实时聊天的应用程序 :laptop: 设置要运行此项目,请使用npm在本地安装它: 首先,请打开您的终端并...
使用 node.js express.js socket.io 创建的信使 #这是什么? 那是一个公开的开源聊天!!! 您可以在找到该应用程序 #如何在我的电脑上运行它? 首先安装 npm 和所有依赖,如 (npm install express.js) 和 (npm ...
You'll also work with Pug and Handlebars template engines, Stylus and LESS CSS lanaguages, OAuth and Everyauth libraries, and the Socket.IO and Derby libraries, and everything in between. This ...
Added "Menu"->"Lock CD-ROMs" Added "Menu"->"UnLock CD-ROMs" Block download of JavaScript (JS) files Block IRC traffic Block FTP traffic Added "Rules"->"ADS" TAB to manage regexes to block ADS links ...
Socket.io 基准测试设置'-w, --worker' 客户端实例数(进程) '-p, --packets' 并发连接组数'-c, --clients' 每个数据包的客户端数量'-d, --debug' 记录器调试'--help' 帮助设想服务器如果至少有 1 个客户,则随机在...