目錄結構
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使用 luasocket 還算簡單吧,直接用 require 函式載入進來就行,在例如下面幾個例子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
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.lualocal
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.lualocal
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 ...