5
回答
小白求教,关于JAVA socket客户端 和服务端的通信
终于搞明白,存储TCO原来是这样算的>>>   
新手刚开始接触socket,遇到些疑惑

1.如果 有多个客户端和服务端 进行连接,要怎么区分这些客户端,从而单对单 进行通信呢?
2.现在用的SSM 框架,想和 客户端 安卓IOS 进行通信,是直接使用原生socket就可以了么,很简单的通信,假如用框架的话,有哪些推荐的,容易上手的
3.客户端 和服务端通信,具体是怎样一个流程,双方事先定义好规则么?

举报
S沐大大
发帖于12个月前 5回/920阅

1、客户端连接一般是与用户绑定的,无用户数据的socket就算能区分连接也毫无意义。一般做法是客户端利用HTTP登录,登录服务器分析各个socket服务器的负载后发送给客户端应该连接哪个socket服务器,客户端拿到登录成功后的用户ID后再连接socket服务器,此用户ID就可以用于socket服务器区分客户端连接。

2、如果自建socket服务器,建议最好不用SSH、SSM之类的框架,可控性更高,更加轻量,但工作量稍显繁多,且复杂;建议使用Netty做scoket基础框架。

3、客户端服务端通信可以用json格式的文本行(字符流,以\r\n自动做粘包断包解码),还有自定义数据格式的字节流(比如 数据包内容长度+数据包内容,以数据包内容长度手动编写代码做粘包断包解码),还可以用时下流行的protobuf。

--- 共有 6 条评论 ---
BoXuan回复 @S沐大大 : 对你有帮助就行,不用客气 12个月前 回复
S沐大大回复 @BoXuan : 好吧,大概明白了,谢谢指点 12个月前 回复
BoXuan回复 @S沐大大 : 如果觉得两三秒太长,自己斟酌一下,以能达到目的且尽可能的减少服务器负载为最终要求。每个图形渲染都有帧频,一般24帧/秒,30帧/秒,游戏一般60帧/秒,客户端发送数据的频率不能大于这个帧率,就算服务器能处理过来,客户端的图形渲染也处理不过来 12个月前 回复
BoXuan回复 @S沐大大 : 你这个实时,并一定非要严格的实时,客户端可以每隔两三秒发送一次司机的位置就行了 12个月前 回复
BoXuan回复 @S沐大大 : 为什么你认为简单?用了SSM就高大上了?我做游戏后端一般从来不用那些框架。socket服务器架构的难点就是负载均衡和集群,而http的一般web容器稍微配置一下就能实现。现在很多socket应用做全球服的,最好多找找资料。数据通信我还是建议你用自定义数据包格式的,自定义的通信协议写入一个文件中,双方按照这个协议文件编码解析数据。 12个月前 回复

1.不同的客户端连接,端口是不同的,可以用来做区分.

2.如果没有长连接的需求,建议走http协议.直接使用socket需要自己控制生命周期,并且在高并发时需要做很多额外的工作. 远程调用框架有很多,thrift,ice等等.各有优势,按需选择.

3.肯定需要事先定义好规则.

--- 共有 2 条评论 ---
LarrySu回复 @S沐大大 : 每个socker连接,服务端都有唯一的端口与之连接,这一般是系统自动分配的空闲端口. 12个月前 回复
S沐大大客户端 端口不同? 12个月前 回复

1.为每个socket分配一个唯一的id,比如用户id,发送的时候通过unique id去取socket进行数据发送即可。

2.通信和ssm没什么关系,当然也不是说spring和mybatis没用,使用上的话也可以简化一定开发。我个人的话一般使用netty进行编程,api简单,内存管理完善,是不错的nio框架。

3.关于规则的话,1)前后端要商定好数据协议,解包时要考虑粘包等操作,每个数据包长度不宜过长,越短越好,二进制协议的话有很多,avro、protobuf、thrift等,这些数据的压缩率都是挺好的,也可以自己定义协议的规则,还是要强调不宜过长。2)和Android和iOS通信的话就要考虑心跳包维活,因为移动端的网络不稳定,链接容易丢失,何况移动运营商还有闲置过长信令丢失的情况,因此要对心跳包做一个调优,具体多少合适也要看你们项目而定。

一般就这么多了,我自己的话后端是用netty去开发的,前端的话用c++写好代码直接给iOS和Android,他们只需要处理后面的业务逻辑就可以了。

--- 共有 1 条评论 ---
S沐大大谢谢指点,听了你们的一番话 大概 有了一点点思路了 12个月前 回复

推荐一个socket编程的异步socket类库,https://github.com/typ0520/bizsocket,对一些业务场景做了支持
断线重连
一对一请求
通知、粘性通知
串行请求合并
包分片处理
缓存
拦截器
支持rxjava,提供类似于retrofit的支持

顶部