1

私はこれを数日間試してきましたが、これについて頭を包むことができないようです. 私の問題は本質的に、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 コードとどこで一致しますか? エミット関数は、応答をどの部屋に送信するかをどのように知るのでしょうか?

4

0 に答える 0