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

目录

一、客户端代码

二、本地服务器代码

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


一、客户端代码

连接本地服务器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.rhkb.cn/news/495746.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

攻防世界 robots

开启场景 根据提示访问/robots.txt&#xff0c;发现了 f1ag_1s_h3re.php 拼接访问 /f1ag_1s_h3re.php 发现了 flag cyberpeace{d8b7025ed93ed79d44f64e94f2527a17}

gitlab克隆仓库报错fatal: unable to access ‘仓库地址xxxxxxxx‘

首次克隆仓库&#xff0c;失效了&#xff0c;上网查方法&#xff0c;都说是网络代理的问题&#xff0c;各种清理网络代理后都无效&#xff0c;去问同事&#xff1a; 先前都是直接复制的网页url当做远端url&#xff0c;或者点击按钮‘使用http克隆’ 这次对于我来说有效的远端u…

数字IC后端设计实现十大精华主题分享

今天小编给大家分享下吾爱IC社区星球上周十大后端精华主题。 Q1:星主&#xff0c;请教个问题&#xff0c;长tree的时候发现这个scan的tree 的skew差不多400p&#xff0c;我高亮了整个tree的schematic&#xff0c;我在想是不是我在这一系列mux前边打断&#xff0c;设置ignore p…

华为管理变革之道:管理制度创新

目录 华为崛起两大因素&#xff1a;管理制度创新和组织文化。 管理是科学&#xff0c;150年来管理史上最伟大的创新是流程 为什么要变革&#xff1f; 向世界标杆学习&#xff0c;是变革第一方法论 体系之一&#xff1a;华为的DSTE战略管理体系&#xff08;解决&#xff1a…

CentOS7下的vsftpd服务器和客户端

目录 1、安装vsftpd服务器和ftp客户端&#xff1b; 2、配置vsftpd服务器&#xff0c;允许普通用户登录、下载、上传文件&#xff1b; 3、配置vsftpd服务器&#xff0c;允许anonymous用户登录、下载、上传文件&#xff1b; 4、配置vsftpd服务器&#xff0c;允许root用户登录…

Python Polars快速入门指南:LazyFrames

前文已经介绍了Polars的Dataframe, Contexts 和 Expressions&#xff0c;本文继续介绍Polars的惰性API。惰性API是该库最强大的功能之一&#xff0c;使用惰性API可以设定一系列操作&#xff0c;而无需立即运行它们。相反&#xff0c;这些操作被保存为计算图&#xff0c;只在必要…

【论文阅读笔记】IC-Light

SCALING IN-THE-WILD TRAINING FOR DIFFUSION-BASED ILLUMINATION HARMONIZATION AND EDITING BY IMPOSING CONSISTENT LIGHT TRANSPORT 通过施加一致的光线传输来扩展基于扩散模型的真实场景光照协调与编辑训练 前言摘要引言相关工作基于学习的基于扩散模型的外观和光照操纵光…

学习threejs,THREE.CircleGeometry 二维平面圆形几何体

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.CircleGeometry 圆形…

AWS Certified AI Practitioner 自学考试心得

学习目标&#xff1a; 考取 AWS Certified AI Practitioner 那什么是 AWS Certified AI Practitioner 认证 是基础级的认证 比较简单 — 学习内容&#xff1a; 1. AWS网站自学网站 极客时间免费课程&#xff1a;http://gk.link/a/12sJL 配合极客时间课程的章节测试检验自…

WebRTC服务质量(07)- 重传机制(04) 接收NACK消息

WebRTC服务质量&#xff08;01&#xff09;- Qos概述 WebRTC服务质量&#xff08;02&#xff09;- RTP协议 WebRTC服务质量&#xff08;03&#xff09;- RTCP协议 WebRTC服务质量&#xff08;04&#xff09;- 重传机制&#xff08;01) RTX NACK概述 WebRTC服务质量&#xff08;…

RAGFlow 基于深度文档理解构建的开源 RAG引擎 - 安装部署

RAGFlow 基于深度文档理解构建的开源 RAG引擎 - 安装部署 flyfish 1. 确保 vm.max_map_count ≥ 262144 这是指要调整Linux内核参数vm.max_map_count&#xff0c;以确保其值至少为262144。这个参数控制着进程可以映射的最大内存区域数量。对于某些应用程序&#xff08;如Ela…

图神经网络_图嵌入_SDNE

0 提出背景 SDNE&#xff1a;Structural Deep Network Embedding 之前的DeepWalk、LINE、node2vec、struc2vec都使用了浅层结构&#xff0c;浅层模型往往不能捕获高度非线性的网络结构。 SDNE方法使用了多个非线性层来捕获节点的embedding。 1 预备知识 1阶相似度衡量的是…

redis——岁月云实战

单线程序&#xff0c;基于IO多路复用&#xff0c;基于内存和c语言编写&#xff0c;性能高。redis官方命令 1 数据结构 1.1 key的层级 redis的key可以通过冒号&#xff08;:&#xff09;来划分层级&#xff0c;如下图mms:company:order&#xff0c;但系统中可以看到有不少没有…

参数名在不同的SpringBoot版本中,处理方案不同

参数名在不同的SpringBoot版本中&#xff0c;处理方案还不同&#xff1a; 在springBoot的2.x版本&#xff08;保证参数名一致&#xff09; springBoot的父工程对compiler编译插件进行了默认的参数parameters配置&#xff0c;使得在编译时&#xff0c;会在生成的字节码文件中…

五、Swagger 介绍(Flask+Flasgger的应用)

Swagger 介绍 0. 引言1. Swagger 介绍2. Flasgger 介绍3. Flasgger效果3.1 原始flask代码3.2 转化成Flasgger形式3.3 使用Try it out调试3.4 多个url接口自动生成和调试 4. 使用教程4.1 使用 docstrings 作为规范4.2 使用外部 YAML 文件4.3 使用 Python 字典作为原始规范 5. 和…

LSTM-SVM时序预测 | Matlab基于LSTM-SVM基于长短期记忆神经网络-支持向量机时间序列预测

LSTM-SVM时序预测 | Matlab基于LSTM-SVM基于长短期记忆神经网络-支持向量机时间序列预测 目录 LSTM-SVM时序预测 | Matlab基于LSTM-SVM基于长短期记忆神经网络-支持向量机时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.LSTM-SVM时序预测 | Matlab基于LSTM…

【MySQL】十三,关于MySQL的全文索引

MySQL的全文索引用于搜索文本中的关键字&#xff0c;类似于like查询。 演示 建表 CREATE TABLE demo (id INT(11) NOT NULL,name CHAR(30) NOT NULL,age INT(11) NOT NULL,info VARCHAR(255),primary key(id),fulltext index futxt_idx_info(info) );此表的默认存储引擎为In…

数据可视化echarts学习笔记

目录&#xff0c;介绍 知识储备 一端操作&#xff0c;多端联动的效果&#xff08;开启了多个网页&#xff0c;操作一端&#xff0c;多个网页的效果会跟着改变&#xff09; cmd命令控制面板返回上一级或上上级 在当前目录打开文件&#xff1a; cd 文件名 在Windows命令提示符&am…

NS3学习——tcpVegas算法代码详解(2)

NS3学习——tcpVegas算法代码详解&#xff08;1&#xff09;-CSDN博客 目录 4.TcpVegas类中成员函数 (5) CongestionStateSet函数 (6) IncreaseWindow函数 1.检查是否启用 Vgas 2.判断是否完成了一个“Vegas 周期” 2.1--if&#xff1a;判断RTT样本数量是否足够 2.2--e…

在 CentOS 8 系统上安装 Jenkins 的全过程

一、前言 我是一个前端开发&#xff0c;需要频繁将编写的前端系统打包更新到公司的linux服务器&#xff0c;觉得这种工作纯体力活&#xff0c;有时候太浪费时间&#xff0c;以前用过别人搭建的Jenkins可以很好的解决这个问题。 Jenkins 是一款流行的开源持续集成和持续交付&a…