Python套接字选择模块,显示它仅接收请求时已接收到读取请求。为什么?

切鲁梅西

我正在创建一个程序,客户端在其中输入包含图像的文件名。然后将其转换为numpy数组,进行腌制并将其发送到服务器。服务器使用PIL ImageDraw在所述图像上方绘制红色X,然后将其发送回客户端。我注意到,出于某种原因,select函数将套接字两次添加到读取列表中。我知道这一点,因为客户端将图像取回,并且在发送过程结束时添加了一个打印功能,并且触发了一次,但是随后一个较早的打印语句又退出了,并返回了错误。这是服务器输出:

b'56925          '
sent
b''
Traceback (most recent call last):
  File "server.py", line 31, in <module>
    msglengthi = int(msglength)
ValueError: invalid literal for int() with base 10: ''

这是服务器代码:

import socket
import pickle
from PIL import ImageDraw
from PIL import Image
import select
import numpy

IP = socket.gethostbyname(socket.gethostname())
PORT = 4321
HEADERSIZE = 15

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((IP, PORT))
s.listen(5)
socketlist = [s]
readqueue = []


while True:
    readqueue, write, exception  = select.select(socketlist, [], [])
    for socket in readqueue:
        if socket == s:
            clientsocket, clientaddress = s.accept()
            socketlist.append(clientsocket)
            print(f"Connection received from {clientaddress}")
            clientsocket.send(bytes("Welcome to the server", "utf-8"))
        else:
            msglen = socket.recv(HEADERSIZE)
            msglength = msglen.decode("utf-8")
            print(msglen)
            msglengthi = int(msglength)
            fullmsg = []
            x=0
            while x<=msglengthi:
                msgu = socket.recv(3000)
                fullmsg.append(msgu)
                x+=3000
            fullmsg = b"".join(fullmsg)
            msg = pickle.loads(fullmsg)
            img = Image.fromarray(msg)
            draw = ImageDraw.Draw(img)
            width, height = img.size
            draw.line((0, 0, width, height), fill="red", width=20)
            draw.line((width, 0, 0, height), fill="red", width=20)
            payload = pickle.dumps(numpy.array(img))
            paylen = len(payload)
            socket.send(bytes(f"{paylen:<{HEADERSIZE}}", "utf-8")+payload)
            print("sent")

最后是客户端代码:

import socket
import pickle
from PIL import Image
import numpy


PORT = 4321
IP = socket.gethostbyname(socket.gethostname())
HEADERSIZE = 15

cs = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
cs.connect((IP, PORT))
welcomemsg = cs.recv(21)
welcomemsg = welcomemsg.decode("utf-8")
print(welcomemsg)

img = input("Enter image file: ")
imgo = Image.open(img)
imga = numpy.array(imgo)
imgdump = pickle.dumps(imga)
msglen = len(imgdump)
print(msglen)
cs.send(bytes(f"{msglen:<{HEADERSIZE}}", "utf-8")+imgdump)
msglen = cs.recv(HEADERSIZE)
msglen = msglen.decode("utf-8").strip()
msglen = int(msglen)
x=0
fullmsg=[]
while x<=msglen:
    msg = cs.recv(3000)
    fullmsg.append(msg)
    x+=3000
fullmsg = b"".join(fullmsg)
img = pickle.loads(fullmsg)
img = Image.fromarray(img)
img.show()

谢谢!

斯蒂芬·乌尔里希(Steffen Ullrich)

我注意到,出于某种原因,select函数将套接字两次添加到读取列表中。

没有。select当套接字上有可以使用检索的信息时,返回该套接字可读recv当您处理recv返回实际数据的情况时,当recv返回一个空缓冲区(即'')时,当对等方关闭连接时,它将不处理情况换句话说:问题不select只是您对工作方式selectrecv工作方式的假设

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

取消套接字接收请求的最佳方法是什么?

来自分类Dev

为什么接收到的缓冲区大小比最初通过套接字发送的要大?

来自分类Dev

创建套接字连接时,不允许接收数据的请求

来自分类Dev

不允许发送或接收数据的请求,因为未连接套接字(仅当我第二次连接时)

来自分类Dev

为什么套接字实现比请求慢?

来自分类Dev

通过TCP套接字发送手工制作的HTTP请求时,为什么会收到HTTP 400错误请求响应?

来自分类Dev

为什么当我使用“ control-c”关闭发送对等端上的套接字时,接收对等端上的套接字保持无限接收”

来自分类Dev

为什么接收到PubNub消息时我的基因剔除模块会失去其绑定?

来自分类Dev

如何防止接收套接字永远阻塞,以防万一它没有收到数据?

来自分类Dev

在Python中使用套接字接收/发送数据时真正发生了什么

来自分类Dev

vue + nuxt.js-如何读取从外部请求接收到的POST请求参数

来自分类Dev

仅在发送 python 套接字时接收数据

来自分类Dev

Octave,套接字连接接收到的显示图像不显示

来自分类Dev

Python中的SMBus / I2C在请求读取时不断触发接收回调

来自分类Dev

从Servlet请求输入流读取时套接字超时

来自分类Dev

为什么我在接收文件时收到“UnsupportedOperationException”?

来自分类Dev

Django为什么要转换从API请求接收的时间戳

来自分类Dev

在使用Python Requests模块向YouTube API v3发出POST请求时,为什么会收到“请求缺少必需的身份验证凭据”的信息?

来自分类Dev

接收套接字请求,通过各个端点,并使用骆驼中的netty响应回相同的套接字连接

来自分类Dev

接收套接字请求,通过各个端点,并使用骆驼中的netty响应回相同的套接字连接

来自分类Dev

套接字Python 3.5:套接字服务器在文件接收时永久挂起

来自分类Dev

C#不允许发送或接收数据的请求,因为未连接套接字

来自分类Dev

不允许发送或接收数据的请求,因为套接字未连接C#

来自分类Dev

Python套接字-同时发送/接收消息

来自分类Dev

使用从TCP套接字[python]接收的数据

来自分类Dev

Python 套接字接收损坏的信息

来自分类Dev

无法从python套接字接收答案

来自分类Dev

线程中的Python套接字接收

来自分类Dev

扭曲的套接字连接未接收到数据

Related 相关文章

  1. 1

    取消套接字接收请求的最佳方法是什么?

  2. 2

    为什么接收到的缓冲区大小比最初通过套接字发送的要大?

  3. 3

    创建套接字连接时,不允许接收数据的请求

  4. 4

    不允许发送或接收数据的请求,因为未连接套接字(仅当我第二次连接时)

  5. 5

    为什么套接字实现比请求慢?

  6. 6

    通过TCP套接字发送手工制作的HTTP请求时,为什么会收到HTTP 400错误请求响应?

  7. 7

    为什么当我使用“ control-c”关闭发送对等端上的套接字时,接收对等端上的套接字保持无限接收”

  8. 8

    为什么接收到PubNub消息时我的基因剔除模块会失去其绑定?

  9. 9

    如何防止接收套接字永远阻塞,以防万一它没有收到数据?

  10. 10

    在Python中使用套接字接收/发送数据时真正发生了什么

  11. 11

    vue + nuxt.js-如何读取从外部请求接收到的POST请求参数

  12. 12

    仅在发送 python 套接字时接收数据

  13. 13

    Octave,套接字连接接收到的显示图像不显示

  14. 14

    Python中的SMBus / I2C在请求读取时不断触发接收回调

  15. 15

    从Servlet请求输入流读取时套接字超时

  16. 16

    为什么我在接收文件时收到“UnsupportedOperationException”?

  17. 17

    Django为什么要转换从API请求接收的时间戳

  18. 18

    在使用Python Requests模块向YouTube API v3发出POST请求时,为什么会收到“请求缺少必需的身份验证凭据”的信息?

  19. 19

    接收套接字请求,通过各个端点,并使用骆驼中的netty响应回相同的套接字连接

  20. 20

    接收套接字请求,通过各个端点,并使用骆驼中的netty响应回相同的套接字连接

  21. 21

    套接字Python 3.5:套接字服务器在文件接收时永久挂起

  22. 22

    C#不允许发送或接收数据的请求,因为未连接套接字

  23. 23

    不允许发送或接收数据的请求,因为套接字未连接C#

  24. 24

    Python套接字-同时发送/接收消息

  25. 25

    使用从TCP套接字[python]接收的数据

  26. 26

    Python 套接字接收损坏的信息

  27. 27

    无法从python套接字接收答案

  28. 28

    线程中的Python套接字接收

  29. 29

    扭曲的套接字连接未接收到数据

热门标签

归档