Demo是前后端分离的,后端采用的是Python Flask,前端是HTML。此demo主要是连接后存储用户信息、浏览器ID,消息接口通过浏览器ID作为依据往用户浏览器推送消息

后端代码

"""
Author:zengzhan.SI
Date:July 1, 2020
"""
from flask import Flask, request
from flask_cors import CORS
from flask_socketio import SocketIO, emit, join_room
import json
from datetime import datetime


app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'

# cors_allowed_origins="*" Solve cross-domain problems
socketio = SocketIO(app, cors_allowed_origins="*")


# Store user information
user_dict = dict()


def result_json(data=None, status=None, version="v1", total=None):
    result_dict = {
        "data": data,
        "status": status,
        "version": version,
        "total": total if total else 0
    }
    return result_dict


def get_user_name(key):
    """
    Get user information
    :param key: User Name
    :return: The dictionary or None that stores user information
    """
    try:
        data = user_dict[key]
    except:
        data = None
    return data


def set_user_name(key, value):
    """
    Store user information
    :param key: User Name
    :param value: A dictionary that stores user information
    :return:
    """
    user_dict[key] = value


def ack(value):
    """
    Callback function, broadcast mode does not trigger
    :param value:
    :return:
    """
    return result_json(value)


@socketio.on("connec")
def connect_client(data):
    """
    Get users online
    This function is triggered when a user logs in
    Query whether the current user has a login history
    Updating the user's new Session ID and online state exists
    The user login record is inserted if it does not exist
    :param data: message
    :return:
    """
    user_name = data["user_name"]
    sid = request.sid
    redis_data = get_user_name(user_name)

    if redis_data is None:
        user_data = {
            "user_name": user_name,
            "online_state": 1,
            "SID": sid
        }
    else:
        user_data = json.loads(redis_data)
        sid = user_data["SID"]

        user_data["SID"] = sid
        user_data["online_state"] = 1

    # Store the user's online status
    user_data = json.dumps(user_data)
    set_user_name(user_name, user_data)

    socketio.emit("connec", user_name, broadcast=True)


@socketio.on("message")
def messgae_pro(message):
    """
    Message processing interface
    :param message: message
    :return:
    """
    send_user_name = message["send_user_name"]
    recv_user_name = message["recv_user_name"]
    room_name = message["room_name"]
    msg = message["msg"]

    # Query the sender's SID
    send_user_data = get_user_name(send_user_name)
    if send_user_data:
        send_user_data = json.loads(send_user_data)
        send_user_sid = send_user_data["SID"]

    # Query the recipient's SID
    recv_user_data = get_user_name(recv_user_name)
    # Determine if the recipient is online
    if recv_user_data:
        recv_user_data = json.loads(recv_user_data)
        online_state = recv_user_data["online_state"]
    else:
        online_state = 0

    if online_state == 0:
        message = {"msg": "The user is offline"}
        emit("message", result_json(data=message, status=500))
    else:
        recv_user_sid= recv_user_data["SID"]

        join_room(room=room_name)
        info_dict = {
            "send_user_name": send_user_name,
            "recv_user_name": recv_user_name,
            "room_name": room_name,
            "msg": msg,
            "msg_type": 0,
            "online_state": online_state,
            "date": datetime.strftime(datetime.now(), "%Y-%m-%d %H:%M:%S")
        }
        # Return the information to the client
        # Send a message to the recipient
        socketio.emit('message', result_json(data=info_dict, status=200),
                      room=recv_user_sid,
                      callback=ack
                      )
        # Send a message to the sender
        socketio.emit('message', result_json(data=info_dict, status=200),
                      room=send_user_sid,
                      callback=ack
                      )


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

前端代码

用户1

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title></title>
    <script type="text/javascript" src="https://code.jquery.com/jquery-1.4.2.min.js"></script>
    <!--    <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.5/socket.io.min.js"></script>-->
    <script src="https://cdn.bootcss.com/socket.io/2.1.1/socket.io.js"></script>
    <script type="text/javascript">
        $(document).ready(function () {
            namespace = '/message/';
            var socket = io.connect(location.protocol + '//' + "服务端IP" + ':' + "9010");
            //连接后发送日志
            socket.on('connect', function () {
                socket.emit('connec', {
                    user_name: "张三"
                });
                console.log('connected', location.protocol + '//' + "服务端IP" + ':' + "9010", '张三')
            });
            var room = "张三_李四"
            //点击发送时将text框的内容发送到后端
            $('form#emit').submit(function (event) {
                socket.emit('message', {
                    data: "dwdwdw",
                    send_user_name: "张三",
                    room_name: room,
                    recv_user_name: "李四",
                    msg: $('#emit_data').val()
                });
                return false;
            });
            //接收后端广播的信息
            socket.on('message', function (msg) {
                console.log(msg.data)
               if (msg.data.room_name == room){
                    $('#log').append('<br>' + $('<div/>').text(msg.data.msg).html());
                }
            });
            socket.on("state", function (msg) {
            console.log(msg.data)
            $('#state').append('<br>' + $('<div/>').text(msg.data.user_name).html());
            })
        });
    </script>
</head>
<body>
<form id="emit" method="POST" action='#'>
    <input type="text" name="emit_data" id="emit_data" placeholder="Message">
    <input type="submit" value="发送">
</form>
<h2>Receive:</h2>
<div id="log"></div>
<div id="state"></div>
</body>
</html>

用户2

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title></title>
    <script type="text/javascript" src="https://code.jquery.com/jquery-1.4.2.min.js"></script>
    <!--    <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.5/socket.io.min.js"></script>-->
    <script src="https://cdn.bootcss.com/socket.io/2.1.1/socket.io.js"></script>
    <script type="text/javascript">
        $(document).ready(function () {
            namespace = '/message/';
            var socket = io.connect(location.protocol + '//' + "服务端IP" + ':' + "9010");
            //连接后发送日志
            socket.on('connect', function () {
                socket.emit('connec', {
                    user_name: "李四"
                });
                console.log('connected', location.protocol + '//' + "服务端IP" + ':' + "9005")
            });
            var room = "张三_李四"
            //点击发送时将text框的内容发送到后端
            $('form#emit').submit(function (event) {
                socket.emit('message', {
                    data: "dwdwdw",
                    send_user_name: "李四",
                    room_name: room,
                    recv_user_name: "张三",
                    msg: $('#emit_data').val()
                });
                return false;
            });
            //接收后端广播的信息
            socket.on('message', function (msg) {
                console.log(11111, msg.data)
                if (msg.data.room_name == room){
                    $('#log').append('<br>' + $('<div/>').text(msg.data.msg).html());
                }
            });
           socket.on("state", function (msg) {
               console.log(msg.data)
            $('#state').append('<br>' + $('<div/>').text(msg.data.user_name).html());
            })
        });
    </script>
</head>
<body>
<form id="emit" method="POST" action='#'>
    <input type="text" name="emit_data" id="emit_data" placeholder="Message">
    <input type="submit" value="发送">
</form>
<h2>Receive:</h2>
<div id="log"></div>
<div id="state"></div>
</body>
</html>

打赏

发表评论

邮箱地址不会被公开。 必填项已用*标注