【问题标题】:Send list over TCP socket in Python在 Python 中通过 TCP 套接字发送列表
【发布时间】:2021-07-17 07:16:15
【问题描述】:

我想通过 python 中的 TCP 套接字发送一个列表。然后我必须在接收端收到相同的列表。我目前在发送列表的方式方面遇到错误。我也尝试将列表转换为 str() 格式并在发送前对其进行编码,但它也没有工作。

这是我的客户端:

import socket 
import pickle 

HEADER = 40
IP = '127.0.0.1'
PORT = 9669

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((IP, PORT))
package = [1, 5, 0, 0, 0, 'u', 's', 'e', 'r', '1', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
send_package = pickle.dumps(send_package)
client_socket.send(send_package)

这是我的服务器端

import socket 
import pickle 

HEADER = 40
IP = '127.0.0.1'
PORT = 9669

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

server_socket.bind((IP,PORT))

server_socket.listen()

client_socket, client_address = server_socket.accept()

receive_message = client_socket.recv(HEADER)
message = pickle.loads(receive_message)
print(type(message))
print(message)

服务器端的终端返回这个:

Traceback (most recent call last):
  File "c:/Users/Duong Dang/Desktop/authen/server.py", line 17, in <module>
    message = pickle.loads(receive_message)
_pickle.UnpicklingError: pickle data was truncated

【问题讨论】:

  • 您只收到 40 个字节。

标签: python sockets tcp


【解决方案1】:

您的代码有两个问题。第一个是您客户端的一个简单的错字。您应该将send_package = pickle.dumps(send_package) 更改为send_package = pickle.dumps(package)。您这样做是因为您试图将 package 变量腌制到新的 send_package 变量中,并且您无法将新变量定义为自身的函数。

您的代码的主要问题是标题。您定义的HEADER 变量是指您愿意发送的数据量。在您的情况下,您选择了 40 个再见。问题是您的列表超出了您分配的大小。因此,您只能发送一小部分。

这是一个简单的修复,只需将HEADER 更改为更大的数字,例如4096,一切都会正常工作。以下是文档中的描述:socket.recv

【讨论】:

    猜你喜欢
    • 2016-11-19
    • 2015-01-30
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多