# 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 字符串。