繁体   English   中英

Flask socketio多个连接

[英]Flask socketio multiple connections

我正在尝试创建类似FB聊天的应用程序。 我已经从最基本的flask socketio实现入手。 到目前为止,我已经了解到客户端和服务器端通过通用处理程序进行通信。 我当前的实现是所有聊天都是免费的。 为简便起见,我只向处理程序显示:

客户端:

 socket.on('message', function(msg) {
  $("#messages").append('<li>'+msg+'</li>');
  console.log('Received message');
 });

服务器端:

@socketio.on('message')
def handleMessage(msg):
 print('Message: ' + msg)
 send(msg, broadcast=True)

题:

如何传递参数,以便可以使用不同的聊天ID

我想您想要做的是一些聊天室。 好消息! Flask-SocketIO现在正在本地处理房间。 您可以像这样导入模块:

from flask_socketio import SocketIO, emit, join_room, leave_room,
close_room, rooms, disconnect

要加入一个房间,它看起来像这样:

@socketio.on('join', namespace='/test')
def join(message):
    join_room(message['room'])
    session['receive_count'] = session.get('receive_count', 0) + 1
    emit('my_response',
         {'data': 'In rooms: ' + ', '.join(rooms()),
'count': session['receive_count']})

您可以在Miguel的Github页面中找到完整的代码示例:)

您好,抱歉以前的回答。 您可以从sid获取cookie。 如果您将聊天ID保存到Cookie中。 您可以轻松识别用户ID。 这是我的命名空间代码。

import socketio
import imp
import json
from datetime import datetime, timedelta
gameDBModule = imp.load_compiled("ChatDatabase", "./game_chat/chat_database.pyc")
apiModule = imp.load_compiled("TotoAPI", "./game_api/__init__.pyc")

class GameChat(socketio.Namespace):

    def init(self):
        self.lastDataIndex = 0
        self.api = apiModule.TotoAPI()

    def on_join(self, sid, message):
        self.db = gameDBModule.ChatDatabase()
        sessid = self.getUserId(sid)
        try:
            info = json.loads(self.api.userinfo(sessid))
            userID = str(info[4])
        except Exception as e:
            userID = None

        self.emit('join', {'history': self.db.get_chathistory(), 'channel': message, 'moderator': False, 'user_id': userID}, room=sid)


    def on_connect(self, sid, environ):
        self.emit('connect', {'data': 'Connected', 'count': 0}, room=sid)
        print('GameChat Connected')

    def on_say(self, sid, message, environ):
        sessid =self.getUserId(sid)
        try:
            info = json.loads(self.api.userinfo(sessid))
            userID = str(info[4])
        except Exception as e:
            userID = None

        if userID !=None:
            userID = None
            #Save into History
            now = self.get_current_time(9)
            self.lastDataIndex = self.lastDataIndex + 1
            item = {
                'dataIndex': self.lastDataIndex,
                'bot': False,
                'date': now,
                'message': message,
                'role': 'user',
                'type': 'say',
                'user_id': userID
            }
            self.emit('msg', item)
            item['date'] = self.get_current_time(0)
            self.db.insert_chatting(item)



    def on_disconnect(self, sid):
        print('GameChat disconnected')

    def getUserId(self, sid):
        try:
            #Get UserID from Cookies
            cookies = str(self.server.environ[sid]['HTTP_COOKIE']).split(';')
            id = None
            for item in (cookies):
                name=str(item).split('=')[0].strip()
                value=str(item).split('=')[1].strip()
                if name.__eq__('ci_session'):
                    id = value
            return id
        except Exception as e:
            return None


    def get_current_time(self, diff):
        i = datetime.now() - timedelta(hours = diff)
        return i.isoformat()[:-3]+"Z"

this is the code using above name space

async_mode = 'eventlet'

import eventlet
import eventlet.wsgi
from flask import Flask, render_template, Response, request, make_response
import socketio
import imp

gameChatModule = imp.load_compiled("GameChat", "./game_chat/__init__.pyc")
apiModule = imp.load_compiled("TotoAPI", "./game_api/__init__.pyc")

sio = socketio.Server(logger=False, async_mode=async_mode)
app = Flask(__name__)
app.wsgi_app = socketio.Middleware(sio, app.wsgi_app)
app.config['SECRET_KEY'] = 'secret!'
api = apiModule.TotoAPI()
ns = gameChatModule.GameChat("/")
ns.init()


if __name__ == '__main__':
    sio.register_namespace(ns)
    eventlet.wsgi.server(eventlet.listen(('', 8880)), app)

我已经在python 2.7中实现了它,您似乎使用了python 3,但是您可以实现我的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM