如何在Python socket中等待接收数据?

12

我正在创建一个Socket客户端并尝试获取一些数据。为了实现此目的,我需要通过Socket连接到Web服务器,而服务器实际上会创建另一个Socket来监听并等待数据,之后将数据发送回客户端。

我遇到的问题是下面的代码中,我的Socket客户端不等待来自服务器的输入数据,而只接受空数据。

如何使用Python sockets等待来自服务器的非空数据?

我的代码:

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
@bunbun,你在哪里看到了密码参数?我只需要一个电子邮件参数。 - aikhs
你正在告诉它在继续执行最后一行之前只等待最多3秒钟,将其更改为 socketIO.wait() 以等待响应。 - James Kent
Software_delayblock_waitblock_read永远不能解决您的问题!需要读取一些头部数据/字节(因为header包含content-length),并等待直到最后一个字节被接收到(否则会得到已损坏的数据)。 - dsgdfg
@JamesKent socketIO.wait()与数据等待无关,它仅确保套接字连接到服务器的持续时间。 - aikhs
3个回答

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

我该如何使用电子邮件作为参数连接到套接字?连接后,我该如何向套接字参数发射? - aikhs

1
将接收套接字放入一个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()

0

由于您正在使用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()

很遗憾,您的解决方案不起作用。它在发出数据后不等待,直接进入回调函数,然后无限期等待。 - aikhs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接