Как я могу ждать, пока я получу данные, используя сокет Python? - PullRequest
0 голосов
/ 13 ноября 2018

Я создаю сокет-клиент и пытаюсь получить некоторые данные.Для этого мне нужно подключиться к веб-серверу через сокет, и сервер фактически создает другой сокет, который прослушивает и ожидает данные, после чего отправляет их обратно клиенту.

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

Как мне ждать непустогоданные с сервера с использованием Python-сокетов?

Мой код:

import sys
import json
import socketIO_client
import time

host = 'https://SOME_URL'

socketIO = socketIO_client.SocketIO(host, params={"email" : "edmund@gmail.com"})
def on_connect(*args):
    print "socket.io connected"

def on_disconnect(*args):
    print "socketIO diconnected"

socketIO.on('connect', on_connect)
socketIO.on('disconnect', on_disconnect)

def on_response_state(*args):
    print args # Prints ()

socketIO.emit('receive_state',on_response_state)
socketIO.wait_for_callbacks(seconds=3)

Ответы [ 3 ]

0 голосов
/ 04 декабря 2018

Вот пример использования socket.Используя s.accept(), клиент будет ждать, пока клиент примет соединение, прежде чем запускать цикл while для получения данных.Это должно помочь с вашей проблемой.

def receiver():
    PORT = 123
    CHUNK_SIZE = 1024

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    s.bind(('0.0.0.0', PORT))
    s.listen(1)
    conn,address=s.accept()  # accept an incoming connection using accept() method which will block until a new client connects

    while True:
        datachunk = conn.recv(CHUNK_SIZE) # reads data chunk from the socket in batches using method recv() until it returns an empty string
        if not datachunk:
            break  # no more data coming in, so break out of the while loop
        data.append(datachunk)  # add chunk to your already collected data

    conn.close()
    print(data)
    return

receiver()
0 голосов
/ 07 декабря 2018

Поскольку вы используете библиотеку SocketIO для включения параметров (достигается с помощью запросов ) и хотите отправить сообщение, вы можете ждать ответа бесконечно, не указывая время ожидания.

with SocketIO(host, params={"email" : "edmund@gmail.com"}) as socketIO:
    def on_response_state(*args):
        print args # Prints ()

    socketIO.emit('receive_state', on_response_state)
    socketIO.wait()
0 голосов
/ 04 декабря 2018

поместите сокет recv в поток while.

как это:

  def rec(self):

    while 1:
        sleep 0.01
        rdata = self.clientsocket.recv(self.buffsize)

        print("rec from server: ", rdata.decode('utf8'),'\n','press enter to continue')

....

t2 = threading.Thread(target=y.rec, name="rec") 

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