| ---- 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 |