Невозможно отправить данные указанному c клиенту веб-сокета в python - PullRequest
1 голос
/ 19 февраля 2020

Я пишу программу с веб-сокетами в python. У меня есть пример сервера и клиентского кода, и они работают хорошо, если подключен только один клиент. Если есть несколько клиентов, данные с сервера будут go случайным образом для одного из клиентов.

Я бы хотел:

  1. Сервер для отслеживания различных подключенных клиентов
  2. Сервер для возможности перенаправления сообщений на указанный c клиент. из нескольких (например, 5) клиентов

websockets - это библиотека, которую я использую. Python версия 3.7.2

Код сервера:

import asyncio
import websockets

uri='localhost'


async def response(websocket, path):

    msg = input("What do you want to send : ")
    print("message:",msg)
    await websocket.send(msg)

start_server = websockets.serve(response, uri, 5000)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

Код клиента:

import asyncio
import websockets

uri="ws://localhost:5000"     
async def message():

                async with websockets.connect(uri) as socket:
                        print(await socket.recv())

while True:
        asyncio.get_event_loop().run_until_complete(message())

Если я создаю 2 файла с кодом клиента в качестве client1.py и client2.py, и отправив сообщение со стороны сервера, я получаю отправленные данные, поступающие на любой из клиентов.

Я хотел бы:

  1. Сервер отслеживает Различные клиенты, подключенные
  2. Сервер может перенаправлять сообщения на указанный c клиент из нескольких клиентов

Поскольку я только начинаю с веб-сокетов, все входные данные приветствуются.

В этом выводе я намеревался отправить все свои сообщения клиенту 1, но они были разделены между клиентом 1 и 2

1 Ответ

0 голосов
/ 19 февраля 2020

Я не знаком с asyncio, поэтому я попытаюсь добраться до точки с функциями / потоками;

Обычно, моя серверная сторона слушает одно соединение, и как только оно его принимает, у меня есть функция 'обработчик', который связан с каждым принимаемым соединением.

часть моего сервера и обработчик:

def handler(conn, addr):
    global data1

    while True:
        data = conn.recv(2048)
        data1 = json.loads(data.decode())
        # treat it as you need

while True:
    s.listen(1)
    conn, addr = s.accept()
    print('Conectado com', addr[0],':', str(addr[1]))
    thr = threading.Thread(target = handler, args = (conn, addr)).start()

Теперь, для контроля клиентов и тому подобного, я всегда использую толковый словарь. Ключ должен быть именем пользователя или любой другой конкретной информацией. Значение ключа - это «соединение» от этого пользователя. Таким образом, вы можете получить соединение пользователя 'x' по его ключу c.

Что-то вроде:

import socket
import time
import datetime as dt
import base64
import os
import json
import threading

HOST = ''
PORT = 12999

global s

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((HOST,PORT))

whoto = {}

def autenticacao():

    global data1
    global conn
    global nomeuser

    user1 = data1[1]
    passwd = data1[2]


    auth = c.execute('SELECT usuario FROM fullinfo WHERE usuario= ? AND password = ?', (user1,passwd)).fetchone()
    if auth is not None:
        word = 'autenticado'
        conn.sendall(word.encode())
        nomeuser = auth[0]
        whoto[nomeuser] = conn

Извините, я оставляю это невоспроизводимым, но моя цель - показать «алгоритм». Этот словарь - то, что я использую, чтобы вести учет того, кто находится в сети, адрес (conn) каждого клиента для отправки сообщений отдельным клиентам и тому подобное. В приведенном выше примере я добавляю пользователя (ключ) и conn (значение), как только он аутентифицирован на моем сервере.

Надеюсь, это поможет. Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...