求解:关于客户端--服务端--客户端的点到点websocket通信问题.

mrZhan_223 发布于 2014/07/23 17:30
阅读 3K+
收藏 1

现在有这样的需求:客户端a通过服务器s与客户端b进行websocket通信,为了方便描述,假定客户端a位于服务器的左侧,客户端b位于服务端的右侧,但在实际环境下,服务端左侧与右侧的客户端都有可能有多个,现在服务端左侧的客户端都有一个唯一的编号,在每次连接上服务端的时候,它会把自己的编号传给服务端,而服务端右侧的客户端没有编号,当服务端右侧的某个客户端执行命令chang 123后,(123表示服务端左侧某个客户端的编号),那么执行此命令的客户端发出的消息通过服务端只让编号为123的客户端接收,其返回的结果也只能发给当前与他通信的那个客户端。同时,如果此时有另外一个客户端执行chang 124命令,那么它不能影响执行chang 123那个客户端的通信,也就是说,服务端右侧的客户端执行chang 123,那么它就只和客户端左侧编号为123的客户端进行点到点的通信。

问题:像这种通过服务端点到点的通信如何实现客户端a发出的消息只能让客户端b收到,客户端a返回的消息只能让客户端b收到,且客户端a与客户端b的通信、客户端c与客户端d的通信互不干扰?这个情景有点类似qq聊天,只是没有用户id那些唯一标识。

问题在描述一下:当客户端a通过服务端和其他客户端进行websocket通信的时候,客户端a可以进行通信切换,可以自由的与任何一个客户端进行通信而不干扰别的客户端之间的通信问题。


加载中
0
Xsank
Xsank
真正意义上没有”ID“区分是不可能做到通信区分的,只是看ID你怎么定义了
0
m
mrZhan_223

引用来自“Xsank”的评论

真正意义上没有”ID“区分是不可能做到通信区分的,只是看ID你怎么定义了

哦,这个id是服务端左侧的客户端也就是设备的id号,这个ID号是唯一的,在发起websocket连接时,会把此id号发送给服务端。

另外,websocket通信,每个客户端每次与服务端建立的连接对象应该是唯一的,不太可能出现两个完全一样的连接对象。

现在的问题是如何让服务端左侧的某个客户端能够与服务端右侧的某个客户端进行点到点通信?

0
m
mrZhan_223

唯一的解决方案是不是每次建立连接后在服务端分别给服务端左侧的客户端和服务端右侧的客户端建立一个连接对象列表,即服务端维护2个连接对象列表,每次要与某个客户端进行点到点通信的时候,分别到这2个连接列表中找出要与要与当前发送消息的连接对象进行消息通信?

这样能行吗?

0
pantrick
pantrick
看了你写这一大堆,觉得乱糟糟,我做过,思路很简单,每个客户登陆服务器,提交唯一登陆id,服务端存储其id和客户端实例,两个客户之间的聊天内容用client发送就行了,这样不会出现你所谓那些问题!
0
m
mrZhan_223

引用来自“抓瓦工人”的评论

看了你写这一大堆,觉得乱糟糟,我做过,思路很简单,每个客户登陆服务器,提交唯一登陆id,服务端存储其id和客户端实例,两个客户之间的聊天内容用client发送就行了,这样不会出现你所谓那些问题!
谢谢你的答复!问题是进行websocket通信的时候,当连接到服务端后,哪有id啊?我上面所说的id是设备的id,而且另外一端的客户端是没有id的,这样的情况怎么解决?请指教!
0
newzai
newzai

ID不应该由客户端自己分配,而是与服务器建立的连接的时候,由服务器分配一个ID,这个所有连接上同一个服务器的客户端都有ID,而且由服务器保证不会冲突,而且一台机器可以模拟好多个客户端;

websocket和普通的socket在这里没有任何区别;

任何一个客户端发送消息的时候,如果要发送给另外 一个客户端,就在自定义协议上携带上对方的ID,由服务器根据ID进行转发即可

如果要考虑到消息缓存,比如对方没上线等,那么ID必须在服务器中保存到数据库,此时的ID类似于用户名,号码之类的唯一预先分配的,并且用户要使用这个ID进行登录。

0
m
mrZhan_223

引用来自“newzai”的评论

ID不应该由客户端自己分配,而是与服务器建立的连接的时候,由服务器分配一个ID,这个所有连接上同一个服务器的客户端都有ID,而且由服务器保证不会冲突,而且一台机器可以模拟好多个客户端;

websocket和普通的socket在这里没有任何区别;

任何一个客户端发送消息的时候,如果要发送给另外 一个客户端,就在自定义协议上携带上对方的ID,由服务器根据ID进行转发即可

如果要考虑到消息缓存,比如对方没上线等,那么ID必须在服务器中保存到数据库,此时的ID类似于用户名,号码之类的唯一预先分配的,并且用户要使用这个ID进行登录。

按照你的意思是客户端一旦连接上服务端,就生成一个不重复的id,并让该id与当前连接对象映射关联,是吗?具体如何维护这个id,才能保证每次连接上后生成的id唯一?
0
Cobbage
Cobbage

不懂乱扯点。

左侧肯定首先要主动连接服务器 左侧机器和你的ID对应关系建立 右端怎么知道

1.如果你是客户端自己ID划分好的,右侧连接请求就很明确,固定,呆板,大家都知道

2.如果你是服务器划分怎么识别你设置的ID和这个左端作用对应的关系,

这个感觉你的命名规则,左端连接的时候给服务器说一些信息 例如我的作用,服务器给他分配一个id,

                                  右端想发命令的时候先去服务器问一遍,服务器返回一列,然后再发

不重复ID,主键的唯一性的意思,自己分配 不存在问题 固定的

                                          动态分配 uuid了或者你这是通信的ip+端+其他 肯定也是唯一的

0
m
mrZhan_223
现在的场景就是客户端通过服务端与别的客户端通信,那么在服务端要维护2个连接列表,一个存放左侧客户端的连接列表,一个存放右侧客户端的连接列表,并且这两个连接列表必须要能通过一个唯一的id将要进行通信的两个客户端关联起来,否则还能怎么做?
返回顶部
顶部