【问题标题】:How can I wait until I receive data using a Python socket?如何等到我使用 Python 套接字接收数据?
【发布时间】:2018-12-07 09:12:17
【问题描述】:

我正在创建一个套接字客户端并尝试获取一些数据。为此,我需要通过套接字连接到 Web 服务器,服务器实际上创建了另一个套接字,该套接字侦听并等待数据,然后将数据发送回客户端。

我对下面代码的问题是我的套接字客户端不等待来自服务器的传入数据,而只接受空数据。

如何使用 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)

【问题讨论】:

  • 为什么不需要密码参数?我认为您需要提供一些服务器上下文,问题似乎不仅仅是“需要一个while循环”
  • @bunbun 您在哪里看到密码参数?我只需要一个电子邮件参数
  • 你告诉它在继续最后一行之前最多等待 3 秒,将其更改为 socketIO.wait() 以等待响应。
  • Software_delay,block_wait,block_read 永远不会解决您的问题!需要读取一些 header 数据/字节(cos header include content-length)和 wait_until **如果收到 last_byte **(否则已经收到损坏的数据)。
  • @JamesKent socketIO.wait() 与等待数据无关,它只保证socket连接到服务器的持续时间

标签: python sockets


【解决方案1】:

这是一个使用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()

【讨论】:

  • 如何使用电子邮件作为参数连接到套接字?连接后如何发送到套接字参数?
【解决方案2】:

将 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()

【讨论】:

    【解决方案3】:

    由于您使用SocketIO 库来包含参数(使用requests 实现),并且想要发出消息,因此您可以通过不指定等待时间来无限期地等待响应。

    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()
    

    【讨论】:

    • 很遗憾,您的解决方案不起作用。它不等待数据,发出后直接回调,然后无限期等待
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多