HTTP-сервер Python 2-сторонняя связь - PullRequest
0 голосов
/ 24 октября 2018

Я новичок в программировании на python и сервере и пытаюсь записать двустороннюю связь между сервером и несколькими клиентами.

Я использую Pyhton JSON, библиотеку запросов и baseHTTPServer

Пока это мой код: Клиент:

import requests
import json

if __name__ == '__main__':

    x = SomeClass()
    payload = x.toJson()
    print(j)

    headers = {
        'Content-Type': 'application/json',
    }
    params = {
        'access_token': "params",
    }
    url = 'http://127.0.0.1:8000'
    response = requests.post(url, headers=headers, params=params,
                             data=payload)

Сервер:

from http.server import HTTPServer, BaseHTTPRequestHandler
import  json


class Handler(BaseHTTPRequestHandler):
    def do_POST(self):
        # First, send a 200 OK response.
        self.send_response(200)

        # Then send headers.
        self.send_header('Content-type', 'text/plain; charset=utf-8')
        self.end_headers()

        length = int(self.headers.get('Content-length', 0))
        data = json.loads(self.rfile.read(length).decode())


if __name__ == '__main__':
    server_address = ('', 8000)  # Serve on all addresses, port 8000.
    httpd = HTTPServer(server_address, HelloHandler)
    httpd.serve_forever()

У меня есть 2 вопроса:

  1. Данные, которые я получаю на сервере, в порядке, но как мне отправить данные обратно клиенту?Я полагаю, что я могу сделать из клиента что-то вроде занятое ожидание каждые несколько секунд и отправлять POST снова и снова, но это неправильно, после того, как сервер запущен с do_POST без ожидания занятого.

  2. Если у меня есть 10 000 клиентов, подключенных к серверу, как я могу отправить данные определенному клиенту?Я предполагаю, что если соединение было установлено, то сокет открывается где-то

1 Ответ

0 голосов
/ 24 октября 2018

Ниже приведен базовый код ASYNC для обработки запросов веб-сокетов.Это довольно просто.Ваш JS подключится к маршруту localhost/ws/app и обработает данные, которые должны поступить в формате JSON.

from gevent import monkey, spawn as gspawn, joinall
monkey.patch_all()
from gevent.pywsgi import WSGIServer
from geventwebsocket.handler import WebSocketHandler
from gevent import sleep as gsleep, Timeout
from geventwebsocket import WebSocketError
import bottle
from bottle import route, get, abort, template


@get('/app')
def userapp():
    tpl = 'templates/apps/user.tpl'
    urls = {'websockurl': 'http://localhost/ws/app'}
    return template(tpl, title='APP', urls=urls)

@route('/ws/app')
def handle_websocket():
    wsock = request.environ.get('wsgi.websocket')
    if not wsock:
        abort(400, 'Expected WebSocket request.')
     while 1:
        try:
            with Timeout(2, False) as timeout:
                message = wsock.receive()
            # DO SOMETHING WITH THE DATA HERE wsock.send() to send data back through the pipe
        except WebSocketError:
            break
        except Exception as exc:
            gsleep(2)


if __name__ == '__main__':
    botapp = bottle.app()
    WSGIServer(("0.0.0.0", 80)), botapp, 
    handler_class=WebSocketHandler).serve_forever()
...