我是在一个请求里面这样发送请求的
local sock = ngx.socket.tcp()
sock:settimeout(100000)
local ok, err = sock:connect(ip, port)
if not ok then
ngx.log(ngx.ERR,"failed to connect: ", err)
return nginx_resp_op.nginx_resp(200,"failed")
end
local data_json = body_data
local data_json_len = string.len(body_data)
ngx.log(ngx.DEBUG,"data_json:"..data_json)
local send_data = "$"..data_len.."\r\n"..data.."\r\n"
local bytes, err = sock:send(send_data)
if not bytes then
ngx.log(ngx.ERR,"failed to send query: ", err)
return nginx_resp_op.nginx_resp(200,"failed")
end
ngx.log(ngx.DEBUG,"send data:"..send_data)
local line, err = sock:receive()
if not line then
if err == "timeout" then
ngx.log(ngx.ERR,"recv timeout")
sock:close()
end
ngx.log(ngx.ERR,"recv time out")
return nginx_resp_op.nginx_resp(200,"failed")
end
local tcpdata = nil
local prefix = byte(line)
ngx.log(ngx.DEBUG,"tcp prefix:"..prefix)
if prefix == 36 then -- char '$'
local size = tonumber(sub(line, 2))
if size < 0 then
ngx.log(ngx.ERR,"recv size < 0")
return nginx_resp_op.nginx_resp(200,"failed")
end
ngx.log(ngx.DEBUG,"size:"..size)
tcpdata, err = sock:receive(size)
if not tcpdata then
if err == "timeout" then
sock:close()
end
return nginx_resp_op.nginx_resp(200,"failed")
end
ngx.log(ngx.DEBUG,"recv from tcp server:"..tcpdata)
local dummy, err = sock:receive(2)
if not dummy then
ngx.log(ngx.ERR,"it is not /r/n")
return nginx_resp_op.nginx_resp(200,"failed")
end
ngx.log(ngx.DEBUG,"deal packet finish")
else
ngx.log(ngx.ERR,"unkown prefix:".. prefix)
return nginx_resp_op.nginx_resp(200,"failed")
end
local ok, err = sock:setkeepalive(0,1)
if not ok then
ngx.log(ngx.DEBUG,"keepalive error:"..err)
else
ngx.log(ngx.DEBUG,"set keepalive success")
end
ngx.log(ngx.DEBUG,"send to client data:"..tcpdata)
return nginx_resp_op.nginx_resp(200,tcpdata)
收的话,像redis协议那样子,去收,如果是一个请求一个请求的发送是没问题,但是在很多请求同时并发的时候,收数据,有时候总是在recv那里停住了,这是怎么回事呢。
在 2014年10月27日星期一UTC+8下午8时10分28秒,
xiati...@gmail.com写道: