# wsock.tcp.asyncHttpServer 库模块帮助文档

## AsyncHttpServerObject 成员列表 <a id="AsyncHttpServerObject" href="#AsyncHttpServerObject">&#x23;</a>

### AsyncHttpServerObject._beforeHttpServerStop <a id="AsyncHttpServerObject._beforeHttpServerStop" href="#AsyncHttpServerObject._beforeHttpServerStop">&#x23;</a>

```aardio
AsyncHttpServerObject._beforeHttpServerStop = function(){
	/*服务端关闭以前触发  
此回调函数是标准库保留接口  
用户不应使用此回调*/
}
```

### AsyncHttpServerObject._onClientClosed <a id="AsyncHttpServerObject._onClientClosed" href="#AsyncHttpServerObject._onClientClosed">&#x23;</a>

```aardio
AsyncHttpServerObject._onClientClosed = function(hSocket){
	/*客户端连接已经关闭时触发  
此函数在连接断开后一定会被触发  
此回调函数是标准库保留接口  
用户不应使用此回调*/
}
```

### AsyncHttpServerObject.acceptCount <a id="AsyncHttpServerObject.acceptCount" href="#AsyncHttpServerObject.acceptCount">&#x23;</a>
当前连接数,不可改动该值

### AsyncHttpServerObject.beforeStop <a id="AsyncHttpServerObject.beforeStop" href="#AsyncHttpServerObject.beforeStop">&#x23;</a>

```aardio
AsyncHttpServerObject.beforeStop = function(){
	/*服务端关闭以前触发*/
}
```

### AsyncHttpServerObject.bind(IP,端口) <a id="AsyncHttpServerObject.bind" href="#AsyncHttpServerObject.bind">&#x23;</a>
绑定 IP 与端口。  
应当由 start 函数自动调用此函数。

### AsyncHttpServerObject.clearKeepAliveTimeout() <a id="AsyncHttpServerObject.clearKeepAliveTimeout" href="#AsyncHttpServerObject.clearKeepAliveTimeout">&#x23;</a>
关闭所有超出keepAliveTimeout限制的超时连接  
在连接超出最大连接数时,此函数会被自动调用

### AsyncHttpServerObject.client() <a id="AsyncHttpServerObject.client" href="#AsyncHttpServerObject.client">&#x23;</a>
[返回对象:tcpaclientObject](https://www.aardio.com/zh-cn/doc/library-reference/wsock/tcp/asyncClient.html#tcpaclientObject)

### AsyncHttpServerObject.client(hSocket) <a id="AsyncHttpServerObject.client" href="#AsyncHttpServerObject.client">&#x23;</a>
用于获取客户端套接字对应的客户端对象

### AsyncHttpServerObject.clientBufferSize <a id="AsyncHttpServerObject.clientBufferSize" href="#AsyncHttpServerObject.clientBufferSize">&#x23;</a>
客户端套接字读写缓冲区大小，默认为1MB  
缓冲区如果设置的太小，会导致过于频繁的调用读写函数

### AsyncHttpServerObject.codeFileMode <a id="AsyncHttpServerObject.codeFileMode" href="#AsyncHttpServerObject.codeFileMode">&#x23;</a>
设置 response.loadcode 函数处理 `*.aardio` 代码文件的模式。  
值为 null 或者 "execute" 表示允许执行代码，默认为 null。  
设为 "static" 则 aardio 文件可作为普通文件下载。  
设为 "deny" 则禁止访问 aardio 文件。

### AsyncHttpServerObject.customErrors <a id="AsyncHttpServerObject.customErrors" href="#AsyncHttpServerObject.customErrors">&#x23;</a>

```aardio
AsyncHttpServerObject.customErrors = {  
    [404] = function(response){  
		response.status = "404 Not Found";  
		response.write("404 Not Found"); /*自定义错误页，  
也可以直接指定错误页路径*/  
	}   
}
```

### AsyncHttpServerObject.defalutDocument <a id="AsyncHttpServerObject.defalutDocument" href="#AsyncHttpServerObject.defalutDocument">&#x23;</a>
默认文档，默认为"main.aardio"，设为 null 禁用默认文档。  

如果访问硬盘上存在的目录,request.path 尾部不加斜杠会自动跳转到以斜杠结束的路径  

如果访问嵌入资源目录,只有 request.path 以斜杠才会访问默认文档,  
对于访问嵌入资源文件,建议指定完整的文件路径,  
默认文档主要是用于硬盘上的网站

### AsyncHttpServerObject.defaultUrl <a id="AsyncHttpServerObject.defaultUrl" href="#AsyncHttpServerObject.defaultUrl">&#x23;</a>
访问此服务器的默认网址

### AsyncHttpServerObject.documentBase <a id="AsyncHttpServerObject.documentBase" href="#AsyncHttpServerObject.documentBase">&#x23;</a>
网站根目录,  
不会修改应用程序根目录,支持硬盘目录与资源目录,  
这个属性应当设置为应用程序根目录下的相对路径,  
例如 "/res/web/"  

注意： request.path 前面包含 documentBase 目录。  
而 request.pathInfo 忽略 documentBase 目录

### AsyncHttpServerObject.documentRoot <a id="AsyncHttpServerObject.documentRoot" href="#AsyncHttpServerObject.documentRoot">&#x23;</a>
网站应用程序根目录,默认为"/",  
只能设置为硬盘上实际存在的目录,  
改变此目录,会同时改变  
服务端代码中的应用程序根目录以及用户库目录,  
如果只是相将所有请求路径转向某个目录,应当改用 documentBase 属性  
如果网站在嵌入资源目录中,应当改用 documentBase 属性

### AsyncHttpServerObject.getLocalIp() <a id="AsyncHttpServerObject.getLocalIp" href="#AsyncHttpServerObject.getLocalIp">&#x23;</a>
返回当前绑定的本地 IP,端口号

### AsyncHttpServerObject.getLocalPort() <a id="AsyncHttpServerObject.getLocalPort" href="#AsyncHttpServerObject.getLocalPort">&#x23;</a>
返回当前绑定的本地端口号

### AsyncHttpServerObject.getRemoteIp(hSocket) <a id="AsyncHttpServerObject.getRemoteIp" href="#AsyncHttpServerObject.getRemoteIp">&#x23;</a>
返回客户端IP地址,端口

### AsyncHttpServerObject.getUrl <a id="AsyncHttpServerObject.getUrl" href="#AsyncHttpServerObject.getUrl">&#x23;</a>
返回 HTTP 服务端访问网址  
如果服务器启动失败不返回任何值

### AsyncHttpServerObject.getUrl() <a id="AsyncHttpServerObject.getUrl" href="#AsyncHttpServerObject.getUrl">&#x23;</a>
返回首页网址

### AsyncHttpServerObject.getUrl(path,localIp) <a id="AsyncHttpServerObject.getUrl" href="#AsyncHttpServerObject.getUrl">&#x23;</a>
返回 @path 指定路径的网址，路径开始可省略斜杠。   
注意参数第一个字符不需要指定斜杠  
可选用 @localIp 指定 IP "0.0.0.0" 是否替换为上网卡 IP（否则 localhost ）

### AsyncHttpServerObject.getUrl(path,param,localIp) <a id="AsyncHttpServerObject.getUrl" href="#AsyncHttpServerObject.getUrl">&#x23;</a>
返回 @path 指定路径的网址，路径开始可省略斜杠。  
@param 指定 URL 参数表（table 对象）。  
可选用 @localIp 指定 IP "0.0.0.0" 是否替换为上网卡 IP（否则 localhost ）

### AsyncHttpServerObject.isClosed(hSocket) <a id="AsyncHttpServerObject.isClosed" href="#AsyncHttpServerObject.isClosed">&#x23;</a>
连接是否已关闭

### AsyncHttpServerObject.isConnected(hSocket) <a id="AsyncHttpServerObject.isConnected" href="#AsyncHttpServerObject.isConnected">&#x23;</a>
是否已连接并准备就绪

### AsyncHttpServerObject.keepAliveTimeout <a id="AsyncHttpServerObject.keepAliveTimeout" href="#AsyncHttpServerObject.keepAliveTimeout">&#x23;</a>
最大保持连接时间,以秒为单位,  
负数表示不限时间

### AsyncHttpServerObject.listen(请求队列大小) <a id="AsyncHttpServerObject.listen" href="#AsyncHttpServerObject.listen">&#x23;</a>
监听构造函数绑定的 IP 端口，成功返回 true 。  
已自动调用此函数。

### AsyncHttpServerObject.maxConnection <a id="AsyncHttpServerObject.maxConnection" href="#AsyncHttpServerObject.maxConnection">&#x23;</a>
最大连接数

### AsyncHttpServerObject.run(httpProc) <a id="AsyncHttpServerObject.run" href="#AsyncHttpServerObject.run">&#x23;</a>

```aardio
AsyncHttpServerObject.run(   
    function(response,request,session){   
         response.loadcode(request.path);  
    }/*启动HTTP服务并在此回调函数中处理请求，  
不传入参数则默认调用response.loadcode 。  
也可以传入一个或多个表参数,键为页面相对路径,值为响应数据或回调函数,  
键指定的路径为 aardio 后缀时，启用模板语法解析并返回 HTML 代码*/  
);
```

### AsyncHttpServerObject.serverAddress <a id="AsyncHttpServerObject.serverAddress" href="#AsyncHttpServerObject.serverAddress">&#x23;</a>
服务端监听地址  

[返回对象:sockaddrInObject](#sockaddrInObject)

### AsyncHttpServerObject.shutdown() <a id="AsyncHttpServerObject.shutdown" href="#AsyncHttpServerObject.shutdown">&#x23;</a>
断开 HTTP 服务端

### AsyncHttpServerObject.spaUrl <a id="AsyncHttpServerObject.spaUrl" href="#AsyncHttpServerObject.spaUrl">&#x23;</a>
返回 SPA 单页应用首页网址  
如未启动服务端则自动启动且监听IP设为 "127.0.0.1"

### AsyncHttpServerObject.spaUrl(indexHtmlPath,documentBase) <a id="AsyncHttpServerObject.spaUrl" href="#AsyncHttpServerObject.spaUrl">&#x23;</a>
参数指定 SPA 单页应用首页路径，  
404错误页也会自动设置到该路径，  
返回首页网址  

可选用参数 @documentBase 指定根目录以避免网页不支持非根目录路径

### AsyncHttpServerObject.start(IP,端口,请求队列大小) <a id="AsyncHttpServerObject.start" href="#AsyncHttpServerObject.start">&#x23;</a>
启动单线程异步TCP服务端,成功返回true,失败返回null,  

如果不写IP，则默认设为"0.0.0.0"也即监听本机所有IP,访问此服务端也不限制IP  
限制仅本机可以访问建议写127.0.0.1  

端口为0或省略则自动查找1025以后的空闲端口  
注意0-1023为系统通用服务保留端口,  
1024-49151为用户服务端口,其中大约%9已由IANA注册分配  
49152-65535为私有或临时端口

### AsyncHttpServerObject.stop() <a id="AsyncHttpServerObject.stop" href="#AsyncHttpServerObject.stop">&#x23;</a>
关闭 HTTP 服务端

## AsyncHttpServerObject 事件列表 <a id="AsyncHttpServerObjectEvent" href="#AsyncHttpServerObjectEvent">&#x23;</a>

### AsyncHttpServerObject.onClientClosed <a id="AsyncHttpServerObject.onClientClosed" href="#AsyncHttpServerObject.onClientClosed">&#x23;</a>

```aardio
AsyncHttpServerObject.onClientClosed = function(hSocket){
	/*客户端连接已经关闭时触发  
此函数在连接断开后一定会被触发*/
}
```

### AsyncHttpServerObject.onClose <a id="AsyncHttpServerObject.onClose" href="#AsyncHttpServerObject.onClose">&#x23;</a>

```aardio
AsyncHttpServerObject.onClose = function(hSocket,err){
    var client = AsyncHttpServerObject.client(hSocket);

	/*已断开连接,  
如果缓冲区中仍然有数据,  
这个事件可能在其他事件前面触发  
主动调用close函数立即关闭连接,此事件不会被触发,  
但onClientClosed事件总会在关闭连接后触发*/	
}
```

### AsyncHttpServerObject.onOpen <a id="AsyncHttpServerObject.onOpen" href="#AsyncHttpServerObject.onOpen">&#x23;</a>

```aardio
AsyncHttpServerObject.onOpen = function(hSocket,err){
    var client = AsyncHttpServerObject.client(hSocket);

	/*已连接  
在这里可以开始发送数据*/	
}
```

### AsyncHttpServerObject.onOutOfBandData <a id="AsyncHttpServerObject.onOutOfBandData" href="#AsyncHttpServerObject.onOutOfBandData">&#x23;</a>

```aardio
AsyncHttpServerObject.onOutOfBandData = function(hSocket,err){
    var client = AsyncHttpServerObject.client(hSocket);

	/*收到紧急数据  
即send函数最后一个flag参数设为_MSG_OOB时发送的1字节带外数据*/		
}
```

### AsyncHttpServerObject.onRead <a id="AsyncHttpServerObject.onRead" href="#AsyncHttpServerObject.onRead">&#x23;</a>

```aardio
AsyncHttpServerObject.onRead = function(hSocket,err){
    var client = AsyncHttpServerObject.client(hSocket);

	/*收到数据  
可阻塞读取数据  
定义了此事件就不应同时定义onReceive事件*/	
}
```

### AsyncHttpServerObject.onReceive <a id="AsyncHttpServerObject.onReceive" href="#AsyncHttpServerObject.onReceive">&#x23;</a>

```aardio
AsyncHttpServerObject.onReceive = function(hSocket,err){
    var client = AsyncHttpServerObject.client(hSocket);

	/*收到数据  
仅读取已到达的数据  
定义了此事件就不应同时定义onRead事件*/	
}
```

### AsyncHttpServerObject.onSend <a id="AsyncHttpServerObject.onSend" href="#AsyncHttpServerObject.onSend">&#x23;</a>

```aardio
AsyncHttpServerObject.onSend = function(hSocket,err){
    var client = AsyncHttpServerObject.client(hSocket);

	/*发送数据*/
}
```

### AsyncHttpServerObject.onStop <a id="AsyncHttpServerObject.onStop" href="#AsyncHttpServerObject.onStop">&#x23;</a>

```aardio
AsyncHttpServerObject.onStop = function(err){

	/*已停止服务端  
主动调用stop函数停止服务端时不会触发此事件*/	
}
```

### AsyncHttpServerObject.onUpgradeProtocol <a id="AsyncHttpServerObject.onUpgradeProtocol" href="#AsyncHttpServerObject.onUpgradeProtocol">&#x23;</a>

```aardio
AsyncHttpServerObject.onUpgradeProtocol = function(client,request,response){
	/*处理客户端升级协议请求,  
可在此回调中切换到WebSocket协议*/
}
```

## AsyncHttpServerObject.clients 成员列表 <a id="AsyncHttpServerObject.clients" href="#AsyncHttpServerObject.clients">&#x23;</a>

这是一个包含所有客户端套接字的表对象  
其中键为套接字句柄,值为 wsock.tcp.asyncClient对象

### AsyncHttpServerObject.clients.* <a id="AsyncHttpServerObject.clients.any" href="#AsyncHttpServerObject.clients.any">&#x23;</a>
[返回对象:tcpaclientObject](https://www.aardio.com/zh-cn/doc/library-reference/wsock/tcp/asyncClient.html#tcpaclientObject)

## wsock.tcp 成员列表 <a id="wsock.tcp" href="#wsock.tcp">&#x23;</a>

### wsock.tcp.asyncHttpServer <a id="wsock.tcp.asyncHttpServer" href="#wsock.tcp.asyncHttpServer">&#x23;</a>
单线程异步 HTTP 服务端  
浏览器组件发起异步 HTTP 请求支持 asyncHttpServer。  
请不要用 inet.http 等阻塞请求同一线程创建的 asyncHttpServer,  
 这会导致 asyncHttpServer 没有机会响应请求而导致死锁，  
一般没必要这样自己 HTTP 请求自己，改成普通函数调用即可，  
如果确有这样的需求，可以创建线程调用 inet.http 发起请求，  
或改用基于多线程的 wsock.tcp.simpleHttpServer 创建服务端

### wsock.tcp.asyncHttpServer() <a id="wsock.tcp.asyncHttpServer" href="#wsock.tcp.asyncHttpServer">&#x23;</a>
创建单线程异步 HTTP 服务端  

[返回对象:AsyncHttpServerObject](#AsyncHttpServerObject)
