8-聊天功能

在Python里面实现实时通讯我们有很多种方法,既然选择了flask框架,那我们也一并采用flask下的flask-sockeio库吧。

我们需要用到socketio库内的一下函数

  • send
  • emit
  • join_room
  • leave_room

在开始要做一些准备工作,改用socketio.run来运行服务器

socketio = SocketIO(app)

if __name__ == '__main__':
    # app.run(host='0.0.0.0', port=5000)
    socketio.run(app,host='0.0.0.0',port=5000)

在socketio框架中,我们使用@socketio.on('xxx')装饰器来声明接收数据的函数

连接

客户端通过ip直接连接socket服务器,默认情况下为

http://127.0.0.1:5000/

不同的客户端连接模块的代码都不一样,这里说在HTML上的情况:


    
    
    



    

接下来就是监听客户端的连接和断开

@socketio.on('connect')
def handle_connect():
    print(u'有客户端连接上服务器')
    send('server:欢迎你连接socket服务器')

@socketio.on('disconnect')
def handle_disconnect():
    print('客户端断开连接.')

namespace

上面说到,客户端要连接socket服务器默认情况下是通过http://127.0.0.1:5000/ 这个链接,使用名称空间的情况下,客户端可以通过连接如 http://127.0.0.1:5000/chat 或者 http://127.0.0.1:5000/my_room 等方式,进入不同的socket空间域,在这个域内发送的通知或消息不会影响到其他的域。

举个例子,如果我们有一个论坛,其中有A、B、C三类话题,那我们可以通过设置名称空间将他们隔离开,这样他们的消息就只会在各自的话题内传播。

send和emit

send和emit都是发送数据,不同的是他们分别用于未命名事件和已命名事件,如:

@socketio.on('message')
def handle_message(message):
     send(message, namespace='/chat')

@socketio.on('my event')
def handle_my_custom_event(json):
     emit('my response', json, namespace='/chat')

监听命名事件,可以及时收到通过该名称发送的消息,如上面代码所示,服务器监听了'my event'的事件,这样当客户端通过emit('my event','xxx')发送的消息就可以被服务器接收到

一对一聊天

由上可知,emit函数可以让我们实现一对一的聊天,实现思路为:

  • 每个人生成一段属于自己的唯一的字符串,并监听
  • 别人通过这个字符串发送emit数据

这里不考虑信息安全,只简单的实现功能

群聊

我们依旧可以使用上面一对一聊天的方式来实现群聊,让每个群都有一个独立的名称,但是socketio框架有一个函数可以更好的实现群聊功能

join_room

leave_room

@socketio.on('join')
def on_join(data):
    username = data['username']
    room = data['room']
    join_room(room)
    send(username + ' has entered the room.', room=room)

@socketio.on('leave')
def on_leave(data):
    username = data['username']
    room = data['room']
    leave_room(room)
    send(username + ' has left the room.', room=room)

send()和emit()函数接受一个可选的房间参数,使得消息被发送到给定房间中的所有客户端

要更加详细的说明,可以看这个链接

GitHub链接

你可能感兴趣的:(8-聊天功能)