电脑打不开建设银行网站,做食品企业网站的费用,展厅设计说明,无锡大型网站设计公司游戏服务端要处理客户端请求#xff0c;作为服务端引擎#xff0c;网络编程也是Skynet的核心功能。1、学习网络模块 skynet.socket模块提供了网络编程的API#xff0c;常用的API如下表所示#xff1a;Lua API说明socket.listen(address ,port)监听一个端口#xff0c;返回… 游戏服务端要处理客户端请求作为服务端引擎网络编程也是Skynet的核心功能。1、学习网络模块 skynet.socket模块提供了网络编程的API常用的API如下表所示Lua API说明socket.listen(address ,port)监听一个端口返回一个 id 供 start 使用。socket.start(id , accept) accept 是一个函数。每当一个监听的 id 对应的 socket 上有连接接入的时候都会调用 accept 函数。这个函数会得到接入连接的 id 以及 ip 地址。你可以做后续操作。socket.read(id, sz)从一个 socket 上读 sz 指定的字节数。如果读到了指定长度的字符串它把这个字符串返回。如果连接断开导致字节数不够将返回一个 false 加上读到的字符串。如果 sz 为 nil 则返回尽可能多的字节数但至少读一个字节若无新数据会阻塞。socket.write(id, str) 把一个字符串置入正常的写队列skynet框架会在 socket 可写时发送它。socket.close(id) 关闭一个连接这个 API 有可能阻塞住执行流。因为如果有其它coroutine 正在阻塞读这个id对应的连接会先驱使读操作结束close操作才返回。 socket.read中所谓的阻塞模式和 skynet.call一样都利用了Lua的协程机制。调用socket.read服务有可 能被挂起直到接收到数据才会往下执行。 更多API参见https://github.com/cloudwu/skynet/wiki/Socket 2、功能开发 学完上面的API我们来写一个Echo程序Echo程序其实就是一个开启处理客户端消息的服务它会把收到的内容原封不动地发回给客户端。以下是Echo程序的示意图 3、代码实现 1主服务 本例只需开启一个服务在skynet/examples目录下创建main_echo.lua文件输入代码如下所示 local skynet require skynet
local socket require skynet.socketfunction connect(fd, addr)--启用连接print(fd.. connected addr:..addr)socket.start(fd)--消息处理while true dolocal readdata socket.read(fd)--正常接收if readdata ~ nil thenprint(fd.. recv ..readdata)socket.write(fd, readdata)--断开连接elseprint(fd.. close )socket.close(fd)endend
endskynet.start(function()local listenfd socket.listen(0.0.0.0, 8888)socket.start(listenfd ,connect)
end)
代码说明 先引入skynet和skynet.socket这两个模块 使用skynet.start启动服务后依次调用socket.listen和socket.start来监听8888端口 新客户端发起连接时connect方法将被调用 在while循环里程序先用socket.read接收数据如果收到数据if readdata~nil的真分 支则通过socket.write将数据发回客户端如果客户端断开了连接 if readdata~nil的假分支则调用socket.close关闭连接 “0.0.0.0”表示不限制客户端的IP。
2配置文件 在skynet/examples目录下创建config_echo文件也可以拿之前的配置文件修改start的值即可配置参数如下所示
include config.paththread 8
logger nil
logpath .
harbor 0
start main_echo -- main script
bootstrap snlua bootstrap -- The service for bootstrap
-- snax_interface_g snax_g
cpath root..cservice/?.so
-- daemon ./skynet.pid
4、运行代码
1输入如下指令即可运行
cd skynet ./skynet examples/config_echo 如果开启服务端时提示“init service failed: ./lualib/skynet/socket.lua:414: Listen error”意味着监听端口8888被占用可能是多次运行服务端所致可以执行“killall skynet”命令关闭所有的Skynet进程。2重新打开终端输入命令显示如下结果表示运行成功 3此时我们还需要开启一个telnet来作为我们的客户端去连接主服务我们再打开一个终端输入指令“telnet 127.0.0.1 8888” 知识拓展telnet是Linux下的一个程序可用于调试TCP连接。如果尚未安装可执行“apt-get install telnet”安装。输入“telnet [ip] [端口]”即可向指定服务器发起连接连接成功后还可以在telnet中输入内容按回车键可将字符串发 给服务端。 5、运行结果
当客户端连接成功后主服务会收到一条外部访问的IP地址 客户端输入了“hello”发送给服务端服务器收到消息后再返回给客户端如下图所示