LuaSocket的HTTP模块文档表示可以在HTTP连接上设置超时时间:
以下常量可用于控制HTTP模块的默认行为:
PORT:用于连接的默认端口;
PROXY:用于连接的默认代理;
TIMEOUT:设置所有I/O操作的超时时间;
USERAGENT:报告给服务器的默认用户代理。
http://w3.impa.br/~diego/software/luasocket/http.htm
我该如何在lua脚本中设置这些常量?
比我想象的要容易。只需
local mysocket = require("socket.http")
mysocket.TIMEOUT = 5
local socket = require "socket"
local http = require "socket.http"
response = http.request{url=URL, create=function()
local req_sock = socket.tcp()
req_sock:settimeout(5)
return req_sock
end}
:settimeout
的默认行为以及全局设置如 http.TIMEOUT
,会为请求中的任何单个操作设置一个时间限制 - 换句话说,这是在没有任何活动的情况下操作可以持续的时间。如果您希望为操作设置一个总的上限 - 无论有没有活动,整个请求不能超过一定时间 - 您应该将第二个参数作为 't'
的模式参数传递给 :settimeout
,例如:local socket = require "socket"
local http = require "socket.http"
response = http.request{url=URL, create=function()
local req_sock = socket.tcp()
-- note the second parameter here
req_sock:settimeout(5, 't')
return req_sock
end}
req_sock:settimeout(5, 'b')
(或只是req_sock:settimeout(5)
)设置为5秒的阻塞超时,这个请求将顺利进行,因为没有底层I/O操作超过了五秒钟:然而,使用req_sock:settimeout(5, 't')
设置为五秒钟的总体超时,请求将在五秒钟后失败。local socket = require "socket"
local http = require "socket.http"
response = http.request{url=URL, create=function()
local req_sock = socket.tcp()
req_sock:settimeout(5, 'b')
req_sock:settimeout(30, 't')
return req_sock
end}
create = function()
部分吗? - ripatmysocket.TIMEOUT
修改超时时间后,除非再次更改,否则它将为所有新创建的 HTTP 套接字保持该值。按照你的建议,难道不会创建两个套接字吗?一个是 HTTP 的,另一个是 TCP 的吗? - ripatcreate
参数指定了用于创建 TCP 套接字以执行 HTTP 请求(HTTP应用层通过TCP传输层)。如果您没有指定创建函数,http.request 将默认使用普通的 tcp()
调用(请参阅手册)。 - Stuart P. Bentleyrequire "socket.tcp"
和第四行的 local socket = tcp()
是无效的。应该删除第二行并将第四行改为 local socket = socket.tcp()
。 - user600838