前期准备

  • 创建工程和场景
  • 把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游戏(六)客户端接收发送消息以及连接测试相关推荐

  1. 服务端向客户端主动发送消息

    通常情况下,无论是web浏览器还是移动app,我们与服务器之间的交互都是主动的,客户端向服务器端发出请求,然后服务器端返回数据给客户端,客户端浏览器再将信息呈现,客户端与服务端对应的模式是: 客户端请 ...

  2. Zjh游戏(二)网络消息类NetMessage的处理

    NetMessage的创建 作用:每次发送消息,都发送这个类,接收到消息后,转换成这个类 自己理解:加上模块号,保证收发消息的准确性,方便接收处理,在脚本中有两个操作码,操作码对应游戏中某个模块,子操 ...

  3. html模拟微信发送消息,关于微信公众平台模拟接收发送消息(无源码)

    由于主要的部分都在模拟登录的时候讲掉了,我就快速而又简单的将接收消息和发送文字消息. 我们登录之后,进入实时消息页面,按一下F12打开"开发人员工具",点击网络标签,点击开始捕获, ...

  4. LIVE555中RTSP客户端接收媒体流分析及测试代码

    LIVE555中testProgs目录下的testRTSPClient.cpp代码用于测试接收RTSP URL指定的媒体流,向服务器端发送的命令包括:DESCRIBE.SETUP.PLAY.TERAD ...

  5. Nerry实现服务器端指定客户端发送消息。

    目录 pom依赖 Server端 main方法初始化netty 服务端端主动给客户端发送消息 pom依赖 <dependency><groupId>io.netty</g ...

  6. Socket服务端向指定客户端发送消息

    Socket服务端向指定客户端发送消息 解决思想 1.项目背景 2.如何上传与下发指令 3.解决方法 4.流程 解决思想 I.指定客户端远程地址是存起来的. II.服务端直接主动发信息给客户端,问题在 ...

  7. Redis源码解析:21sentinel(二)定期发送消息、检测主观下线

    六:定时发送消息 哨兵每隔一段时间,会向其所监控的所有实例发送一些命令,用于获取这些实例的状态.这些命令包括:"PING"."INFO"和"PUBLI ...

  8. SpringBoot 集成 webSocket,实现后台向客户端推送消息

    图文等内容参考链接 SpringBoot2.0集成WebSocket,实现后台向前端推送信息_Moshow郑锴的博客-CSDN博客_springboot websocket WebSocket 简介 ...

  9. 670-聊天服务器和客户端如何保证消息的可靠传输

    如何保证消息的可靠传输? 意思是:客户端把消息发送出去了,只要客户端这里显示他的消息发送成功,就要保证对端一定要收到,要么收不到,客户端就显示发送失败,用户后续选择重新发送消息.如果客户端显示消息发送 ...

最新文章

  1. mysql+PHP源码编译安装
  2. linux下svn客户端安装及环境配置
  3. 基于单片机的贪吃蛇游戏设计_前端入门,基于html,css,javascript的贪吃蛇游戏
  4. Java虚拟机详解03----常用JVM配置参数
  5. springboot-springmvc请求参数获取与原理【长文预警,收藏慢啃】
  6. MVC中提示错误:从客户端中检测到有潜在危险的 Request.Form 值的详细解决方法...
  7. 【Linux网络】Linux Socket编程 TCP协议
  8. ng serve出错,关于TypeScript的版本问题
  9. 【渝粤题库】广东开放大学 标准的研制与编制 形成性考核
  10. 从厕所排队引发的产品设计方案思考
  11. 搜集的几个超高难度的数独题
  12. Android MVP架构搭建
  13. 信息系统项目管理师必背核心考点(四十三)预期货币价值(EMV)
  14. 路由器购买指南,和网络不稳定、断网说拜拜
  15. MySQL学习笔记--常用存储引擎InnoDB与MyISAM总结
  16. CTF.show:新春红包题wp
  17. hive集群tez引擎执行任务卡住
  18. 三天刷完《剑指OFFER编程题》--Java版本实现(第三天)
  19. 扫雷游戏 P2670 [NOIP2015 普及组]
  20. jspseverlet学习笔记

热门文章

  1. python commands.getoutput_Python3中用什么替换commands模块的getstatusoutput()
  2. linux readdir对结果排序,Perl readdir按顺序排列
  3. autocad2008许可证错误无法激活的解决办法
  4. 解题报告 之 POJ3281 Dining
  5. Labview 前面板放置照片
  6. Mysql 学习(一)
  7. fastclick安装使用
  8. Mysql出现问题:ERROR 1116 (HY000 (ER_TOO_MANY_TABLES)): Too many tables; MySQL can only use %d tabl解决方案
  9. Vega Prime 虚拟现实开发技术
  10. adb操作系统开关命令