服務端與客戶端的Socket通信
使用Skynet的Socket通信,看官方的例子(example2/client.lua和test/testsocket.lua),不懂sproto協議的同學還真有點懵逼。下面我用我們常用的編程思維來實現一個簡單的Socket通信功能,方便大家理解其中的原理。
在同一個目錄建立4個文件(config,main.lua,socket1.lua,client1.lua)
config文件參考上一節
main.lua代碼:
local skynet = require "skynet"
-- 啓動服務(啓動函數)
skynet.start(function()
-- 啓動函數裏調用Skynet API開發各種服務
print("======Server start=======")
skynet.newservice("socket1")
skynet.exit()
end)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
socket1.lua代碼:
local skynet = require "skynet"
local socket = require "socket"
-- 讀取客戶端數據, 並輸出
local function echo(id)
-- 每當 accept 函數獲得一個新的 socket id 後,並不會立即收到這個 socket 上的數據。這是因爲,我們有時會希望把這個 socket 的操作權轉讓給別的服務去處理。
-- 任何一個服務只有在調用 socket.start(id) 之後,纔可以收到這個 socket 上的數據。
socket.start(id)
while true do
-- 讀取客戶端發過來的數據
local str = socket.read(id)
if str then
-- 直接打印接收到的數據
print(str)
else
socket.close(id)
return
end
end
end
skynet.start(function()
print("==========Socket1 Start=========")
-- 監聽一個端口,返回一個 id ,供 start 使用。
local id = socket.listen("127.0.0.1", 8888)
print("Listen socket :", "127.0.0.1", 8888)
socket.start(id , function(id, addr)
-- 接收到客戶端連接或發送消息()
print("connect from " .. addr .. " " .. id)
-- 處理接收到的消息
echo(id)
end)
--可以爲自己註冊一個別名。(別名必須在 32 個字符以內)
-- skynet.register "SOCKET1"
end)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
client1.lua代碼:
package.cpath = "luaclib/?.so"
package.path = "lualib/?.lua;myexample/e1/?.lua"
if _VERSION ~= "Lua 5.3" then
error "Use lua 5.3"
end
local socket = require "clientsocket"
local fd = assert(socket.connect("127.0.0.1", 8888))
-- 發送一條消息給服務器, 消息協議可自定義(官方推薦sproto協議,當然你也可以使用最熟悉的json)
socket.send(fd, "Hello world")
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
運行服務端:
./skynet ./myexample/e1/config
運行客戶端:
./3rd/lua/lua ./myexample/e1/client1.lua
服務器接收到客戶端發過來的消息並輸出Hello world:
這是一個最簡單的Socket通信例子,服務端只是接收消息,並沒有作出迴應。
下一節實現客戶端和服務端之間的通信
項目源碼:http://download.csdn.net/detail/uisoul/9789555
Socket API參考文檔:https://github.com/cloudwu/skynet/wiki/Socket