家禾赤橙websocket最新相关的例子
/**
* 登录类型
* 0.设备登录
* 1.大屏人员登录
* 2.工控机登录
* 3.hbuilder手机客户端登录
*/
private String loginType;
/**
* 0:代表token登录
* 1:代表用户名密码登录
* 2:代表匿名登录
*/
private String loginMethod;
/**
* token
*/
private String token;
/**
* 帐户
*/
private String user;
/**
* 密码
*/
private String pwd;
/**
* 公司码
*/
private String companyCode;
/**
* 大屏接收的类型(指出type1~type8这个客户端需要接收的类型)
*/
private String acceptType;
/**
* 终端类型
* af:A端前端
* ab:A端后端
*/
private String endType;
/**
* 大屏接收的类型(指出type1~type8这个客户端需要接收的类型)
*/
private String acceptType;
0.由于原生态的js并不支持headers的传送方式,只有vue或是其它JS框架才支持headers传参方式,所以登录暂时使用参数传参方式;
原生态不支持headers方式的国外回答:
https://stackoverflow.com/questions/4361173/http-headers-in-websockets-client-api
let params='?loginType=1&loginMethod=0&companyCode=Com_777&token='+'tkstrXXXXXXXXXX';
var wsServer = 'ws://'+window.location.hostname+':8999/websocket'+params;
var websocket = new WebSocket(wsServer);
let params='?loginType=0&loginMethod=1&companyCode=Com_777&user='+'zhangsan'+'&pwd='+'123456';
var wsServer = 'ws://'+window.location.hostname+':8999/websocket'+params;
var websocket = new WebSocket(wsServer);
let params='?loginType=1&loginMethod=2&companyCode=Com_777&user='+'niming';
var wsServer = 'ws://'+window.location.hostname+':8999/websocket'+params;
var websocket = new WebSocket(wsServer);
let params='?loginType=2&loginMethod=2&companyCode=Com_777&user='+'niming';
var wsServer = 'ws://'+window.location.hostname+':8999/websocket'+params;
var websocket = new WebSocket(wsServer);
let params='?loginType=3&loginMethod=2&companyCode=Com_777&user='+'fxl';
var wsServer = 'ws://'+window.location.hostname+':8999/websocket'+params;
var websocket = new WebSocket(wsServer);
所有消息通信格式
{type:123,msg:{}}
type:代表协议种类
msg:代表通信内容,可以是字符串、对象、数组等
-5:代表心跳;
客户端发:{type:-5,msg:"ping"}
服务器回:{type:-5,msg:"pong"}
-1:代表服务器端返回给客户端的一些错误提示;
例如:
客户端登录时使用的token不正确:{type:-1,msg:"token validate fail!"}
客户端2小时没发送数据了,之后超时了:{type:-1,msg:"ALL_IDLE out of the time."}
0:代表成功信息;
登录成功,发送成功,接收成功,各种成功的提示!
1~无穷大:代表自定义的信息
自定义就是客户端与服务器之间任意定义的业务,例如:
{type:2,msg:{}}
{type:3,msg:{mytype:1,message:"test"}}
{type:4,msg:[{a:1},{a:2}]}
...........
Netty是 *一个异步事件驱动的网络应用程序框架,*用于快速开发可维护的高性能协议服务器和客户端。
官网地址:https://netty.io/
GitHub 地址: https://github.com/netty/netty
直接在springboot上面使用原生态的netty也是不友好的,所以我们需要yeauty
yeauty是一个整合springboot的netty-websocket-spring-boot-starter
官网地址:https://github.com/YeautyYE/netty-websocket-spring-boot-starter
Web Socket 是 HTML5 一种新的协议。它实现了浏览器与服务器全双工通信 (full-duplex)。一开始的握手需要借助HTTP请求完成。
Web Socket 复用了 HTTP 的握手通道。具体指的是,客户端通过 HTTP 请求与 Web Socket 服务端协商升级协议。协议升级完成后,后续的数据交换则遵照 Web Socket 的协议。
客户端:申请协议升级
首先,客户端发起协议升级请求。可以看到,采用的是标准的HTTP报文格式,且只支持 GET 方法。
重点请求首部意义如下:
- Connection: Upgrade:表示要升级协议
- Upgrade: websocket:表示要升级到 websocket 协议。
- Sec-WebSocket-Version: 13:表示websocket的版本。如果服务端不支持该版本,需要返回一个Sec-WebSocket-Versionheader,里面包含服务端支持的版本号。
- Sec-WebSocket-Key:与后面服务端响应首部的 Sec-WebSocket-Accept 是配套的,提供基本的防护,比如恶意的连接,或者无意的连接。
注意,上面请求省略了部分非重点请求首部。由于是标准的HTTP请求,类似Host、Origin、Cookie等请求首部会照常发送。在握手阶段,可以通过相关请求首部进行 安全限制、权限校验等。
服务端:响应协议升级
服务端返回内容如下,状态代码101表示协议切换。到此完成协议升级,后续的数据交互都按照新的协议来。
每个 header 都以 rn 结尾,并且最后一行加上一个额外的空行 rn。此外,服务端回应的HTTP状态码只能在握手阶段使用。过了握手阶段后,就只能采用特定的错误码。 注意:javascript原生代码对header不怎么支持(封装的vue.js可能有支持的、java支持)
Sec-WebSocket-Accept 的计算
Sec-WebSocket-Accept 根据客户端请求首部的Sec-WebSocket-Key计算出来.
计算公式为:
- 将 Sec-WebSocket-Key 跟 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 拼接。
- 通过 SHA1 计算出摘要,并转成 base64 字符串。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。