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

ops/2024/12/26 2:22:27/

目录

一、客户端代码

二、本地服务器代码

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


一、客户端代码

连接本地服务器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/ops/144997.html

相关文章

音视频学习(二十七):SRT协议

SRT&#xff08;Secure Reliable Transport&#xff09;是一种开源的网络传输协议&#xff0c;专为实时音视频数据传输设计&#xff0c;具有低延迟、高可靠性和安全性等特点。 核心功能 SRT协议旨在解决实时音视频传输中的网络抖动、丢包、延迟和安全问题&#xff0c;提供以下…

gitlab window如何设置ssh

在GitLab中设置SSH需要以下步骤&#xff1a; 在GitLab账户中&#xff0c;导航到“用户设置”下的“SSH密钥”部分。 生成SSH密钥对&#xff08;如果你还没有的话&#xff09;。在Windows上&#xff0c;你可以使用ssh-keygen命令来生成密钥。 在命令提示符或PowerShell中运行以…

自动控制系统综合与LabVIEW实现

自动控制系统综合是为了优化系统性能&#xff0c;确保其可靠性、稳定性和灵活性。常用方法包括动态性能优化、稳态误差分析、鲁棒性设计等。结合LabVIEW&#xff0c;可以通过图形化编程、高效数据采集与处理来实现系统综合。本文将阐述具体方法&#xff0c;并结合硬件选型提供实…

Pycharm配置PyQt 5

Pycharm配置PyQt 5 一、配置 打开Pycharm,点击File(文件)->Settings(设置): 弹出Settings(设置)配置框,在框中选择 Tools(工具)->External Tools(外部工具) 点击”+“号 在Name(名称)中输入一个名字 Program(程序)中选择安装的designer.exe 我的路径是D:\…

8.Java内置排序算法

10. Java内置排序算法 排序算法的分类 如何写一个通用的排序算法排序元素比较分治算法思想 排序算法选择的建议 O(n)排序算法的选择 1.插入排序性能最好、其次是选择排序&#xff0c;冒泡排序性能最差 2.选择排序不是稳定的排序算法 3.插入排序是最好的选择 4.对于大规模…

流量主微信小程序工具类去水印

工具类微信小程序流量主带后台管理&#xff0c;可开通广告&#xff0c;带自有后台管理&#xff0c;不借助第三方接口 介绍 支持抖音&#xff0c;小红书&#xff0c;哔哩哔哩视频水印去除&#xff0c;功能实现不借助第三方平台。可实现微信小程序流量主广告变现功能&#xff0c…

美国加州房价数据分析02

5. 特征工程 5.1重构数据集 承接上文提到的相似度排名&#xff0c;去掉部分无关的特征。 train_set.corr()["median_house_value"].sort_values(ascendingFalse)为了提高模型训练后的鲁棒性&#xff0c;即防止过拟合&#xff0c;不建议删除关联度最低几项特征&#…

Docker日志与监控

一、引言 随着容器技术在生产环境中被广泛应用&#xff0c;Docker容器的日志管理与监控变得尤为重要。在现代应用程序中&#xff0c;容器化的应用通常是由多个容器组成的服务&#xff0c;而容器中的日志与监控则是确保服务健康运行、诊断问题和优化性能的关键。通过日志和监控…