Mercurial > hg > Members > nobuyasu > Lua
view coroutine/echo_server/echo_server_select.lua @ 9:ddac6199c51a default tip
Added echo_server_select.lua
author | Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 09 Mar 2014 02:30:37 +0900 |
parents | |
children |
line wrap: on
line source
local socket = require("socket") response = { ["end"] = function(sock) sock:close() end} function acceptfunction(server, time) acceptco = coroutine.create( function (serversocket, time) time = time or 0.1 serversocket:settimeout(time) coroutine.yield(serversocket:accept()) end) return coroutine.resume(acceptco, server, time) end function echofunction(socketarray) echoco = coroutine.create( function(socketarray, time) time = time or 0.1 if #socketarray == 0 then socket.select(nil, nil, time) coroutine.yield() end local canread = socket.select(socketarray, socketarray, time) for _,c in ipairs(canread) do local mess, err = c:receive() if response[mess] then response[mess](c) else print(mess) c:send(mess.."\n") end end coroutine.yield() end ) return coroutine.resume(echoco, socketarray, 0.1) end local socketarray = {} local server = socket.bind("127.0.0.1", "8080") assert(server) while true do local flag, socket = acceptfunction(server, 0.1) if socket then table.insert(socketarray, socket) end echofunction(socketarray) end