Skynet基礎入門例子詳解(3)

服務端與客戶端的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

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