Skynet基础入门例子详解(3)

服务端与客户端的Socket通讯

使用Skynet的Socket通讯,看官方的例子(example2/client.lua和test/testsocket.lua),不懂sproto协议的同窗还真有点懵逼。下面我用咱们经常使用的编程思惟来实现一个简单的Socket通讯功能,方便你们理解其中的原理。git

在同一个目录创建4个文件(config,main.lua,socket1.lua,client1.lua)
config文件参考上一节github

main.lua代码:web

local skynet = require "skynet"

-- 启动服务(启动函数)
skynet.start(function()
    -- 启动函数里调用Skynet API开发各类服务
    print("======Server start=======")

    skynet.newservice("socket1")
    skynet.exit()
end)

socket1.lua代码:编程

local skynet = require "skynet"
-- local socket = require "socket"
-- 新版本
local socket = require "skynet.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)

client1.lua代码:json

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 socket = require "client.socket"

local fd = assert(socket.connect("127.0.0.1", 8888))

-- 发送一条消息给服务器, 消息协议可自定义(官方推荐sproto协议,固然你也可使用最熟悉的json)
socket.send(fd, "Hello world")

运行服务端:服务器

./skynet ./myexample/e1/config

运行客户端:socket

./3rd/lua/lua ./myexample/e1/client1.lua

服务器接收到客户端发过来的消息并输出Hello world:svg

这里写图片描述

这是一个最简单的Socket通讯例子,服务端只是接收消息,并无做出回应。
下一节实现客户端和服务端之间的通讯函数

项目源码:http://download.csdn.net/detail/uisoul/9789555ui

Socket API参考文档:https://github.com/cloudwu/skynet/wiki/Socket