最近帮助本科“虚拟校园”项目小组做了网络组件的开发,历时三天,在回顾旧知识的同时遇到了一些新的问题。

最开始考虑调用第三方API实现网络功能,在网上找到了两个网络组件库POCO、RakNet,这两个库都是做网络游戏开发时常用的且都开放源码,前者完全免费,后者则有两种版权,如果做免费游戏则RakNet免费,若有商业行为需要付费。二者的差别没有具体考量,优劣也就无从比较。与HE师兄沟通之后,他推荐我使用中间件技术,并给我描述了“服务器发布、客户端注册”基本机制,根据经验他推断POCO应该也有类似的机制。于是打算使用POCO,在网上查找了一系列POCO资料(主要是官网提供的源码和API文档),源码包中的例子都是偏向具体应用的,比如文件下载等,与自己的设计目标差距较大。之前没有使用过类似的网络库,感觉有点无从下手,而项目小组的时间也比较紧了。无奈之余,抛开第三方库,从设计目标对网络组件进行了重新构思:

客户注册、运动信息传输、聊天内容传输,服务器端主要进行数据包转发,客户端则负责对消息进行解析,即“瘦服务器,胖客户端”。

网络组件连接图

这个目标不难,使用最基本的SOCKET编程也可以实现,并且也不会太复杂。时间有限,容不得太多考虑,直接着手设计。

手头已有的基于TCP通信框架是这样:服务器端侦听客户连接,为每个新连接创建一个线程与客户通信;客户端主线程进行连接初始化之后循环等待,消息接收线程负责通信。这里面只涉及最基本的字符串转发的处理。

需要完成的工作有:

A.客户端注册。每个客户端有唯一的身份标识和唯一的姓名。在连接到服务器之后,需要进行一个注册的过程,即服务器为客户端分配标识符,同时与客户端协商命名。

B.消息分类。至少需要四种不同的消息:

B.1 用户信息,用于通知在线客户状态。

B.2 运动信息,用于同步在线人物活动状态。

B.3 私聊信息,玩家指定聊天对象发送消息。

B.4 群聊消息。即玩家向所有在线客户发送的消息。

C.服务器端分类转发。服务器主要根据消息类型做转发操作,主要有广播和定点传输之分。

D.客户端消息解析。客户端根据消息类型进行不同处理。比如:接收到用户信息,则添加或调整当前在线人数列表。接收到运动消息,则将对应的客户定位到对应坐标,并调整其运动状态。私聊和群聊信息则直接显示在本地对话框中用于提示用户。

消息类型

消息内容

消息说明

ECHOMSG

用户信息(56Bytes)

用户注册,命名协商

USERMSG

用户信息(56Bytes)

通知在线客户

MOVEMSG

运动信息(60Bytes)

同步运动状态

MCHATMSG

聊天信息(1028Bytes)

群聊信息

SCHATMSG

聊天信息(1032Bytes)

私聊信息

消息格式

已解决的问题:

1. 消息格式定义。解决办法:在缓存第一个字节设置消息类型,从第二个字节开始传输具体消息内容。客户端在接收消息的时候首先根据数据(通常是字符串数组)第一个字节判断消息类型,再根据消息类型作不同处理。

2. 客户端在线客户不稳定。在新客户接入服务器的时候,服务器会将当前所有在线客户信息列表发送给它,但这个是不稳定的(很奇怪,TCP不是面向连接的通信么?),客户端收到的信息总会出现遗漏的情况。解决的办法是:服务器端主线程不断广播(程序中设置的是一秒钟广播一次)当前在线客户信息列表,客户端通过不断对比来确定其它在线客户。

3. 多线程字符串交叉显示。多线程程序中如果两个线程同时有输出操作,那么常常会出现这样的情况。线程1输出字符是ABC;线程2输出字符是abc;屏幕显示的结果很可能会是:ABaCbc。不完全解决方案是,在字符串输出前让线程睡眠一段时间Sleep(10),这样错开显示的时间,但并没从根本上解决问题。

不太明确的问题:

1. 在网络不稳定的情况下,如何保证客户端连接到服务器,并维持较为稳定的通信?

虚拟校园网络组件开发笔记相关推荐

  1. java网络爬虫开发笔记

    步骤: 0. 从一个/多个起始页面开始 1. 检查网页是否已经被爬过(mysql + connector-j) 2. 拉取网页内容(jsoup) 3. 解析网页,寻找其中的<a>标签(js ...

  2. RK3568开发笔记(四):在虚拟机上使用SDK编译制作uboot、kernel和buildroot镜像

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/125844240 红胖子网络科技博文大全:开发技术集合( ...

  3. 【Visual C++】游戏开发笔记二十六 DirectX 11各组件的介绍 第一个DirectX 11 Demo的创建

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...

  4. 【Visual C++】游戏开发笔记二十六 DirectX 11各组件的介绍第一个DirectX 11 Demo的创建

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7688515 作者:毛星云    邮箱: h ...

  5. Linux高并发服务器开发---笔记4(网络编程)

    0705 第4章 项目制作与技能提升 4.0 视频课链接 4.1 项目介绍与环境搭建 4.2 Linux系统编程1.4.3 Linux系统编程2 4.4 多进程 1-9 10.进程间通信☆☆☆ 4.5 ...

  6. 【Visual C++】游戏开发笔记二十六 DirectX 11各组件的介绍第一个DirectX 11 Demo的创建...

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7688515 作者:毛星云 邮箱: happ ...

  7. RT-ThreadBearPi 开发笔记 -- 小熊派基于RT-Thread使用ESP8266进行网络连接

    小熊派基于RT-Thread使用ESP8266进行网络连接 物联网的概念和应用场景,最关键最必不可少的一个环节,就是联网.可以说,如果没有可靠的网络连接功能,那这个设备还不算是一个合格的物联网设备. ...

  8. RK3568开发笔记(五):在虚拟机上使用SDK编译制作uboot、kernel和ubuntu镜像

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/127783966 红胖子网络科技博文大全:开发技术集合( ...

  9. Android开发笔记(一百一十六)网络学习资源

    知名网站 本系列的开发笔记,对Android开发来说只是沧海一瓢,还有更多的技术等待我们去汲取.下面列出几个常用的开发网站,供初学者上路: 首先当然是国内首屈一指的技术网站csdn啦,csdn提供了众 ...

最新文章

  1. 我爱自然语言处理bert ner chinese
  2. SQL Server2008及以上 表分区操作详解
  3. ETC核心技术团队CTO空降上海,引领高校区块链技术风潮
  4. ASP.NET MVC应用程序展示RDLC报表
  5. 每日程序C语言34-利用指针将输入的三个数排序
  6. 51nod 2020 排序相减(暴力解法)
  7. 网址由http转换成https
  8. [Kali][VMware][2020][窗口大小][分辨率]高分辨率自适应
  9. 冰豹lua驱动设置_卡宴?卡宴!——冰豹ROCCAT Kain 120 AIMO开箱
  10. C程序范例(2)——学生管理系统”链表“实现
  11. centos7系统引导自动重启_分享一个实用的脚本——全自动一键批量性安装Linux系统...
  12. PCL之ubuntu安装CloudCompare
  13. python学习手册笔记——29.运算符重载
  14. 十次方——父工程子模块、公共模块
  15. [ZT]Grub4dos for WinPE 启动菜单
  16. win10共享打印机搜索不到计算机,大师告诉您Win10搜不到共享打印机的操作方案...
  17. 计算机RAM ,ROM,NOR FLASH ,NAND FLASH和手机RAM,ROM大家庭血缘关系图
  18. 微信小程序如何快速增长独立访客数(UV)
  19. UVa 220 黑白棋 算法竞赛入门经典 习题4-3
  20. 浅谈可带病投保的“税优险”

热门文章

  1. 输入一个整数x,判断其能否被3整除也被7整除。
  2. 用Python计算两图像的峰值信噪比PSNR
  3. Pytorch线性模型初体验
  4. houdini之blast
  5. 机电一体化PLC毕业设计、课程设计案例分享/液压、电梯、洗衣机、送料控制、步进电动机、装瓶流水线、大小球分拣传送、饮料罐装、自动售货机、立体车库、洗衣机、喷泉、机械手、卧式镗床、温度控制、供水系统……
  6. 报表动态配置的技术实现
  7. c语言题库选择填空题,C语言题库(填空题部分)
  8. Cesium 个性地图的创建(炫酷大屏)
  9. IFIX组态-----全局阈值表应用
  10. veloview读二维雷达数据_【SLAM】之Velodyne VLP16 激光雷达使用