使用Lua的扩展库LuaSocket用例

目录结构

LuaSocket 是 Lua 的网络模块库,它可以很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。

它由两部分组成:一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。

一、安装LuaSocket

下面介绍两种安装方法

第一种方法:如果你有安装了 Lua 模块的安装和部署工具 LuaRocks,那么一条指令就能安装部署好 LuaSocket:

# luarocks install luasocket
第二种方法:如果没安装有 LuaRocks,也可以源码安装。

先把 LuaRocks 下载下来,当前可用的版本是 luasocket-3.0-rc1(luasocket的源码有托管在Github.com):

# git clone https://github.com/diegonehab/luasocket.git
把源码clone下来之后就可以进行本地源码安装,直接进入到luasocket目录进行编译安装了

# cd luasocket
# make && make install
LuaSocket 使用

接下来是LuaSocket扩展的几种使用方法

1、socket方式请求

-- socket方式请求
local socket = require("socket")
local host = "100.42.237.125"
local file = "/"
local sock = assert(socket.connect(host, 80))  -- 创建一个 TCP 连接,连接到 HTTP 连接的标准 80 端口上
sock:send("GET " .. file .. " HTTP/1.0\r\n\r\n")
repeat
    local chunk, status, partial = sock:receive(1024) -- 以 1K 的字节块来接收数据,并把接收到字节块输出来
    -- print(chunk or partial)
until status ~= "closed"
sock:close()  -- 关闭 TCP 连接
2、HTTP访问请求

-- http访问请求
http=require("socket.http")
result=http.request("http://ip.taobao.com/service/getIpInfo.php?ip=123.189.1.100")
print(result)
3、SMTP方法发送mail

-- smtp方法发送mail
local smtp = require("socket.smtp")

from = "<[email protected]>" -- 发件人

-- 发送列表
rcpt = {
    "<[email protected]>",
    "<[email protected]>"
}

mesgt = {
    headers = {
        to = "[email protected]", -- 收件人
        cc = ‘<[email protected]>‘, -- 抄送
        subject = "This is Mail Title"
    },
    body = "This is  Mail Content."
}

r, e = smtp.send{
    server="smtp.126.com",
    user="[email protected]",
    password="******",
    from = from,
    rcpt = rcpt,
    source = smtp.message(mesgt)
}

if not r then
   print(e)
else
   print("send ok!")
end
使用 LuaSocket 还算简单吧,直接用 require 函数加载进来就行,在例如下面几个例子

1)输出一个 LuaSocket 版本信息:

local socket = require("socket")
print(socket._VERSION)
2)以 socket 的方式访问获取百度首页数据:

local socket = require("socket")

local host = "www.baidu.com"
local file = "/"

-- 创建一个 TCP 连接,连接到 HTTP 连接的标准端口 -- 80 端口上
local sock = assert(socket.connect(host, 80))
sock:send("GET " .. file .. " HTTP/1.0\r\n\r\n")
repeat
    -- 以 1K 的字节块来接收数据,并把接收到字节块输出来
    local chunk, status, partial = sock:receive(1024)
    print(chunk or partial)
until status ~= "closed"
-- 关闭 TCP 连接
sock:close()
3)使用模块里内置的 http 方法来访问:

local http = require("socket.http")
local response = http.request("http://www.baidu.com/")
print(response)
一个简单的 client/server 通信连接

本来想写成单 server 多 client 的 socket 聊天服务器,不过最后还是卡在客户端的数据更新上,单进程的 while 轮询(poll),一个 io.read 就把服务器数据接收给截断了。

仅靠现有的 LuaSocket 模块不装其他第三方模块,也是很难做一个实时的聊天,虽然有 soket.select 在苦苦支撑,但是这还是一个填不平的坑来了。

可能用上面向并发的 concurrentlua 模块会解决这个数据接收阻塞问题,这个以后再看看,现阶段的成果是:在客户端的终端上敲一些东西后回车会通过 socket 给服务器发送数据,服务器接收到数据后再返回显示在客户端的终端上。

一个简单的东西,纯属练手,代码如下:

server端

-- server.lua
local socket = require("socket")

local host = "127.0.0.1"
local port = "12345"
local server = assert(socket.bind(host, port, 1024))
server:settimeout(0)
local client_tab = {}
local conn_count = 0

print("Server Start " .. host .. ":" .. port) 

while 1 do
    local conn = server:accept()
    if conn then
        conn_count = conn_count + 1
        client_tab[conn_count] = conn
        print("A client successfully connect!")
    end

    for conn_count, client in pairs(client_tab) do
        local recvt, sendt, status = socket.select({client}, nil, 1)
        if #recvt > 0 then
            local receive, receive_status = client:receive()
            if receive_status ~= "closed" then
                if receive then
                    assert(client:send("Client " .. conn_count .. " Send : "))
                    assert(client:send(receive .. "\n"))
                    print("Receive Client " .. conn_count .. " : ", receive)
                end
            else
                table.remove(client_tab, conn_count)
                client:close()
                print("Client " .. conn_count .. " disconnect!")
            end
        end

    end
end
client端

-- client.lua
local socket = require("socket")

local host = "127.0.0.1"
local port = 12345
local sock = assert(socket.connect(host, port))
sock:settimeout(0)

print("Press enter after input something:")

local input, recvt, sendt, status
while true do
    input = io.read()
    if #input > 0 then
        assert(sock:send(input .. "\n"))
    end

    recvt, sendt, status = socket.select({sock}, nil, 1)
    while #recvt > 0 do
        local response, receive_status = sock:receive()
        if receive_status ~= "closed" then
            if response then
                print(response)
                recvt, sendt, status = socket.select({sock}, nil, 1)
            end
        else
            break
        end
    end
end
转载:D.H.Q的烂笔头
时间: 2024-11-02 23:39:05

使用Lua的扩展库LuaSocket用例的相关文章

关于lua扩展库lpack的使用指南

最近在研究luasocket,准备用全部用lua的扩展库来实现一套轻量级框架,用来做一些工具.简单的游戏服务器,以及作为网络库用在cocos2dx中. 完善的网络库必然会遇到粘包.半包的问题,luasocket也不例外,由于网络部分在lua,协议的制定和buff的解析都没有合适的方案,又不想在C++中来封装接口,后面在网上查了一些资料,发现lua也有一个二进制打包的扩展库--lpack,了解之后发现还是蛮好用的,就决定使用它来做buff解析,用以解决粘包.半包的问题. 首先需要下载lpack的源

cocos2d-x 3.3 导入lua扩展库

cocos2d-x 导入lua扩展库有几个点需要注意: 1.cocos2d-x 中的lua版本为5.1.4,所导入的lua库需要对应相应的版本库. 2.在vs 2012 中编译cocos2d-x ,添加的C文件需要注明用C编译,如一般.h文件需要这样写 #ifndef __LUA_LPEG_H_ #define __LUA_LPEG_H_ #if __cplusplus extern "C" { #endif #include "lua.h" #include &q

lua luna工具库

luna工具库 概述 luna库提供了几个lua开发的常见辅助功能: lua/c++绑定 lua序列化与反序列化 变长整数编码,用于lua序列化,当然也可以方便的用于其他场合 这里把代码编译成了动态库,由于代码非常简单,实际使用时也可以简单的复制文件到自己的工程.lua_archiver引用了lz4库用于数据压缩(lz4.h+lz4.c). lua/c++绑定库(luna.h, luna.cpp)支持Windows, Linux, macOS三平台,默认的luna.h实现需C++14支持.如果编

Lua 标准库- 模块(Modules)

Lua包库为lua提供简易的加载及创建模块的方法,由require.module方法及package表组成 1.module (name [, ···]) 功能:建立一个模块. module的处理流程: module(name, cb1, cb2, ...) a. 如果package.loaded[name]是一个table,那么就把这个table作为一个module b. 如果全局变量name是一个table,就把这个全局变量作为一个module c. 当以前两种情况都不存表name时,将新建

Linux下为PHP添加扩展库

例子:添加mbstring扩展库 1. 进入PHP源码目录(没有源码的可以先用命令:# php -v 查看版本号,然后上PHP官网下载源码) 2. 进入PHPi源码下的FTP扩展库的目录: # cd [Your PHP Source Folder]/ext/mbstring 3. 使用 phpize 命令生成配置文件: # phpize 4. 执行configure: # ./configure --with-php-config=/usr/local/php/bin/php-config  (

phpsize安装扩展库

以opcache为例讲解 找到php源码文件进入opcache扩展库路径 cd /soft/php/php-5.6.10/ext/opcache 执行phpize命令 找到原来php的配置文件  ./configure --with-php-config=/usr/local/php/bin/php-config make && make install 如果没什么问题将出现如下提示(可能与你的不同): Installing shared extensions:     /usr/loca

centos下不重装php——给PHP添加新扩展库

装完php.发现需要一些新扩展库比如常见的mysqli之类的.在不重装php安装新扩展,以一个不常用的库xsl为例. 环境:centos6.8,php5.3.29 ,osx10.11.6 我的php相关目录如下:我的php安装包位置:  ~/php-5.3.29  以下简写为~/php*我的php安装位置: /usr/local/php5329 以下简写为/usr/local/php* 要安装的xsl库在 ~/php*/ext/xsl中 给xsl生成config文件   用到/usr/local

PHP加密扩展库—Mcrypt扩展库

在本文开始正文开始之前,我们先来了解一下什么是PHP加密扩展库:PHP中不但几种加密函数(md5,crypt,sha1),在此之外,PHP中还有一些功能比较全面的加密扩展库!就好比php本来不支持操作某种功能 ,但在新版本想对它提供支持,就以扩展的方式来提供,这样,我们在配置php时,如果我们不用此功能,我们就可以让php不加载他.从而节省服务器资源.提供其性能.直线电机选型 在以前的三篇文章<PHP加密函数—crypt()函数加密>.<PHP加密函数—md5()函数加密>以及&l

Github上比较流行的PHP扩展库项目

这里列出比较常用的PHP开源扩展库项目: swoole, C扩展实现的PHP异步并行网络通信框架,可以重新定义PHP.过去PHP只能做Web项目,现在有了Swoole.任意服务器端程序都可以用PHP来写. yaf,C扩展实现的高性能Web开发框架. php-webim,基于swoole实现的Web即时聊天工具,支持websocket+http comet长链接推送,可以发送文字内容和图片. react 使用PHP代码实现异步框架.如果说swoole是node.js的升级版,react.php就是