skynet網絡模塊的簡易demo

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端口配成一樣導致第二個進程起不起來,改一下就好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章