Grappler 是一个用于“comet”连接的简约服务器,它在所有传输中公开单一、一致的 API。 Grappler 目前支持以下传输(每种传输都有当前已知支持的浏览器列表):
* - 某些浏览器的 XMLHttpRequest 实现包含意外的怪癖(例如 Android 1.6 的内置 Web 浏览器)
Grappler 导出一个主要对象: Server
。
lib/common.js 导出LOG
和STATE
对象,其中包含分别用于记录消息和检查客户端状态时的常量。
LOG
对象是:
{
INFO: 1,
WARN: 2,
ERROR: 3
}
STATE
对象是:
{
ACCEPTED: 1, // internal use only
TEMP: 2, // internal use only
PROTO_HTTP: 4, // client is HTTP-based
PROTO_WEBSOCKET: 8 // client is WebSocket-based
}
创建 grappler 服务器的新实例。
options
是一个具有以下默认值的对象:
{
// A callback for receiving "debug" information. It is called with two arguments: message and message level.
// Message level is one of the values in the `LOG` object.
logger: function(msg, msgLevel) {},
// A string or array of strings which denote who is allowed to connect to this grappler Server instance.
// The format of the string is: "hostname:port", "hostname", or an asterisk substituted for either the hostname
// or port, or both, to act as a wildcard.
origins: "*:*",
// An integer value in milliseconds representing the interval in which a ping is sent to an HTTP client for those
// transports that need to do so.
pingInterval: 3000,
// A storage provider used to store client objects. The default is to use 'object', a simple hash. Other available
// storage providers can be found in lib/storage. The value here is the name without the 'storage' prefix and file extension.
storage: 'object'
}
fnHandleNormalHTTP
是一个回调函数,能够覆盖传入 HTTP 连接的处理程序。如果没有发送标头,则 grappler 会控制连接。提供给此回调的参数与http.Server
的request
事件相同,即: http.ServerRequest 和 http.ServerResponse 对象。需要注意的是,如果您希望 grappler 自动处理所有传入的 HTTP 连接,但希望为fnAcceptClient
指定回调,则需要为fnHandleNormalHTTP
指定false
值。
fnAcceptClient
是在客户端连接时执行的回调。此回调的主要目的是有机会立即拒绝客户端进一步访问 grappler 服务器。例如,您的应用程序可能会维护一个黑名单,或者可能会在一定时间内进行 x 个连接后自动将某个 IP 列入黑名单/限制。如果此回调返回false
,连接将自动断开,否则将允许连接。该回调接收一个参数,该参数是表示连接的net.Stream
对象。
function(client) { }
每次新客户端成功连接到系统时都会发出此事件。 client
是HttpClient
的实例。
function(err) { }
发生意外错误时发出。
启动服务器侦听指定的port
和host
。如果省略host
,服务器将侦听任何 IP 地址。
使用可选encoding
将data
发送到每个连接的客户端。
通过不再侦听传入连接并切断任何现有客户端连接来关闭服务器。
grappler 中还使用了另一个重要的对象,那就是HttpClient
对象。 HttpClient
代表连接到服务器的用户,可用于与该用户交互。
function() { }
当客户端的写入缓冲区变空时发出。
function() { }
当客户端断开连接时发出。
包含客户端当前状态的位字段。请参阅前面提到的STATE
对象以了解有效位。
客户端的IP地址。
使用可选encoding
将data
发送到客户端。如果整个数据已成功刷新到内核缓冲区,则此函数返回true
。否则,如果全部或部分数据在用户内存中排队,它将返回false
。当内核缓冲区再次空闲时,会发出排出drain
。
使用可选的encoding
将data
发送到所有其他连接的客户端。
强制切断客户端与服务器的连接。