Skynet基础入门例子详解(4)
来源:互联网 发布:北京淘宝培训一对一 编辑:程序博客网 时间:2024/06/05 17:09
服务端与客户端的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 endendskynet.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"endlocal 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) endend
运行服务端:
./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
5 0
- Skynet基础入门例子详解(4)
- Skynet基础入门例子详解(4)
- Skynet基础入门例子详解(4)
- Skynet基础入门例子详解(1)
- Skynet基础入门例子详解(2)
- Skynet基础入门例子详解(3)
- Skynet基础入门例子详解(5)
- Skynet基础入门例子详解(6)
- Skynet基础入门例子详解(7)
- Skynet基础入门例子详解(1)
- Skynet基础入门例子详解(2)
- Skynet基础入门例子详解(3)
- Skynet基础入门例子详解(5)
- Skynet基础入门例子详解(6)
- Skynet基础入门例子详解(7)
- Skynet基础入门例子详解(3)
- Skynet基础入门例子详解(2)
- Skynet基础入门例子详解(6)
- css-对齐
- TelephonyManager的介绍 & Android获取SIM卡信息、设备信息
- 深入理解javascript原型和闭包(18)——补充:上下文环境和作用域的关系
- GYM 101173 F.Free Figurines(贪心)
- web前端代码整理 字符串拼接 获取地址栏参数 ajax请求 时间戳
- Skynet基础入门例子详解(4)
- 静态链接之静态链接
- vue.js+vue-router+sea.js构建SPA应用
- C++文件读写详解(ofstream,ifstream,fstream)
- Android 控件属性详解(二)
- 堆溢出(三)快表DWORD SHOOT
- 洛谷2964 A Coin Game
- 改进RACCommand──一句话完成工作信号的创建、Next/Error事件的订阅,并保证互斥执行
- 获取文件属性