【LuaFramework】服务器模块相关知识

news/2024/12/22 23:00:33/

目录

一、客户端代码

二、本地服务器代码

三、解决服务器无法多次接收客户端消息问题


一、客户端代码

连接本地服务器127.0.0.1:2012端口(如何创本地服务器,放最后说),连接成功后会回调

协议号Connect是101,其他如下,将这个Connect协议号和数据(空的字节流)放入一个mEvents队列,等待Update执行(目的应该是回到主线程才执行回调,避免一些问题)

这里Update方法就是Monobehaviour的生命周期Update,它简单地遍历队列逐个出队派发事件“DISPATCH_MESSAGE”去到如下

再回到调用lua的Network.OnSocket方法并且将 buffer.Key(协议号 101) 和 buffer.Value(空) 数据传递。

Network.OnSocket继续派发协议号作为事件名,执行OnConnect方法,至此完成一整套连接流程

其他相关的事件可以查如下找到相关的代码

由于我们lua侧仅写了1个消息协议号'104' 所以本地服务器代码也是要用104作为协议号传递,不然接收消息检测不到是104就无法正常通过消息派发并执行到对应的lua消息回调代码。

接收消息回调

TestProtoType有很多种传递消息的方式,项目默认使用ProtocalType.BINARY

好绕,最终是到了上面的WriteMessage方法,发送是以"消息长度"+"消息内容"为一条字节流传递到服务器,执行完后回调OnWrite方法

二、本地服务器代码

using System;
using System.Net;
using System.Net.Sockets;namespace SimpleNet
{class Program{static void Main(string[] args){Console.WriteLine("Hello World!");//Socket  tcpSocket listenfd = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);//bindIPAddress ipAdr = IPAddress.Parse("127.0.0.1");IPEndPoint ipEp = new IPEndPoint(ipAdr, 2012);listenfd.Bind(ipEp);//listenlistenfd.Listen(0);Console.WriteLine("启动服务器成功");while (true){//AcceptSocket connfd = listenfd.Accept();Console.WriteLine("服务器Accept");//Recv 测试byte[] readBuff = new byte[100];int count = connfd.Receive(readBuff);//steamstring showStr = "";for(int i = 0; i< count; i++){int b = (int)readBuff[i];showStr += b.ToString() + " ";}Console.WriteLine("字节流:" + showStr);//解析Int16 msgLen = BitConverter.ToInt16(readBuff, 0);Int16 protocal = BitConverter.ToInt16(readBuff, 2);Int16 strLen = BitConverter.ToInt16(readBuff, 5);//具体还要看字节流输出来读取第几个字节是长度,若读错了下一行会报错string str = System.Text.Encoding.UTF8.GetString(readBuff, 6, strLen);Console.WriteLine("消息长度:" + msgLen);Console.WriteLine("协议号:" + protocal);Console.WriteLine("字符串:" + str);//send 原样返回byte[] writeBuff = new byte[count];Array.Copy(readBuff, writeBuff, count);connfd.Send(writeBuff);}}}
}

客户端接收到服务器消息的打印,服务器是直接将客户端的消息拷贝了一份再发送给客户端。

跑代码时发现有些lua报错:FindChild相关不存在

--初始化面板--
function MessagePanel.InitPanel()--this.btnClose = transform:FindChild("Button").gameObject; --bug代码 FindChild是不存在的接口...this.btnClose = transform:Find("Button").gameObject;
end

三、解决服务器无法多次接收客户端消息问题

测试发现上面的服务器代码不支持多次发送和接收消息,可以修改为如下服务器代码解决:

using System;
using System.Net;
using System.Net.Sockets;
using System.Threading.Tasks;namespace SimpleNet
{class Program{static async Task Main(string[] args){SimpleTcpServer server = new SimpleTcpServer("127.0.0.1", 2012);await server.StartAsync();                       }}
}
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;namespace SimpleNet
{public class SimpleTcpServer{private TcpListener _listener;private string _ip;private int _port;        public SimpleTcpServer(string ip, int port){_ip = ip;_port = port;}public async Task StartAsync(){_listener = new TcpListener(IPAddress.Parse(_ip), _port);_listener.Start();Console.WriteLine($"Server started on port {_port}.");while (true){TcpClient client = await _listener.AcceptTcpClientAsync();_ = HandleClientAsync(client);}}private async Task HandleClientAsync(TcpClient client){NetworkStream stream = client.GetStream();byte[] readBuff = new byte[1024];while (true){try{int count = await stream.ReadAsync(readBuff, 0, readBuff.Length);if (count == 0) // Client disconnected{break;}                    //steamstring showStr = "";for (int i = 0; i < count; i++){int b = (int)readBuff[i];showStr += b.ToString() + " ";}Console.WriteLine("字节流:" + showStr);//解析Int16 msgLen = BitConverter.ToInt16(readBuff, 0);Int16 protocal = BitConverter.ToInt16(readBuff, 2);Int16 strLen = BitConverter.ToInt16(readBuff, 5);string str = System.Text.Encoding.UTF8.GetString(readBuff, 7, strLen);Console.WriteLine("消息长度:" + msgLen);Console.WriteLine("协议号:" + protocal);Console.WriteLine("字符串:" + str);//send 原样返回byte[] writeBuff = new byte[count];Array.Copy(readBuff, writeBuff, count);await stream.WriteAsync(writeBuff, 0, writeBuff.Length);}catch (Exception ex){Console.WriteLine("Error: " + ex.Message);break;}}client.Close();}public void Stop(){_listener.Stop();}}
}

http://www.ppmy.cn/news/1557314.html

相关文章

霍特林分布

内容来源 应用多元统计分析 北京大学出版社 高惠璇编著 霍特林 T 2 T^2 T2 分布 一元统计中&#xff0c;若 X ∼ N ( 0 , 1 ) X\sim N(0,1) X∼N(0,1) ξ ∼ χ 2 ( n ) \xi\sim\chi^2(n) ξ∼χ2(n) 且 X X X 与 ξ \xi ξ 相互独立&#xff0c;则 t X ξ / n ∼ t ( n …

Transform组件的用法

文章目录 1. 概念介绍2. 使用方法3. 示例代码我们在上一章回中介绍了Checkbox Widget相关的内容,本章回中将介绍Transform Widget.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在这里说的Transform是一种容器类widget,它和Container组件类似。它可以包含其它的组件…

【Mars3d】设置backgroundImage、map.scene.skyBox、backgroundImage来回切换

相关链接&#xff1a; http://mars3d.cn/editor-vue.html?keyex_1_2_1&idmap/other/backgroundImg 实现代码&#xff1a; export function show1() {map.setOptions({scene: {backgroundType: "image",backgroundImage: "url(//data.mars3d.cn/img/busin…

Python使用GitLab API来获取文件内容

Python使用GitLab API来获取文件内容 一、前提条件 你需要有一个GitLab的访问令牌&#xff08;Access Token&#xff09;&#xff0c;以便进行API调用。你需要知道GitLab项目的ID或路径。你需要知道你要拉取的tag或分支的名称。 三、获取GitLab的访问令牌 登录到你的GitLab…

flink实现复杂kafka数据读取

接上文&#xff1a;一文说清flink从编码到部署上线 环境说明&#xff1a;MySQL&#xff1a;5.7&#xff1b;flink&#xff1a;1.14.0&#xff1b;hadoop&#xff1a;3.0.0&#xff1b;操作系统&#xff1a;CentOS 7.6&#xff1b;JDK&#xff1a;1.8.0_401。 常见的文章中&…

轻松拿捏Spring

目录 Spring基础 什么是Spring框架 Spring 包含的模块有哪些? Core Container AOP Data Access/Integration Spring Web Messaging Spring Test Spring,Spring MVC,Spring Boot 之间什么关系? Spring基础 什么是Spring框架 Spring 是一款开源的轻量级 Java 开发框…

skyler实战渗透笔记—Kioptrix-1

0x00 前言 This Kioptrix VM Image are easy challenges. The object of the game is to acquire root access via any means possible (except actually hacking the VM server or player). The purpose of these games are to learn the basic tools and techniques in vuln…

Pytorch | 从零构建MobileNet对CIFAR10进行分类

Pytorch | 从零构建MobileNet对CIFAR10进行分类 CIFAR10数据集MobileNet设计理念网络结构技术优势应用领域 MobileNet结构代码详解结构代码代码详解DepthwiseSeparableConv 类初始化方法前向传播 forward 方法 MobileNet 类初始化方法前向传播 forward 方法 训练过程和测试结果…