关于客户端服务器双向通信问题

back1999 2018-03-22 07:40:28
小弟刚转做后台,现在有个问题想请教下各位大神!

客户端与服务器之间正常双向他通信,假如就是基于socket的tcp,,如果我们的模式是:客户端在每一次send之后如果都需要获取服务器的响应,另外客户端也可以接收服务器的主动推送消息。

这样的情况,大家一般是怎么处理的?是在消息头上封装一个标识,这个标识是针对每一次请求的响应吗?需要创建单独的socket,来接收主动推送呢?
...全文
789 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhgwbzhd 2018-04-18
  • 打赏
  • 举报
回复
TCP协议吧,可考虑使用Indy控件。 当然如果采用UDP也可以,就是自己多处理一点,发现发出消息,没有应答,那就再发消息即可,直到有应答。
ooolinux 2018-04-17
  • 打赏
  • 举报
回复
如果收到一个先导字符串,接下来马上接收数据的话,对方发送先导字符串时可以把要发送数据的长度信息编码进去。 这里有一个问题,就是在一个发送、接收流程未处理完的时候,客户端有新的操作请求,简单一点处理这个请求命令字符串可以放在队列里延迟发送,直到一个流程结束才发送。 我考虑的这个比较简单,实用的应该比较复杂,其实可以参考一下木马的源代码,了解一下它的流程处理。
ooolinux 2018-04-17
  • 打赏
  • 举报
回复
比如服务器响应的消息,是发送一个字符串“serverResponse”,主动推送的消息,是发送一个字符串“serverPush”。 客户端用一个线程同样接收处理就是了,比如收到“serverResponse”,发送“readyForServerResponse”,服务器收到就发送具体的数据,客户端接收数据。 客户端收到“serverPush”也是类似,反正就是一来一去发送接收,都是用自定义的一个字符串作为先导。 个人觉得比较麻烦的是,假如连接中断、恢复连接的时候,怎样从中断的流程恢复。或者重新连接的时候,从头开始一个流程,像第一次连接时一样。
back1999 2018-04-17
  • 打赏
  • 举报
回复
引用 5 楼 BCBPLC 的回复:
要定义好服客间的对话协议格式。
这个行吗? 我客户端既要接收主推的消息,也要接收请求响应的消息。 那么接收主推肯定是要单独的线程或者异步来做,接收请求响应的消息要用同步来做,如果不开多个socket的话,怎么实现多线程来同时操作同一个socket的数据呢。。。 比方说我们定义了协议格式,主推线程判断不是主推的,但是这时候接收请求响应线程已经没有办法recv到这个数据了啊
BCBPLC 2018-04-12
  • 打赏
  • 举报
回复
要定义好服客间的对话协议格式。
  • 打赏
  • 举报
回复
这个只是比较方便命令/响应类型的应用,用一般TCP Client/Server也一样做。
back1999 2018-03-25
  • 打赏
  • 举报
回复
引用 2 楼 DelphiGuy 的回复:
考虑使用TIdCmdTCPServer、TIdCmdTCPClient
基于什么原因呢?
  • 打赏
  • 举报
回复
考虑使用TIdCmdTCPServer、TIdCmdTCPClient
back1999 2018-03-22
  • 打赏
  • 举报
回复
UPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUP
WebSocket客户端和服务端实例源码 WebSocket ws实例 HTML5 用java实现的服务端 Websocket与服务器的正常通信 众所周知,Web 应用的交互过程通常是客户端通过浏览器发出一个请求,服务器端接收请求后进行处理并返回结果给客户端客户端浏览器将信息呈现,这种机制对于信息变化不是特别频繁的应用尚可,但对于实时要求高、海量并发的应用来说显得捉襟见肘,尤其在当前业界移动互联网蓬勃发展的趋势下,高并发与用户实时响应是 Web 应用经常面临的问题,比如金融证券的实时信息,Web 导航应用中的地理位置获取,社交网络的实时消息推送等。 传统的请求-响应模式的 Web 开发在处理此类业务场景时,通常采用实时通讯方案,常见的是: 轮询,原理简单易懂,就是客户端通过一定的时间间隔以频繁请求的方式向服务器发送请求,来保持客户端服务器端的数据同步。问题很明显,当客户端以固定频率向服务器端发送请求时,服务器端的数据可能并没有更新,带来很多无谓请求,浪费带宽,效率低下。 基于 Flash,AdobeFlash 通过自己的 Socket 实现完成数据交换,再利用 Flash 暴露出相应的接口为 JavaScript 调用,从而达到实时传输目的。此方式比轮询要高效,且因为 Flash 安装率高,应用场景比较广泛,但在移动互联网终端上 Flash 的支持并不好。IOS 系统中没有 Flash 的存在,在 Android 中虽然有 Flash 的支持,但实际的使用效果差强人意,且对移动设备的硬件配置要求较高。2012 年 Adobe 官方宣布不再支持 Android4.1+系统,宣告了 Flash 在移动终端上的死亡。 从上文可以看出,传统 Web 模式在处理高并发及实时性需求的时候,会遇到难以逾越的瓶颈,我们需要一种高效节能的双向通信机制来保证数据的实时传输。在此背景下,基于 HTML5 规范的、有 Web TCP 之称的 WebSocket 应运而生。 早期 HTML5 并没有形成业界统一的规范,各个浏览器和应用服务器厂商有着各异的类似实现,如 IBM 的 MQTT,Comet 开源框架等,直到 2014 年,HTML5 在 IBM、微软、Google 等巨头的推动和协作下终于尘埃落地,正式从草案落实为实际标准规范,各个应用服务器及浏览器厂商逐步开始统一,在 JavaEE7 中也实现了 WebSocket 协议,从而无论是客户端还是服务端的 WebSocket 都已完备,读者可以查阅HTML5 规范,熟悉新的 HTML 协议规范及 WebSocket 支持。
1、本课程是一个干货课程,主要讲解如何封装服务器底层,使用Tcp/ip长连接,IDE使用vs2019 c++开发以及使用c++11的一些标准,跨平台windows和linux,服务器性能高效,单服务器压力测试上万无压力,服务器框架是经历过上线产品的验证,框架简单明了,不熟悉底层封装的人,半个小时就能完全掌握服务器框架上手写业务逻辑。2、本课程是一个底层服务器框架教程,主要是教会学员在windows或linux下如何封装一个高效的,避免踩坑的商业级框架,服务器底层使用初始化即开辟内存的技术,使用内存池,服务器运行期间内存不会溢出,非常稳定,同时服务器使用自定义哈希hashContainer,在处理新的连接,新的数据,新的封包,以及解包,发包,粘包的过程,哈希容器性能非常高效,增、删、查、改永远不会随着连接人数的上升而降低性能,增、删、查、改的复杂度永远都是恒定的O(1)。3、服务器底层封装没有使用任何第三方网络库以及任何第三方插件,自由度非常的高,出了任何BUG,你都有办法去修改,查找问题也非常方便,在windows下使用iocp,linux下使用epoll.4、讲解c++纯客户端,主要用于服务器之间通信,也就是说你想搭建多层结构的服务器服务器服务器之间使用socket通信。还可以使用c++客户端做压力测试,开辟多线程连接服务器,教程提供了压力测试,学员可以自己做压力测试服务器性能。5、赠送ue4和unity3d通信底层框架以及多人交互demo,登录,注册,玩家离开,同步主要是教会学员服务器客户端如何交互。6、赠送c++连接mysql数据库框架demo,登录,注册,玩家离开数据持久化.7、服务器教程使用自定义通信协议,同时也支持protobuf,选择权在开发者自己手里,想用什么协议都可以,自由度高。8、服务器教程使用手动敲代码逐句讲解的方式开展教学课程。非喜勿喷,谢谢大家。9、服务器教程提供源码,大家可以在平台提供的地址下载或者联系我,服务器使用c++11部分标准,std::thread,条件变量,线程锁,智能指针等,需要学员具备一定c++知识,购买前请慎重考虑。

1,316

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧