实验环境
python 用的是3.11.11
其他环境可以通过这种方式一键安装:
pip install flask==3.1.0 Flask-SocketIO==5.4.1 gevent-websocket==0.10.1 -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple
pip list 详情如下:
Package Version
---------------- -------
bidict 0.23.1
blinker 1.9.0
click 8.1.7
Flask 3.1.0
Flask-SocketIO 5.4.1
gevent 24.11.1
gevent-websocket 0.10.1
greenlet 3.1.1
h11 0.14.0
itsdangerous 2.2.0
Jinja2 3.1.4
MarkupSafe 3.0.2
pip 24.2
python-engineio 4.11.1
python-socketio 5.11.4
setuptools 75.1.0
simple-websocket 1.1.0
Werkzeug 3.1.3
wheel 0.44.0
wsproto 1.2.0
zope.event 5.0
zope.interface 7.2
先看效果:
目录结构:
app2.py中的内容如下:
from flask import Flask, render_template, request
from flask_socketio import SocketIO, Namespace, join_room, leave_room
app = Flask( __name__)
app. config[ 'SECRET_KEY' ] = 'secret!'
def create_application ( name, config= None , timeout= 60 , proxy= None ) :
app = Flask( name)
@app. route ( "/" , methods= [ "GET" , "POST" ] )
def main ( ) :
return render_template( "index.html" )
return app
class MyNamespace ( Namespace) :
def on_connect ( self) :
print ( "Client connected" )
def on_joinRoom ( self, message) :
join_room( message[ 'room' ] )
socket_io. emit( "roomJoined" , {
"user" : request. sid,
"room" : message[ 'room' ]
} , to= message[ 'room' ] , namespace= "/my_room" )
def on_sendMsg ( self, message) :
print ( message)
socket_io. emit( 'SendtoAll' , { "msg" : message[ "msg" ] , "user" : request. sid} , to= message[ "room" ] , namespace= "/my_room" )
def on_leaveRoom ( self, message) :
print ( message)
socket_io. emit( 'roomLeftPersonal' , { "room" : message[ 'room' ] , "user" : request. sid} , namespace= "/my_room" )
leave_room( message[ 'room' ] )
socket_io. emit( 'roomLeft' , { "room" : message[ 'room' ] , "user" : request. sid} , to= message[ 'room' ] , namespace= "/my_room" )
app = create_application( "pipeagent_service" , config= None )
socket_io = SocketIO( app, processes= True , cors_allowed_origins= "*" , async_mode= 'gevent' )
socket_io. on_namespace( MyNamespace( '/my_room' ) )
if __name__ == "__main__" :
socket_io. run( app= app, host= "0.0.0.0" , debug= False , log_output= True )
index.html中的内容如下:
<! DOCTYPE html >
< html lang = " en" >
< head>
< title> flask socketio通信</ title>
< script src = " https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js" integrity = " sha512-bLT0Qm9VnAYZDflyKcBaQ2gg0hSYNQrJ8RilYldYQ1FxQYoCLtUjuuRuZo+fjqhx/qtq/1itJ0C2ejDxltZVFg==" crossorigin = " anonymous" > </ script>
< script type = " text/javascript" src = " //cdn.bootcss.com/socket.io/3.1.2/socket.io.min.js" > </ script>
< script type = " text/javascript" src = " {{url_for('static', filename='js/index.js')}}" > </ script>
</ head>
< body>
< h3> Join Room</ h3>
< form id = " joinRoom" method = " POST" action = " #" >
< label> Room Number</ label>
< input type = " text" id = " roomNum" required >
< input type = " submit" id = " submitRoomNum" >
</ form>
< button id = " leave_room" > Leave</ button>
< h1> Hello World</ h1>
< ul id = " chatContent" >
< li> Text</ li>
</ ul>
< form id = " SubmitForm" method = " POST" action = " #" >
< h3> 发送文字</ h3>
< textarea placeholder = " 输入文字" name = " msg" id = " chatMsg" required > </ textarea>
< button type = " submit" > 发送</ button>
</ form>
</ body>
</ html>
index.js中的内容如下:
$ ( document) . ready ( function ( ) {
var socket = io. connect ( 'http://localhost:5000/my_room' ) ;
socket. on ( 'connect' , function ( ) {
socket. send ( 'Client Connected' )
} ) ;
$ ( 'form#joinRoom' ) . submit ( function ( event ) {
socket. emit ( 'joinRoom' , { room : $ ( '#roomNum' ) . val ( ) } )
return false
} ) ;
socket. on ( 'roomJoined' , function ( msg, cb ) {
$ ( '#chatContent' ) . append ( '<li>' + msg. user + 'has joined room' + msg. room + ' </li>' )
} ) ;
$ ( 'form#SubmitForm' ) . submit ( function ( event ) {
socket. emit ( 'sendMsg' , {
msg : $ ( '#chatMsg' ) . val ( ) ,
room : $ ( '#roomNum' ) . val ( )
} ) ;
$ ( '#chatMsg' ) . val ( "" ) ;
return false
} ) ;
socket. on ( 'SendtoAll' , function ( msg, cb ) {
$ ( '#chatContent' ) . append ( '<li>' + msg. user + ': ' + msg. msg + '</li>' )
} ) ;
$ ( '#leave_room' ) . on ( 'click' , function ( ) {
socket. emit ( 'leaveRoom' , { room : $ ( '#roomNum' ) . val ( ) } )
console. log ( "sent" )
} ) ;
socket. on ( 'roomLeftPersonal' , function ( msg, cb ) {
$ ( '#chatContent' ) . append ( '<li>' + 'you have left room' + msg. room + ' </li>' )
} ) ;
socket. on ( 'roomLeft' , function ( msg, cb ) {
$ ( '#chatContent' ) . append ( '<li>' + msg. user + 'has left room' + msg. room + ' </li>' )
} ) ;
} )
运行:即 python app2.py 然后打开两个网页,并分别输入http://127.0.0.1:5000/ 开启愉快的自我交流吧