ProblemLuaSocket Server: accept() Timeout (TCP)
Nach LuaSocket
Introduction ich den Server zum Laufen bringen verwaltet. Ich habe es auch geschafft, mich von der Clientseite aus zu verbinden. Mir ist jedoch aufgefallen, dass das Server-Skript friert, bis server:accept()
die Verbindung bekommt.
Forschung
LuaSocket
Reference angibt:
Über die SetTimeout Methode oder akzeptieren könnte blockieren, bis ein anderer Client erscheint.
Dies ist sogar im Beispielcode enthalten. client:settimeout(10)
wird jedoch nach local client = server:accept()
aufgerufen, sodass das Skript blockiert wird, bevor es diesen Punkt erreicht.
Ich habe gelesen, dass dies durch Multithreading bearbeitet werden könnte, aber das scheint eine Übertreibung zu sein.
Fragen
- Wie führen Sie das Server-Skript wartet auf Verbindung zu stoppen und weiterziehen?
- Wie bewahre ich vor ähnlichen Problemen mit
client:receive()
(Server-Seite) undtcp:receive()
(Client-Seite) (oderclient:settimeout(10)
kümmert sich darum)?
-Code
Server (von LuaSocket
Introduction)
-- load namespace
local socket = require("socket")
-- create a TCP socket and bind it to the local host, at any port
local server = assert(socket.bind("*", 0))
-- find out which port the OS chose for us
local ip, port = server:getsockname()
-- print a message informing what's up
print("Please telnet to localhost on port " .. port)
print("After connecting, you have 10s to enter a line to be echoed")
-- loop forever waiting for clients
while 1 do
-- wait for a connection from any client
local client = server:accept()
-- make sure we don't block waiting for this client's line
client:settimeout(10)
-- receive the line
local line, err = client:receive()
-- if there was no error, send it back to the client
if not err then client:send(line .. "\n") end
-- done with client, close the object
client:close()
end
Client (folgt this answer)
local host, port = "127.0.0.1", 100
local socket = require("socket")
local tcp = assert(socket.tcp())
tcp:connect(host, port);
--note the newline below
tcp:send("hello world\n");
while true do
local s, status, partial = tcp:receive()
print(s or partial)
if status == "closed" then break end
end
tcp:close()