Zjh游戏(六)客户端接收发送消息以及连接测试
前期准备
- 创建工程和场景
- 把Server端的EncodeTools和NetMsg拖到Unity中
- 创建ClientPeer脚本,封装客户端的接收消息和发送消息
- 创建空物体NetMsgCenter用来挂载NetMsgCenter脚本,用来做消息处理中心
using System;
using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using UnityEngine;public class ClientPeer
{private Socket clientSocket;private NetMsg msg;public ClientPeer(){try{msg = new NetMsg();clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);}catch (Exception e){Debug.LogError(e.Message);} }/// <summary>/// 开始连接服务器/// </summary>public void Connect(string ip, int port){try{clientSocket.Connect(new IPEndPoint(IPAddress.Parse(ip), port));Debug.Log("连接服务器成功");StartReceive();}catch (System.Exception e){Debug.LogError(e.Message);}}#region 接收消息/// <summary>/// 数据暂存区/// </summary>private byte[] receiveBuffer = new byte[1024];/// <summary>/// 数据缓存区/// </summary>private List<byte> receiveCache = new List<byte>();/// <summary>/// 存放消息队列/// </summary>private Queue<NetMsg> NetMsgsQueue = new Queue<NetMsg>();/// <summary>///是否正在处理接收的数据/// </summary>private bool isPeocessingReceive = false;/// <summary>/// 开始接收消息/// </summary>private void StartReceive(){if (clientSocket == null && clientSocket.Connected == false){Debug.LogError("当前客户端未进行连接,接收消息失败!");return;}clientSocket.BeginReceive(receiveBuffer, 0, 1024, SocketFlags.None, ReceiveCallBack, clientSocket);}/// <summary>/// 开始接收完成后的回调函数/// </summary>private void ReceiveCallBack(IAsyncResult ar){int length = clientSocket.EndReceive(ar);//得到接收到的长度byte[] data = new byte[length];//接收容器,暂时用来保存接收到的数据Buffer.BlockCopy(receiveBuffer, 0, data, 0, length);//把数据从数据缓存区拷贝到接收容器中receiveCache.AddRange(data);//把接收到的数据添加到数据缓存区if (isPeocessingReceive == false){ProcessReceive();//调用处理数据的方法}StartReceive();//再次开始接收,伪递归}/// <summary>/// 处理接收到的数据/// </summary>private void ProcessReceive(){isPeocessingReceive = true;byte[] packet = EncodeTools.DecodePacket(ref receiveCache);//构造包,得到真正的数据,以前的数据加了包头if (packet == null){isPeocessingReceive = false;return;}NetMsg msg = EncodeTools.DecodeMsg(packet);//把数据构造为NetMsg类NetMsgsQueue.Enqueue(msg);//添加到存放消息的队列中,交给消息处理中心去处理ProcessReceive();//再次处理,伪递归}#endregion#region 接收消息public void SendMsg(int opCode,int subCode,object value){msg.Change(opCode, subCode, value);SendMsg(msg);}public void SendMsg(NetMsg msg){try{byte[] data = EncodeTools.EncodeMsg(msg);//把NetMsg类转换成byte[]byte[] packet = EncodeTools.EncodePacket(data);//构造包,加上包头clientSocket.Send(packet);}catch (Exception e){Debug.LogError(e.Message);}}#endregion
}
测试客户端与服务器的连接
客户端NetMsgCenter脚本(这里用来做测试)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class NetMsgCenter : MonoBehaviour
{private void Awake(){ClientPeer clientSocket = new ClientPeer();clientSocket.Connect("127.0.0.1",6666);}
}
Server端的设置
- 在GameServer的主程序入口中
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MyServer;namespace GameServer
{class Program{static void Main(string[] args){SocketPeer serverSocket = new SocketPeer();serverSocket.SetApplication(new NetMessageCenter());//设置应用层serverSocket.StartServer("127.0.0.1",6666,100);Console.ReadKey();}}
}
测试结果
有需要学习视频的欢迎关注微信公众号
Zjh游戏(六)客户端接收发送消息以及连接测试相关推荐
- 服务端向客户端主动发送消息
通常情况下,无论是web浏览器还是移动app,我们与服务器之间的交互都是主动的,客户端向服务器端发出请求,然后服务器端返回数据给客户端,客户端浏览器再将信息呈现,客户端与服务端对应的模式是: 客户端请 ...
- Zjh游戏(二)网络消息类NetMessage的处理
NetMessage的创建 作用:每次发送消息,都发送这个类,接收到消息后,转换成这个类 自己理解:加上模块号,保证收发消息的准确性,方便接收处理,在脚本中有两个操作码,操作码对应游戏中某个模块,子操 ...
- html模拟微信发送消息,关于微信公众平台模拟接收发送消息(无源码)
由于主要的部分都在模拟登录的时候讲掉了,我就快速而又简单的将接收消息和发送文字消息. 我们登录之后,进入实时消息页面,按一下F12打开"开发人员工具",点击网络标签,点击开始捕获, ...
- LIVE555中RTSP客户端接收媒体流分析及测试代码
LIVE555中testProgs目录下的testRTSPClient.cpp代码用于测试接收RTSP URL指定的媒体流,向服务器端发送的命令包括:DESCRIBE.SETUP.PLAY.TERAD ...
- Nerry实现服务器端指定客户端发送消息。
目录 pom依赖 Server端 main方法初始化netty 服务端端主动给客户端发送消息 pom依赖 <dependency><groupId>io.netty</g ...
- Socket服务端向指定客户端发送消息
Socket服务端向指定客户端发送消息 解决思想 1.项目背景 2.如何上传与下发指令 3.解决方法 4.流程 解决思想 I.指定客户端远程地址是存起来的. II.服务端直接主动发信息给客户端,问题在 ...
- Redis源码解析:21sentinel(二)定期发送消息、检测主观下线
六:定时发送消息 哨兵每隔一段时间,会向其所监控的所有实例发送一些命令,用于获取这些实例的状态.这些命令包括:"PING"."INFO"和"PUBLI ...
- SpringBoot 集成 webSocket,实现后台向客户端推送消息
图文等内容参考链接 SpringBoot2.0集成WebSocket,实现后台向前端推送信息_Moshow郑锴的博客-CSDN博客_springboot websocket WebSocket 简介 ...
- 670-聊天服务器和客户端如何保证消息的可靠传输
如何保证消息的可靠传输? 意思是:客户端把消息发送出去了,只要客户端这里显示他的消息发送成功,就要保证对端一定要收到,要么收不到,客户端就显示发送失败,用户后续选择重新发送消息.如果客户端显示消息发送 ...
最新文章
- mysql+PHP源码编译安装
- linux下svn客户端安装及环境配置
- 基于单片机的贪吃蛇游戏设计_前端入门,基于html,css,javascript的贪吃蛇游戏
- Java虚拟机详解03----常用JVM配置参数
- springboot-springmvc请求参数获取与原理【长文预警,收藏慢啃】
- MVC中提示错误:从客户端中检测到有潜在危险的 Request.Form 值的详细解决方法...
- 【Linux网络】Linux Socket编程 TCP协议
- ng serve出错,关于TypeScript的版本问题
- 【渝粤题库】广东开放大学 标准的研制与编制 形成性考核
- 从厕所排队引发的产品设计方案思考
- 搜集的几个超高难度的数独题
- Android MVP架构搭建
- 信息系统项目管理师必背核心考点(四十三)预期货币价值(EMV)
- 路由器购买指南,和网络不稳定、断网说拜拜
- MySQL学习笔记--常用存储引擎InnoDB与MyISAM总结
- CTF.show:新春红包题wp
- hive集群tez引擎执行任务卡住
- 三天刷完《剑指OFFER编程题》--Java版本实现(第三天)
- 扫雷游戏 P2670 [NOIP2015 普及组]
- jspseverlet学习笔记
热门文章
- python commands.getoutput_Python3中用什么替换commands模块的getstatusoutput()
- linux readdir对结果排序,Perl readdir按顺序排列
- autocad2008许可证错误无法激活的解决办法
- 解题报告 之 POJ3281 Dining
- Labview 前面板放置照片
- Mysql 学习(一)
- fastclick安装使用
- Mysql出现问题:ERROR 1116 (HY000 (ER_TOO_MANY_TABLES)): Too many tables; MySQL can only use %d tabl解决方案
- Vega Prime 虚拟现实开发技术
- adb操作系统开关命令