# web.socket.server 库模块帮助文档

## web.socket.server 成员列表 <a id="web.socket.server" href="#web.socket.server">&#x23;</a>

支持单线程异步的WebSocket服务端  
可直接在界面线程中使用，不会阻塞界面，不需要创建多线程  
支持 Ping/Pong 帧心跳，客户端Pong帧单向心跳,  
可调用close函数断线，并可调用connect函数实现重析连接服务器

### web.socket.server.getSecAccept() <a id="web.socket.server.getSecAccept" href="#web.socket.server.getSecAccept">&#x23;</a>
获取WebSocket客户端配对密钥，  
参数指定服务端HTTP头中sec-websocket-accept返回的值

### web.socket.server.getSecKey() <a id="web.socket.server.getSecKey" href="#web.socket.server.getSecKey">&#x23;</a>
获取WebSocket客户端密钥

### web.socket.server.sha1() <a id="web.socket.server.sha1" href="#web.socket.server.sha1">&#x23;</a>
使用sha1算法取哈希值，并使用Base64编码为普通文本

## web.socket 成员列表 <a id="web.socket" href="#web.socket">&#x23;</a>

### web.socket.server() <a id="web.socket.server" href="#web.socket.server">&#x23;</a>
[返回对象:websocketserverObject](#websocketserverObject)

## websocketserverObject 成员列表 <a id="websocketserverObject" href="#websocketserverObject">&#x23;</a>

### websocketserverObject._beforeStop <a id="websocketserverObject._beforeStop" href="#websocketserverObject._beforeStop">&#x23;</a>

```aardio
websocketserverObject._beforeStop = function(){
	/*服务端关闭以前触发  
此回调函数是标准库保留接口  
用户不应使用此回调*/
}
```

### websocketserverObject._onClientClosed <a id="websocketserverObject._onClientClosed" href="#websocketserverObject._onClientClosed">&#x23;</a>

```aardio
websocketserverObject._onClientClosed = function(hSocket){
	/*客户端连接已经关闭时触发，  
hSocket 参数为客户端连接套接字句柄，  
此函数在连接断开后一定会被触发，  
此回调函数是标准库保留接口，  
用户不应使用此回调*/
}
```

### websocketserverObject._translateMessage <a id="websocketserverObject._translateMessage" href="#websocketserverObject._translateMessage">&#x23;</a>
此回调函数的参数与onMessage相同,  
如果定义了这个回调函数,  
那么此函数将在调用onMessage之前被调用,  
如果此回调返回true则不再触发onMessage,  
这个函数提供了一个机会用于自动处理客户端消息  
,为其他需要扩展web.socket.server功能的库所预留，  
一旦定义将不能修改

### websocketserverObject.beforeStop <a id="websocketserverObject.beforeStop" href="#websocketserverObject.beforeStop">&#x23;</a>

```aardio
websocketserverObject.beforeStop = function(){
	/*服务端关闭以前触发*/
}
```

### websocketserverObject.client() <a id="websocketserverObject.client" href="#websocketserverObject.client">&#x23;</a>
[返回对象:tcpaclientObject](https://www.aardio.com/zh-cn/doc/library-reference/wsock/tcp/asyncClient.html#tcpaclientObject)

### websocketserverObject.client(hSocket) <a id="websocketserverObject.client" href="#websocketserverObject.client">&#x23;</a>
使用 @hSocket 参数指定的客户端连接套接字句柄  
获取 wsock.tcp.client 对象

### websocketserverObject.clientCount() <a id="websocketserverObject.clientCount" href="#websocketserverObject.clientCount">&#x23;</a>
当前WebSocket客户端数目  
包含正在连接或正在断开连接的客户端  
不含已关闭的客户端

### websocketserverObject.close(hSocket,code,reason) <a id="websocketserverObject.close" href="#websocketserverObject.close">&#x23;</a>
关闭连接,  
@hSocket 参数指定客户端连接套接字句柄

### websocketserverObject.getLocalIp() <a id="websocketserverObject.getLocalIp" href="#websocketserverObject.getLocalIp">&#x23;</a>
返回当前绑定的本地 IP,端口号

### websocketserverObject.getLocalPort() <a id="websocketserverObject.getLocalPort" href="#websocketserverObject.getLocalPort">&#x23;</a>
返回当前绑定的本地端口号

### websocketserverObject.getRemoteIp(hSocket) <a id="websocketserverObject.getRemoteIp" href="#websocketserverObject.getRemoteIp">&#x23;</a>
返回客户端IP地址,端口,  
@hSocket 参数指定客户端连接套接字句柄

### websocketserverObject.getUrl() <a id="websocketserverObject.getUrl" href="#websocketserverObject.getUrl">&#x23;</a>
获了服务端网址,可选指定目录或文件路径  
注意参数第一个字符不需要指定斜杠  
如果参数@2为true，IP "0.0.0.0"替换为上网卡IP而不是localhost  
如果服务器启动失败不返回任何值

### websocketserverObject.heartbeatData <a id="websocketserverObject.heartbeatData" href="#websocketserverObject.heartbeatData">&#x23;</a>
心跳帧发送的数据,默认为空数据  
这个值修改以后，只能在下次调用connect函数才会生效

### websocketserverObject.heartbeatInterval <a id="websocketserverObject.heartbeatInterval" href="#websocketserverObject.heartbeatInterval">&#x23;</a>
服务端主动发送心跳 Ping 空帧间隔,默认为 30 分钟  
设为 -1 时禁用客户端心跳,一般不建议禁用  
这个值修改以后，只能在下次调用start函数才会生效

### websocketserverObject.heartbeatType <a id="websocketserverObject.heartbeatType" href="#websocketserverObject.heartbeatType">&#x23;</a>
心跳帧发送的的帧类型,  
默认为9,也就是Ping帧  
这个值修改以后，只能在下次调用start函数才会生效

### websocketserverObject.httpServer <a id="websocketserverObject.httpServer" href="#websocketserverObject.httpServer">&#x23;</a>
单线程异步 HTTP服务端,wsock.tcp.asyncHttpServer对象  
浏览器组件发起异步 HTTP 请求支持 wsock.tcp.asyncHttpServer。  
请不要用 inet.http 等阻塞请求同一线程创建的 asyncHttpServer,  
这会导致 asyncHttpServer 没有机会响应请求而导致死锁，  
如果确有这样的需求，可创建线程发起请求，  
或改用基于多线程的 wsock.tcp.simpleHttpServe,  

[返回对象:AsyncHttpServerObject](#AsyncHttpServerObject)

### websocketserverObject.isClosed(hSocket) <a id="websocketserverObject.isClosed" href="#websocketserverObject.isClosed">&#x23;</a>
连接是否已关闭,  
@hSocket 参数指定客户端连接套接字句柄

### websocketserverObject.isConnected(hSocket) <a id="websocketserverObject.isConnected" href="#websocketserverObject.isConnected">&#x23;</a>
是否已连接并准备就绪可以发送数据,  
@hSocket 参数指定客户端连接套接字句柄

### websocketserverObject.publish() <a id="websocketserverObject.publish" href="#websocketserverObject.publish">&#x23;</a>
发送数据给所有的客户端,  
支持字符串或 buffer、结构体  
字符串作为UTF8文本类型发送,其他以二进制类型发送，  
成功返回true

### websocketserverObject.send(hSocket,) <a id="websocketserverObject.send" href="#websocketserverObject.send">&#x23;</a>
发送数据,支持字符串或 buffer、结构体  
字符串作为UTF8文本类型发送,其他以二进制类型发送,  
@hSocket 参数指定客户端连接套接字句柄，  
成功返回true

### websocketserverObject.sendData(hSocket,data,opcode,fin,rsv1,rsv2,rsv3) <a id="websocketserverObject.sendData" href="#websocketserverObject.sendData">&#x23;</a>
发送WebSocket数据包  
参数@1支持支持字符串或 buffer、结构体  
除参数@1以外,所以参数可选  
一般应当调用send函数，而不是调用sendData函数  

如果一定要使用这个函数,请阅读此函数源码,以及 WebSocket 协议相关说明

### websocketserverObject.start(IP,端口,请求队列大小) <a id="websocketserverObject.start" href="#websocketserverObject.start">&#x23;</a>
启动单线程异步 WebSocket 服务端,成功返回 true,失败返回 null,  

如果不写IP，则默认设为"0.0.0.0"也即监听本机所有IP,访问此服务端也不限制IP  
限制仅本机可以访问建议写127.0.0.1  

端口为0或省略则自动查找1025以后的空闲端口  
注意0-1023为系统通用服务保留端口,  
1024-49151为用户服务端口,其中大约%9已由IANA注册分配  
49152-65535为私有或临时端口

### websocketserverObject.stop() <a id="websocketserverObject.stop" href="#websocketserverObject.stop">&#x23;</a>
WebSocket服务端

## websocketserverObject 事件列表 <a id="websocketserverObjectEvent" href="#websocketserverObjectEvent">&#x23;</a>

### websocketserverObject.onClientClosed <a id="websocketserverObject.onClientClosed" href="#websocketserverObject.onClientClosed">&#x23;</a>

```aardio
websocketserverObject.onClientClosed = function(hSocket){
	/*客户端连接已经关闭时触发,  
hSocket 参数为客户端连接套接字句柄,  
此函数在连接断开后一定会被触发*/
}
```

### websocketserverObject.onClose <a id="websocketserverObject.onClose" href="#websocketserverObject.onClose">&#x23;</a>

```aardio
websocketserverObject.onClose = function(hSocket,err){
	/*连接被关闭,  
hSocket 参数为客户端连接套接字句柄,  
err.code 为错误代码 err.reason 为错误原因  
客户端关闭连接并不保证一定会触发此消息  
但onClientClosed事件在关闭后一定会被触发*/	
}
```

### websocketserverObject.onError <a id="websocketserverObject.onError" href="#websocketserverObject.onError">&#x23;</a>

```aardio
websocketserverObject.onError = function(hSocket,err){
	/*发生错误,  
hSocket 参数指定客户端连接套接字句柄,  
err为错误信息*/
}
```

### websocketserverObject.onFragment <a id="websocketserverObject.onFragment" href="#websocketserverObject.onFragment">&#x23;</a>

```aardio
websocketserverObject.onFragment = function(hSocket,msg){
   /*收到分片数据,  
hSocket 参数指定客户端连接套接字句柄,  
第一个数据包使用msg.type指明类型,参考WebSocket协议规范  
后续数据包msg.type为0,最后一个数据包msg.fin为1  

如果不指定这个回调函数,则自动并接分片数据后触发onMessage事件*/	
}
```

### websocketserverObject.onMessage <a id="websocketserverObject.onMessage" href="#websocketserverObject.onMessage">&#x23;</a>

```aardio
websocketserverObject.onMessage = function(hSocket,msg){
    /*收到服务端数据,  
hSocket 参数指定客户端连接套接字句柄,  
msg.type 为 1 时 msg.data 为文本,  
否则 msg.data 为字节串（buffer 类型）*/

}
```

### websocketserverObject.onOpen <a id="websocketserverObject.onOpen" href="#websocketserverObject.onOpen">&#x23;</a>

```aardio
websocketserverObject.onOpen = function(hSocket){
	/*客户端已切换到WebSocket服务，  
hSocket 参数为客户端连接套接字句柄*/
}
```

### websocketserverObject.onUpgradeToWebsocket <a id="websocketserverObject.onUpgradeToWebsocket" href="#websocketserverObject.onUpgradeToWebsocket">&#x23;</a>

```aardio
websocketserverObject.onUpgradeToWebsocket = function(hSocket,request,response,protocol,origin){  
    /*  
用户发送HTTP请求切换到WebSocket协议,  
可以在这里修改HTTP响应头中Sec-WebSocket-Protocol的值  

如果要阻止用户切换到WebSocket,用 response.close() 关闭请求，  
或调用 response.errorStatus() 函数返回错误代码即可，  
否则退出此函数后会继续切换到WebSocket协议。  

参数说明:  
hSocket为客户端套接字句柄  
request为HTTP请求对象  
response为HTTP应答对象  
protocol为Sec-WebSocket-Protocol请求头的值*/  
}
```

