websocket实现手机上传图片到电脑

2020-06-09  本文已影响0人  fly_tomato

WebSocket是一种网络通信协议,可以实现服务端与客户端的双向通信
它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息。

HTTP协议的话,只能由客户端发起通信,如果要获取服务端数据变化,只能通过“轮询”实现:每过一段时间发起一个询问,轮询的效率低,浪费资源,因为必须不停建立连接,或者保持HTTP 长连接。

服务端的实现方式有多种,本文用Flask-websocket实现。
下面贴上服务端代码:

import json

from flask import Flask, request, jsonify
from gevent.pywsgi import WSGIServer
from geventwebsocket.handler import WebSocketHandler
from geventwebsocket.exceptions import WebSocketError


app = Flask(__name__)

SOCKET_DIC = {}

# 接收请求参数sign,用来区分不同客户端请求
@app.route('/ws/file/<sign>')
def ws_socket(sign):
    ws = request.environ.get('wsgi.websocket')
    if not ws:
        return '请求方式错误!'
   
    while True:
        msg = ws.receive()
        if not msg:
            ws.close()
            try:
                SOCKET_DIC.pop(sign)
            except Exception as e:
                pass
            break

        msg = eval(msg)

        if isinstance(msg, list):
            ws_dic = {
                sign: ws
            }
            # 保存请求方信息,实现类似群聊功能
            SOCKET_DIC.update(ws_dic)
        else:
            client = SOCKET_DIC.get(sign)
            if not client:
                ws.close()
            try:
                client.send(json.dumps(msg))
                ws.send(json.dumps(msg))
            except WebSocketError as e:
                pass
            SOCKET_DIC.pop(sign)

    return 'success'


if __name__ == '__main__':
    http_server = WSGIServer(('0.0.0.0', 5000), app, handler_class=WebSocketHandler)
    http_server.serve_forever()

客户端新建一个WebSoket实例:

var ws = new WebSocket('ws://ip:port/ws/file/{sign}');
然后可以调用实例的各种方法属性,来监听、接收、发送消息等。

电脑和手机均与服务端建立起通信,服务端将手机端上传的图片转发给电脑端,就实现了简单的手机上传图片到电脑。依据这个思想,我们可以实现更多的功能。

上一篇下一篇

猜你喜欢

热点阅读