flask实现websocket,用ws协议,模块是geventwebsocket

img

为什么我的socket是none啊
这边的socket是直接从requests获取的

代码是:

from geventwebsocket.handler import WebSocketHandler
from geventwebsocket.server import WSGIServer
from geventwebsocket.websocket import WebSocket  # 语法提示

from flask import Flask, request,render_template,abort

app = Flask(__name__)

@app.route('/')
def base():
    return render_template('wsClient.html')

socketList = []

@app.route('/ws')
def ws():
    socket = request.environ.get('wsgi.websocket')  # type:WebSocket
    socketList.append(socket)
    print(socket)
    while True:
        msg = socket.receive()
        print(msg)
        for i in socketList:
            if msg =='一号模式':
                i.send('一条龙服务')
            elif msg =='二号模式':
                i.send('一条蛇服务')
            else:
                i.send('啥也不是')
    return '200 ok'

if __name__ == '__main__':
    # app.run('0.0.0.0',5000)
    httpServer = WSGIServer(listener=("0.0.0.0", 5000), application=app, handler_class=WebSocketHandler)
    httpServer.serve_forever()

测试了你的代码没问题,不过有点要稍微调整下socket断开的问题,会得到None信息,并且要从socketList移除对象,要不断开的socket对象调用send会出错.有帮助麻烦点个采纳【本回答右上角】,谢谢~~

img

from geventwebsocket.handler import WebSocketHandler
from geventwebsocket.server import WSGIServer
from geventwebsocket.websocket import WebSocket  # 语法提示
from flask import Flask, request,render_template,abort
app = Flask(__name__)
@app.route('/')
def base():
    return render_template('wsClient.html')
socketList = []
@app.route('/ws')
def ws():
    socket = request.environ.get('wsgi.websocket')  # type:WebSocket
    socketList.append(socket)

    while True:
        if socket.closed:#当前链接断开要退出,并从集合中移除
            socketList.remove(socket)
            break
        msg = socket.receive()
        print(msg)
        if msg!=None:#None是其他用户链接或者断开发送的
            for i in socketList:
                if msg =='一号模式':
                    i.send('一条龙服务')
                elif msg =='二号模式':
                    i.send('一条蛇服务')
                else:
                    i.send('啥也不是')                 
    return '200 ok'
@app.route("/chat")
def chat():
    return render_template("chat.html")
if __name__ == '__main__':
    # app.run('0.0.0.0',5000)
    httpServer = WSGIServer(listener=("0.0.0.0", 5000), application=app, handler_class=WebSocketHandler)
    httpServer.serve_forever()
 

怎么没有看到socket设置IP和端口呢?