您的位置:首页 > 其它

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

2017-04-24 13:45 507 查看


服务端与客户端的Socket通信2

在同一个目录建立4个文件(config,main.lua,socket2.lua,client2.lua) 

config文件参考上一节

main.lua代码:
local skynet = require "skynet"

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

skynet.newservice("socket2")
skynet.exit()
end)
1
2
3
4
5
6
7
8
9
10

socket2.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("client say:"..str)
-- 把一个字符串置入正常的写队列,skynet 框架会在 socket 可写时发送它。
socket.write(id, 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 "SOCKET2"
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

client2.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))

socket.send(fd, "Hello world")
while true do
-- 接收服务器返回消息
local str   = socket.recv(fd)
if str~=nil and str~="" then
print("server says: "..str)
-- socket.close(fd)
-- break;
end

-- 读取用户输入消息
local readstr = socket.readstdin()
if readstr then
if readstr == "quit" then
socket.close(fd)
break;
else
-- 把用户输入消息发送给服务器
socket.send(fd, readstr)
end
else
socket.usleep(100)
end
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

运行服务端:
./skynet ./myexample/e1/config


运行客户端:
./3rd/lua/lua ./myexample/e1/client2.lua


运行客户端后,你可以在命令行输入你想发送的字符。 

服务端接收到消息后会打印消息,并原样发送给客户端,客户端收到消息也打印出来。





通过以上例子,详细大家已基本理解Skynet的Socket通信原理。 

下一节将讲述通信协议的使用。

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

Socket API参考文档:https://github.com/cloudwu/skynet/wiki/Socket
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  socket 通信