我已经尝试了几天,但我似乎无法绕过这个。我的问题基本上在于,如果我有2个浏览器同时请求,我的服务器端socketio响应会将错误的结果返回给错误的浏览器请求(结果被交换)。我认为我的问题是我不知道socket.io如何确定将结果返回到哪个浏览器。当前的代码有很多可移动的部分,剥离人们可以找到有意义的方式是很痛苦的,相反,我认为如果有人可以帮助我完成并理解在的django_chat示例,我将能够解决我的错误。 https://github.com/abourget/gevent-socketio/tree/master/examples/django_chat。所以这里:
顺便说一句,当用户在聊天中输入内容时,此code会触发
$('#send-message').submit(function () {
message('me', $('#message').val());
socket.emit('user message', $('#message').val());
clear();
$('#lines').get(0).scrollTop = 10000000;
return false;
});
socket.emit
函数会在ChatNameSpace
类中触发this function:
def on_user_message(self, msg):
self.log('User message: {0}'.format(msg))
self.emit_to_room(self.room, 'msg_to_room',
self.socket.session['nickname'], msg)
return True
反过来调用RoomsMixin类中的emit_to_room
函数
def emit_to_room(self, room, event, *args):
"""This is sent to all in the room (in this particular Namespace)"""
pkt = dict(type="event",
name=event,
args=args,
endpoint=self.ns_name)
room_name = self._get_room_name(room)
for sessid, socket in self.socket.server.sockets.iteritems():
if 'rooms' not in socket.session:
continue
if room_name in socket.session['rooms'] and self.socket != socket:
socket.send_packet(pkt)
据我所知,当用户加入聊天室时,[rooms]
会话会根据他所属的聊天室进行更新。它看起来像['/chat_1', '/chat_2']
,其中数字表示房间对象的主键。
这是我迷路的地方。特定聊天室的这种区别在哪里符合前端js代码? emit函数如何知道将响应发送到哪个房间?