Wednesday, May 29, 2013

Echo Client and Server in Lua

Previously, I showed code for writing an echo client and server in Ruby. For fun, here's an implementation in Lua. The client and server classes are both provided in the Lua module echo.lua.

echo.lua


-- module setup
local modname = ...
local M = {}
_G[modname] = M
package.loaded[modname] = M

-- import section
local assert = assert
local setmetatable = setmetatable
local socket = require 'socket'
local string = string

-- no more external access beyond this point
setfenv(1, M)

-- private functions
local function add_lf(s)
    if string.sub(s, #s, #s) ~= '\n' then
        return s .. '\n'
    else
        return s
    end
end


-- echo server
EchoServer = {}

function EchoServer:serve_forever()
    local sock = socket.tcp()
    assert(sock:bind(self.host, self.port))
    sock:listen(5)
    while true do
        local client = sock:accept()
        local line = client:receive('*line')
        if line then
            client:send(add_lf(line))
        end
        client:close()
    end
end

function EchoServer:new(host, port)
    local o = {}
    o.host = host or '127.0.0.1'
    o.port = port or 8765
    setmetatable(o, self)
    self.__index = self
    return o
end

-- echo client
EchoClient = {}

function EchoClient:request(msg)
    local sock = socket.tcp()
    assert(sock:connect(self.host, self.port))
    sock:send(add_lf(msg))
    local response = sock:receive('*line')
    sock:close()
    return response
end

function EchoClient:new(host, port)
    local o = {}
    o.host = host or '127.0.0.1'
    o.port = port or 8765
    setmetatable(o, self)
    self.__index = self
    return o
end

Creating a script to run the echo server is quite simple:

echo_server_example.lua


local echo = require 'echo'
local server = echo.EchoServer:new()
server:serve_forever()

Likewise, the script for the echo client is also straight-forward:

echo_client_example.lua


local echo = require 'echo'
local client = echo.EchoClient:new()
print(client:request('hello'))
print(client:request('goodbye'))

echo_client_example.lua output


hello
goodbye

No comments:

Post a Comment