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

25 篇文章 9 订阅
9 篇文章 14 订阅

服务端与客户端的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)

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)

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

运行服务端:

./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

  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值