skynet網絡模塊的簡易demo
服務端
local skynet = require "skynet"
local socket = require "skynet.socket"
skynet.error("hahha")
local function acceptrecv(id, addr)
socket.start(id)
skynet.error("connect from "..addr.." "..id)
while true do
local readstr = socket.read(id)
if readstr then
skynet.error("recv data from client ".."id : "..id.." data : "..readstr)
else
socket.close(id)
skynet.error("socket closed id : "..id)
return
end
end
end
skynet.start(function()
skynet.error("ready to listen")
local id = socket.listen("127.0.0.1", 8001)
skynet.error("listen socket:", "127.0.0.1:8001", "id", id)
socket.start(id, acceptrecv)
skynet.error("socket server closed")
end)
客戶端
local skynet = require "skynet"
local socket = require "skynet.socket"
skynet.start(function()
skynet.error("Ives socketclient Start...")
skynet.error("ready to connect to server...")
local id = socket.open("127.0.0.1:8001")
skynet.error("connected to server, id :" ..id)
for i = 1, 3 do
socket.write(id, i.."hello".."\n")
skynet.sleep(100)
end
skynet.error("send data over")
socket.close(id)
skynet.exit()
end)
客戶端終端輸出
[:01000002] LAUNCH snlua bootstrap
[:01000003] LAUNCH snlua launcher
[:01000004] LAUNCH snlua cmaster
[:01000004] master listen socket 0.0.0.0:2012
[:01000005] LAUNCH snlua cslave
[:01000005] slave connect to master 127.0.0.1:2012
[:01000006] LAUNCH harbor 1 16777221
[:01000004] connect from 127.0.0.1:55051 4
[:01000004] Harbor 1 (fd=4) report 127.0.0.1:2525
[:01000005] Waiting for 0 harbors
[:01000005] Shakehand ready
[:01000007] LAUNCH snlua datacenterd
[:01000008] LAUNCH snlua service_mgr
[:01000009] LAUNCH snlua main
[:01000009] Ives socketclient Start...
[:01000009] ready to connect to server...
[:01000009] connected to server, id :5
[:01000009] send data over
[:01000009] KILL self
[:01000002] KILL self
服務端終端輸出
[:01000002] LAUNCH snlua bootstrap
[:01000003] LAUNCH snlua launcher
[:01000004] LAUNCH snlua cmaster
[:01000004] master listen socket 0.0.0.0:2013
[:01000005] LAUNCH snlua cslave
[:01000005] slave connect to master 127.0.0.1:2013
[:01000004] connect from 127.0.0.1:55032 4
[:01000006] LAUNCH harbor 1 16777221
[:01000004] Harbor 1 (fd=4) report 127.0.0.1:2526
[:01000005] Waiting for 0 harbors
[:01000005] Shakehand ready
[:01000007] LAUNCH snlua datacenterd
[:01000008] LAUNCH snlua service_mgr
[:01000009] LAUNCH snlua main
[:01000009] hahha
[:01000009] ready to listen
[:01000009] listen socket: 127.0.0.1:8001 id 5
[:01000009] socket server closed
[:01000002] KILL self
[:01000009] connect from 127.0.0.1:55052 6
[:01000009] recv data from client id : 6 data : 1hello
[:01000009] recv data from client id : 6 data : 2hello
[:01000009] recv data from client id : 6 data : 3hello
[:01000009] socket closed id : 6
遇到的問題
1、skynet的服務是異步的,剛開始在服務端最後寫了skynet.exit(),導致socket.start()不能一直監聽socket,然後想的cpp裏面是用的死循環,就寫的寫循環start(),結果就是一個id的socket.start只能用一次,這個socket沒有close不能再次調用start,不然會報is not closed的錯。
所以skynet.start之後就不用管了。
2、客戶端for循環裏面直接發送三次消息沒有間隔。
由於skynet的消息是先存在一個隊列裏面的,在合適的時候發送出去,所以在直接for三次會導致消息一次性的發送出去,雖然也能讓消息發到服務端,但是不滿足最開始的需求,所以做了延遲處理。
3、服務端收完消息之後判斷字符串爲空雖然close了socket,但是沒有return,會導致又去讀這個socket的消息,應該讀不到東西,就報錯了。
4、skynet節點啓動的配置還是沒搞清楚,複製的example裏的,沒有修改節點端口,客戶端服務端的master端口配成一樣導致第二個進程起不起來,改一下就好。