小白求教,关于JAVA socket客户端 和服务端的通信

S沐大大 发布于 2016/10/31 09:15
阅读 1K+
收藏 0
新手刚开始接触socket,遇到些疑惑

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

加载中
0
银杏果果
银杏果果

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

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

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

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

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

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

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

LarrySu
LarrySu
回复 @S沐大大 : 每个socker连接,服务端都有唯一的端口与之连接,这一般是系统自动分配的空闲端口.
S沐大大
S沐大大
客户端 端口不同?
0
幕后高手
幕后高手

区分客户端根据webSocket的 session对象的Id区别

参考:https://my.oschina.net/master233/blog/776088

幕后高手
幕后高手
回复:@S沐大大 可以的
S沐大大
S沐大大
webSocket能用来 服务器和安卓之间进行通信嘛
0
这里的名字只能十个字
这里的名字只能十个字

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,他们只需要处理后面的业务逻辑就可以了。

S沐大大
S沐大大
谢谢指点,听了你们的一番话 大概 有了一点点思路了
0
大鹏2022
大鹏2022

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

返回顶部
顶部