私はこれを数日間試してきましたが、これについて頭を包むことができないようです. 私の問題は本質的に、2 つのブラウザーが同時に要求している場合、サーバー側の socketio 応答が間違った結果を要求しているブラウザーに返す (結果が入れ替わる) という事実にあります。私の問題は、socket.io がどのブラウザーに結果を返すかを決定する方法がわからないことだと思います。現在のコードには多くの可動部分があり、人々が意味を理解できるように削除するのは面倒なので、代わりに、誰かが私を助けて django_chat の例を理解するのを手伝ってくれれば、バグを解決できると思いますhttps://github.com/abourget/gevent-socketio/tree/master/examples/django_chat . だからここに行きます:
順番に、ユーザーがチャットに何かを入力すると、このコードが起動します
$('#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
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
emit_to_room
次に、RoomsMixin クラスにあるこの関数を呼び出します。
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 コードとどこで一致しますか? エミット関数は、応答をどの部屋に送信するかをどのように知るのでしょうか?