使用Lua的擴充套件庫LuaSocket用例

2021-07-25 23:17:56 字數 4334 閱讀 7583

目錄結構

luasocket 是 lua 的網路模組庫,它可以很方便地提供 tcp、udp、dns、ftp、http、smtp、mime 等多種網路協議的訪問操作。

它由兩部分組成:一部分是用 c 寫的核心,提供對 tcp 和 udp 傳輸層的訪問支援。另外一部分是用 lua 寫的,負責應用功能的網路介面處理。

下面介紹兩種安裝方法

# luarocks install luasocket
第二種方法:如果沒安裝有 luarocks,也可以原始碼安裝。

# git clone 

把原始碼clone下來之後就可以進行本地原始碼安裝,直接進入到luasocket目錄進行編譯安裝了

# cd luasocket

# make && make install

-- socket方式請求

local

socket = require("socket")

local host = "100.42.237.125"

local file = "/"

local sock = assert(socket.connect(host, 80)) -- 建立乙個 tcp 連線,連線到 http 連線的標準 80 埠上

local chunk, status, partial = sock:receive(1024) -- 以 1k 的位元組塊來接收資料,並把接收到位元組塊輸出來

-- print(chunk or partial)

until status ~= "closed"

sock:close() -- 關閉 tcp 連線

-- http訪問請求

print(result)

-- smtp方法傳送mail

local smtp = require("socket.smtp")

from = "@126.com>" -- 發件人

-- 傳送列表

rcpt =

mesgt = ,

body = "this is mail content."

}r, e = smtp.send

ifnot r then

print(e)

else

print("send ok!")

end

使用 luasocket 還算簡單吧,直接用 require 函式載入進來就行,在例如下面幾個例子

1)輸出乙個 luasocket 版本資訊:

-- 建立乙個 tcp 連線,連線到 http 連線的標準埠 -- 80 埠上

local sock = assert(socket.connect(host, 80))

-- 以 1k 的位元組塊來接收資料,並把接收到位元組塊輸出來

local chunk, status, partial = sock:receive(1024)

print(chunk or partial)

until status ~= "closed"

-- 關閉 tcp 連線

sock:close()3)使用模組裡內建的 http 方法來訪問:

print(response)本來想寫成單 server 多 client 的 socket 聊天伺服器,不過最後還是卡在客戶端的資料更新上,單程序的 while 輪詢(poll),乙個 io.read 就把伺服器資料接收給截斷了。

僅靠現有的 luasocket 模組不裝其他第三方模組,也是很難做乙個實時的聊天,雖然有 soket.select 在苦苦支撐,但是這還是乙個填不平的坑來了。

可能用上面向併發的 concurrentlua 模組會解決這個資料接收阻塞問題,這個以後再看看,現階段的成果是:在客戶端的終端上敲一些東西後回車會通過 socket 給伺服器傳送資料,伺服器接收到資料後再返回顯示在客戶端的終端上。

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

while1do

local conn = server:accept()

if conn then

conn_count = conn_count + 1

client_tab[conn_count] = conn

print("a client successfully connect!")

endfor conn_count, client in pairs(client_tab) do

local recvt, sendt, status = socket.select(, 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)

endelse

table.remove(client_tab, conn_count)

client:close()

print("client " .. conn_count .. " disconnect!")

endend

endend

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

endrecvt, sendt, status = socket.select(, 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(, nil, 1)

endelse

break

endend

end

使用lua擴充套件nginx的功能

通常,nginx是作為乙個負載均衡伺服器或者web伺服器使用,但是存在這樣一種情況 當太多的無效請求通過nginx分發到上游的伺服器的時候,雖然上游的伺服器集群進行了水平擴充套件,但是當nginx僅僅做乙個請求分發的動作的時候,太多的無效請求直接到達上游伺服器,這樣顯然不太好。所以需要擴充套件一下n...

Golang中使用lua進行擴充套件

最近在專案中需要使用lua進行擴充套件,發現github上有乙個用golang編寫的lua虛擬機器,名字叫做gopher lua.使用後發現還不錯,藉此分享給大家.lua中的資料型別與golang中的資料型別對應關係作者已經在文件中說明,值得注意的是型別是以l開頭的,型別的名稱是以lt開頭的.gol...

使用lua擴充套件應用程式

全域性變數的操作 void lua getglobal lua state l const char name 此函式從lua中取出乙個名為name的全域性變數並將其壓入棧中。如當lua檔案內容為 width 200 height 300 時,以下 int tmain int argc,tchar ...