目录结构

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扩展的几种使用方法 、socket方式请求 -- socket方式请求
local socket = require("socket")
local host = "100.42.237.125"
local file = "/"
local sock = assert(socket.connect(host, )) -- 创建一个 TCP 连接,连接到 HTTP 连接的标准 端口上
sock:send("GET " .. file .. " HTTP/1.0\r\n\r\n")
repeat
local chunk, status, partial = sock:receive() -- 以 1K 的字节块来接收数据,并把接收到字节块输出来
-- print(chunk or partial)
until status ~= "closed"
sock:close() -- 关闭 TCP 连接
、HTTP访问请求 -- http访问请求
http=require("socket.http")
result=http.request("http://ip.taobao.com/service/getIpInfo.php?ip=123.189.1.100")
print(result)
、SMTP方法发送mail -- smtp方法发送mail
local smtp = require("socket.smtp") from = "<youmail@126.com>" -- 发件人 -- 发送列表
rcpt = {
"<youmail@126.com>",
"<youmail@qq.com>"
} mesgt = {
headers = {
to = "youmail@gmail.com", -- 收件人
cc = '<youmail@gmail.com>', -- 抄送
subject = "This is Mail Title"
},
body = "This is Mail Content."
} r, e = smtp.send{
server="smtp.126.com",
user="youmail@126.com",
password="******",
from = from,
rcpt = rcpt,
source = smtp.message(mesgt)
} if not r then
print(e)
else
print("send ok!")
end
使用 LuaSocket 还算简单吧,直接用 require 函数加载进来就行,在例如下面几个例子 )输出一个 LuaSocket 版本信息: local socket = require("socket")
print(socket._VERSION)
)以 socket 的方式访问获取百度首页数据: local socket = require("socket") local host = "www.baidu.com"
local file = "/" -- 创建一个 TCP 连接,连接到 HTTP 连接的标准端口 -- 端口上
local sock = assert(socket.connect(host, ))
sock:send("GET " .. file .. " HTTP/1.0\r\n\r\n")
repeat
-- 以 1K 的字节块来接收数据,并把接收到字节块输出来
local chunk, status, partial = sock:receive()
print(chunk or partial)
until status ~= "closed"
-- 关闭 TCP 连接
sock:close()
)使用模块里内置的 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 = ""
local server = assert(socket.bind(host, port, ))
server:settimeout()
local client_tab = {}
local conn_count = print("Server Start " .. host .. ":" .. port) while do
local conn = server:accept()
if conn then
conn_count = conn_count +
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, )
if #recvt > 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 =
local sock = assert(socket.connect(host, port))
sock:settimeout() print("Press enter after input something:") local input, recvt, sendt, status
while true do
input = io.read()
if #input > then
assert(sock:send(input .. "\n"))
end recvt, sendt, status = socket.select({sock}, nil, )
while #recvt > do
local response, receive_status = sock:receive()
if receive_status ~= "closed" then
if response then
print(response)
recvt, sendt, status = socket.select({sock}, nil, )
end
else
break
end
end
end
转载:D.H.Q的烂笔头

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

  1. lua luna工具库

    luna工具库 概述 luna库提供了几个lua开发的常见辅助功能: lua/c++绑定 lua序列化与反序列化 变长整数编码,用于lua序列化,当然也可以方便的用于其他场合 这里把代码编译成了动态库 ...

  2. Golang中使用lua进行扩展

    前言 最近在项目中需要使用lua进行扩展,发现github上有一个用golang编写的lua虚拟机,名字叫做gopher-lua.使用后发现还不错,借此分享给大家. 数据类型 lua中的数据类型与go ...

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

    装完php.发现需要一些新扩展库比如常见的mysqli之类的.在不重装php安装新扩展,以一个不常用的库xsl为例. 环境:centos6.8,php5.3.29 ,osx10.11.6 我的php相 ...

  4. php mysqli扩展库之预处理操作

    分享下php使用mysqli扩展库进行预处理操作的二个例子,有意研究mysqli用法的朋友,可以参考学习下,一定会有所帮助的. 例1.使用mysqli扩展库的预处理技术 mysqli stmt 向数据 ...

  5. 生成lua的静态库.动态库.lua.exe和luac.exe

    前些日子准备学习下关于lua coroutine更为强大的功能,然而发现根据lua 5.1.4版本来运行一段代码的话也会导致 "lua: attempt to yield across me ...

  6. Z.ExtensionMethods 一个强大的开源扩展库

    今天有意的在博客园里面搜索了一下 Z.ExtensionMethods 这个扩展类库,确发现只搜到跟这个真正相关的才两篇博文而已,我都点进去看了一下,也都只是提到而已,没有专门介绍,才引起我写这篇文档 ...

  7. PHP使用mysqli扩展库实现增删改查(面向对象版)

    mysqli扩展库是mysql扩展库的改进版本,在mysql扩展库的基础上提高了稳定性和效率,mysqli扩展库有两套东西,一套就是面向过程的mysqli另一套是面向对象的mysqli.操作方式大体和 ...

  8. PHP mysqli 扩展库(面向对象/数据库操作封装/事务控制/预编译)

    1.和mysql扩展库的区别: (1   安全性.稳定性更高 (2  提供了面向对象和面向过程两种风格 2.php.ini  中的  extension=php_mysqli.dll 解除封印 3.面 ...

  9. PHP基础Mysql扩展库

    mysql扩展库操作步骤如下: 1.连接数据库 2.选择数据库 3.设置操作编码 4.发送指令sql,并返回结果集     ddl:数据定义语句     dml:数据操作语句     dql:数据查询 ...

随机推荐

  1. windows 线程同步

    Windows 临界区,内核事件,互斥量,信号量. 临界区,内核事件,互斥量,信号量,都能完成线程的同步,在这里把他们各自的函数调用,结构定义,以及适用情况做一个总结. 临界区: 适用范围:它只能同步 ...

  2. Android内存优化8 内存检测工具2 LeakCanary——直白的展现Android中的内存泄露

    之前碰到的OOM问题,终于很直白的呈现在我的眼前:我尝试了MAT,但是发现不怎么会用.直到今天终于发现了这个新工具: 当我们的App中存在内存泄露时会在通知栏弹出通知: 当点击该通知时,会跳转到具体的 ...

  3. 非docker的jenkins的master如何使用docker的jenkins的slave

    前提 1.存在jenkins的master,这个master不是docker的,是通过yum install jenkins安装的 2.使用docker创建n个jenkins,方法是docker pu ...

  4. 十.spring-boot添加jsp支持

    1.创建maven web project: 2.在添加web依赖 3.配置application.properties支持jsp 4.添加一个controller类 5.加入jsp页面 6.启动类 ...

  5. java中int取值范围是怎么计算的?

    首先jdk中定义int占4个字节 ===> 32位(后面全部的计算都是以此为根据的) 32位就是jvm仅仅给分配32个格子的空间,用以存放数据. 总所周知计算机中用0和1存放数据. 那么,32个 ...

  6. flask上传图片或者文件

    在flask unittest自动化测试中如何上传图片或者文件 import StringIO picture = StringIO.StringIO(open('/home/admin/Pictur ...

  7. unity GI

    占坑 lightmapper有两种:  Enlighten, Progressive Enlighten: baked GI  静态物体 离线烘焙 precomputed GI 也是适用于静态物体 F ...

  8. How to make an executable jar file?

    https://stackoverflow.com/questions/5258159/how-to-make-an-executable-jar-file 文件的路径如下: package com. ...

  9. An incompatible version 1.1.14 of APR based Apache Tomcat Native library is installed, while Tomcat

    启动tomcat 7.0, 看到日志里出现严重警告, An incompatible version 1.1.14 of APR based Apache Tomcat Native library ...

  10. 适用于iOS6之后的苹果提供的下拉刷新

    一:iOS6.0及以后: 下拉刷新控件UIRefreshControl TableView属性:refreshControl 二:使用 - (void)colseTheTB { [self dismi ...