-
Notifications
You must be signed in to change notification settings - Fork 7
Server端参考手册
Ran Aizen edited this page Mar 8, 2015
·
16 revisions
Notice: firstfragment
, fragment
, lastfragment
三个事件已弃用, 请使用流式分片!
Notice: client.emitRaw()已弃用.
Notice: 新增了流式API
Ok,下面进入正题。以下内容是fslider_ws提供的全部功能、详细配置参数以及全部系统级事件。
- wsf对象
-
wsf.listen
方法 @httpServer,[@callback]
绑定fslider_ws的核心逻辑到一个http.Server实例,同时(全局模式)监听它的upgrade
事件。 -
wsf.close
方法 @httpServer
取消对httpServer上upgrade
事件的监听。 -
wsf.connect
方法 @wsurl, @callback
作为websocket的非浏览器客户端,连接到指定fslider_ws websocket服务器,连接后会触发wsf上的connected
事件。
-
- wsf.Server类:[@httpServer],[@options],创建wsfServer实例
-
server.getRegistedId
方法 => Array
返回连接到当前server的已注册客户端的id组成的数组。 -
server.getClient
方法 @id
=> Client
根据已注册的id返回客户端实例 -
server.getConnectCount
方法 => Number
返回连接到当前server的全部(包括未注册)客户端数量 -
server.bind
方法 @server,[@options]
手动为server添加监听的HTTP服务器 -
server.unbind
方法 取消当前server的HTTP服务器绑定 -
server.sysEmit
方法 继承自EventEmitter.prototype.emit -
server.on
方法 继承自EventEmitter.prototype.on -
server.emit
方法 @client,@event,@data
覆盖了继承的.emit方法。向指定客户端发送event -
server.broadcast
方法 @event,@data
向客户端广播event -
server.removeListener
方法 继承自EventEmitter.prototype.removeListener
-
- Client类:@socket,@sockets_queue, @isClient 以net.Socket实例为参数实例化一个客户端Socket引用
-
client.emit
方法 @event,@data | @dataStream
覆盖了集成的.emit方法。向这个客户端发送event。 -
client.on
方法
继承自EventEmitter.prototype.on.
回调参数: @dataStream | @data -
client.send
方法 @data | @dataStream
client.emit
的语法糖,向客户端触发'data'
事件,等价于client.emit('data', data)
。 -
client.recive
方法 @callback
client.on
的语法糖,监听来自客户端的data
事件,等价于client.on('data', callback)
。 -
client.emitCtrl
方法 @Opcode,@statusCode,@Payload_data
向客户端发送控制帧。一般该方法不需要应用程序去调用,应该由rocket-engine自己的逻辑控制调用。 -
client.sysEmit
方法 @event,@data
在服务器端触发系统级事件。常用于socket接收到来自客户端的事件消息时通知给应用程序。一般该方法不需要应用程序去调用,应该由fslider_ws自己的逻辑控制调用。 -
client.setTimeout
方法 @timeout
设置该socket的超时等待 -
client.destory
方法 强制关闭异常连接。服务器自主断开底层TCP连接。 -
client.end
方法 关闭底层TCP连接,常在"关闭握手阶段"结束后调用.服务器自主断开底层TCP连接. -
client.close
方法 @code:状态码, [@reason:关闭理由]
正常关闭连接,进入关闭握手阶段,发送CLOSE HandShake Frame
。如果之前已经发送过close frame,则该方法什么也不做. -
client.identify
方法
@id, @callback
用id向ws服务器实例注册该client, 如果指定id已被注册,则callback参数为err. -
client.set
方法 @key, @value
在一个client的命名空间下存储自定义键-值对. -
client.get
方法
@key
根据key返回存储数据. -
client.fragmentSize
属性 设置分片大小.待发送的数据帧大小超过这个限定时,会自动将其分片发送.
注意,如果发送尺寸较大的二进制文件如高清图片,建议根据情况设定来重置分片大小,以免应用卡顿.
-
Note:应用程序里定义的事件名称尽量不要与这些预定义的事件名称冲突
- wsf:
-
#listen
回调参数:绑定的http.Server实例。
当全局绑定一个http.Server实例时触发。 -
#close
回调参数:解绑定的http.Server实例。
解除绑定一个http.Server实例时触发。 -
#connected
回调函数:Client实例。
调用wsf.connect成功建立连接后触发。
-
- server
-
#uptolimit
回调参数:server.MAX。
(全局)已连接的已达到最大连接数时,有新的请求时触发 -
#connected
回调参数:client。
握手阶段完成时触发。 -
#closing
回调参数:undefined。
(全局)当接收到来自客户端的close frame时触发。 -
#serverclose
回调参数: undefined.
(全局)底层TCP连接准备断开连接(发送FIN Packet)时触发. -
#clientclose
回调参数: undefined.
(全局)接收到客户端发送的FIN Packet时触发. -
#disconnected
回调参数:state_code {Number}。
(全局)当底层连接完全关闭时触发。 -
#drained
回调参数:socket.bufferSize。
(全局)当操作系统用户态缓存队列清空时触发。 -
#timeout
回调参数:undefined。
(全局)socket超时触发。 -
#exception
回调参数:error。
(全局)当连接发生错误时触发。
-
- client
-
#uptolimit
回调参数:server.MAX。
已连接的已达到最大连接数时,有新的请求时触发 -
#connected
回调参数:client。
握手阶段完成时触发。 -
#closing
回调参数:undefined。
当接收到来自客户端的close frame时触发。 -
#serverclose
回调参数: undefined.
底层TCP连接准备断开(发送FIN Packet)时触发. -
#clientclose
回调参数: undefined.
客户端TCP连接准备断开(回复FIN Packet)时触发. -
#disconnected
回调参数:state_code {Number}。
当底层连接完全关闭时触发。 -
#drained
回调参数:socket.bufferSize。
当操作系统用户态缓存队列清空时触发。 -
#timeout
回调参数:undefined。
socket超时触发。 -
#exception
回调参数:error。
当连接发生错误时触发。 -
#ping
回调参数:client。
收到Ping包时触发 -
#pong
回调参数:client。 收到Pong包时触发。
-
v0.4.x中对数据接受模块进行了重构, 新增了streamParser
, 为分片提供了流式解析方式. 取代v0.3.x中的(store mode
)存储模式. 极大程度降低了内存开销.
如何使用v0.4.x流式分片
? 非常简单, 因为回调函数的参数src在流模式中是一个可读流!
wsf.on('connected', function (client) {
// stream mode
client.on('media', function (src) {
// because I didn't implement whole stream by now
// so, if u r not sure whether it'll receive in fragments
// u have to do this test:
if (src instanceof Buffer)
console.log(src);
else
src.pipe(dst);
});
});
v0.5版本提供了完整的流式(stream)API, 极大简化了媒体流/数据流的传输过程, 减轻了服务器内存压力.
// example: 使用v0.5流式API接收数据流, 转发数据流.
socket.on('lol', function (imgstream) {
imgstream.pipe(fs.createWriteStream('./dump.gif')).on('finish', function () {
socket.send(fs.createReadStream('./dump.gif'));
});
});
Notice: 为了避免过多数据在内存中驻留, 默认开启了Node stream的flowing mode. 请添加.pipe()
或"data"
事件回调防止数据丢失!
对于一次正常的关闭,事件会按如下顺序触发:
#closing
#serverclose
#clientclose
#disconnected
Note:一般情况下,如果需要监听断开连接事件,仅向disconnected
事件添加监听器即可,代表底层连接完全关闭.对于开发人员,或许你会需要监听连接关闭过程中每一阶段的关闭情况,这是可以在closing
事件,serverclose
事件和/或clientclose
事件上添加监听器.
- 中文版Wiki首页
- Server参考手册
- Browser参考手册
- [Non-Browser参考手册](https://github.com/abbshr/RocketEngine/wiki/Non Browser客户端参考手册)
- 诞生缘由
- 示例