socket.io可以点对点么?求思路
发布于 12 年前 作者 chinawomen 15937 次浏览 最后一次编辑是 8 年前
24 回复

你是指2端都是client?

间接的靠服务器转发的方式应该可以吧,直接的肯定不行

不知道有没有别的现成模块可以用, 不然只能从 socket.join('room') 做文章了

用服务端做转发就行了,比如a、b这样通信: 创建socketMap对象用来记录对应socket,当客户端a、b连接时:

socketMap['a'] = socketA;
socketMap['b'] = socketB;

客户端a发消息给b:

socketMap['b'].emit(...);

这个方法想过。但是当用户数量多的时候不知道这种方式可行不。

@chinawomen 怎么不可行呢,难道怕超出对象属性个数范围?可以在用户断开的时候:delete socketMap[‘a’];

@italkboy 如果用这个方法的话你给特定对象推送消息的时候。其实是广播到所有的在线用户只不过是其他用户没有监听而已。还有就是一对多的时候怎么动态区监听

@chinawomen @italkboy 给出的代码是服务器给特定客户端发送消息的,其他的客户端不会收到

socket.io也需要运行在浏览器中,怎么可能p2p?

貌似html5将来真的可以做到peer to peer

参见问题: http://stackoverflow.com/questions/1032006/will-html5-allow-web-apps-to-make-peer-to-peer-http-connections

但我不知道进一步的细节。

@italkboy 的方法可行,现在基本就是这么干的~

P2P必须UDP。不是socket.io的责任。

囧了。。。这还不如给两个人单独开个房间呢。

socket.join('room_ab');
io.sockets.in('room_ab').emit('msg', 'hello')

看到个模块 chat.io , 基本上把 socket.io 封装了一遍, 加了发送到指定用户的方法 https://github.com/DanielBaulig/chat.io https://github.com/DanielBaulig/chat.io/blob/master/package.json

这个chat.io 封装了socket.io的一些方法特别是对指定用户的封装对P2P的聊天实现比较方便

  • socket.io不能点对点
  • 消息都已服务器为中心转发
  • 在服务端保存一个用户的所有client列表,如{userId1:[client1,client2],userId2:[client1,client2]}
  • 客户端发送时指明目的用户(如以userId标识,权限、安全之类的另作验证即可)
  • 服务器查找目的用户所有client,emit出去即可
回到顶部