---- Licensed to the Apache Software Foundation (ASF) under one -- or more contributor license agreements. See the NOTICE file -- distributed with this work for additional information -- regarding copyright ownership. The ASF licenses this file -- to you under the Apache License, Version 2.0 (the -- "License"); you may not use this file except in compliance -- with the License. You may obtain a copy of the License at -- -- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, -- software distributed under the License is distributed on an -- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -- KIND, either express or implied. See the License for the -- specific language governing permissions and limitations -- under the License. -- require 'TTransport' require 'libluasocket' -- TSocketBase TSocketBase = TTransportBase:new{ __type = 'TSocketBase', timeout = 1000, host = 'localhost', port = 9090, handle } function TSocketBase:close() if self.handle then self.handle:destroy() self.handle = nil end end -- Returns a table with the fields host and port function TSocketBase:getSocketInfo() if self.handle then return self.handle:getsockinfo() end terror(TTransportException:new{errorCode = TTransportException.NOT_OPEN}) end function TSocketBase:setTimeout(timeout) if timeout and ttype(timeout) == 'number' then if self.handle then self.handle:settimeout(timeout) end self.timeout = timeout end end -- TSocket TSocket = TSocketBase:new{ __type = 'TSocket', host = 'localhost', port = 9090 } function TSocket:isOpen() if self.handle then return true end return false end function TSocket:open() if self.handle then self:close() end -- Create local handle local sock, err = luasocket.create_and_connect( self.host, self.port, self.timeout) if err == nil then self.handle = sock end if err then terror(TTransportException:new{ message = 'Could not connect to ' .. self.host .. ':' .. self.port .. ' (' .. err .. ')' }) end end function TSocket:read(len) local buf = self.handle:receive(self.handle, len) if not buf or string.len(buf) ~= len then terror(TTransportException:new{errorCode = TTransportException.UNKNOWN}) end return buf end function TSocket:write(buf) self.handle:send(self.handle, buf) end function TSocket:flush() end -- TServerSocket TServerSocket = TSocketBase:new{ __type = 'TServerSocket', host = 'localhost', port = 9090 } function TServerSocket:listen() if self.handle then self:close() end local sock, err = luasocket.create(self.host, self.port) if not err then self.handle = sock else terror(err) end self.handle:settimeout(self.timeout) self.handle:listen() end function TServerSocket:accept() local client, err = self.handle:accept() if err then terror(err) end return TSocket:new({handle = client}) end