# netty-websocket-client **Repository Path**: luanxiaodong/netty-websocket-client ## Basic Information - **Project Name**: netty-websocket-client - **Description**: 提供一个netty版的websocket客户端,可以断线重连接 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 8 - **Forks**: 8 - **Created**: 2020-05-18 - **Last Updated**: 2023-12-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 家禾赤橙 websocket-server =========================== #### Description 家禾赤橙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

1. 举例:大屏人员登录,并且用token方式 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);
2. 举例:设备人员登录,并且用户名密码方式登录 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);
3. 举例:大屏人员登录,并且匿名式登录 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);
4. 举例:工控机登录,并且匿名式登录 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);
5. 举例:hbuilder手机登录,并且匿名式登录 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);
#### Instructions 1. 服务器与客户端互通消息 所有消息通信格式
{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}]}
...........

技术扫盲 =========================== #### 1. 什么是 netty ? > Netty是 *一个异步事件驱动的网络应用程序框架,*用于快速开发可维护的高性能协议服务器和客户端。 > > 官网地址:[https://netty.io/](https://netty.io/) > > GitHub 地址: [https://github.com/netty/netty](https://github.com/netty/netty) > > 直接在springboot上面使用原生态的netty也是不友好的,所以我们需要yeauty > > yeauty是一个整合springboot的netty-websocket-spring-boot-starter > > 官网地址:[https://github.com/YeautyYE/netty-websocket-spring-boot-starter](https://github.com/YeautyYE/netty-websocket-spring-boot-starter) #### 2. 什么是 websocket? > Web Socket 是 HTML5 一种新的协议。它实现了浏览器与服务器全双工通信 (full-duplex)。**一开始的握手需要借助HTTP请求完成**。 > Web Socket 复用了 HTTP 的握手通道。具体指的是,客户端通过 HTTP 请求与 Web Socket 服务端协商升级协议。协议升级完成后,后续的数据交换则遵照 Web Socket 的协议。 > > 1. 客户端:申请协议升级 > > 首先,客户端发起协议升级请求。可以看到,采用的是标准的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等请求首部会照常发送。在握手阶段,可以通过相关请求首部进行 安全限制、权限校验等。 > > > > 2. 服务端:响应协议升级 > > 服务端返回内容如下,状态代码101表示协议切换。到此完成协议升级,后续的数据交互都按照新的协议来。 > > 每个 header 都以 rn 结尾,并且最后一行加上一个额外的空行 rn。此外,服务端回应的HTTP状态码只能在握手阶段使用。过了握手阶段后,就只能采用特定的错误码。 > 注意:javascript原生代码对header不怎么支持(封装的vue.js可能有支持的、java支持) > > > 3. Sec-WebSocket-Accept 的计算 > > Sec-WebSocket-Accept 根据客户端请求首部的Sec-WebSocket-Key计算出来. > > 计算公式为: > > 1. 将 Sec-WebSocket-Key 跟 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 拼接。 > 2. 通过 SHA1 计算出摘要,并转成 base64 字符串。