在 Python 中通过 TCP 套接字发送列表
Send list over TCP socket in Python
我想在 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)
和服务器端的终端return这个:
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
您的代码有两个问题。第一个是您客户端的一个简单错字。您应该将 send_package = pickle.dumps(send_package)
更改为 send_package = pickle.dumps(package)
。您这样做是因为您试图将 package
变量腌制为新的 send_package
变量,并且您不能将新变量定义为自身的函数。
您的代码的主要问题是 header。您定义的 HEADER
变量是指您愿意发送的数据量。在你的例子中,你选择了 40 轮。问题是您的列表超过了您分配的大小。因此,您只能发送其中的一小部分。
这是一个简单的修复,只需将 HEADER
更改为更大的数字,例如 4096
,一切都会正常进行。以下是文档中的描述:socket.recv
我想在 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)
和服务器端的终端return这个:
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
您的代码有两个问题。第一个是您客户端的一个简单错字。您应该将 send_package = pickle.dumps(send_package)
更改为 send_package = pickle.dumps(package)
。您这样做是因为您试图将 package
变量腌制为新的 send_package
变量,并且您不能将新变量定义为自身的函数。
您的代码的主要问题是 header。您定义的 HEADER
变量是指您愿意发送的数据量。在你的例子中,你选择了 40 轮。问题是您的列表超过了您分配的大小。因此,您只能发送其中的一小部分。
这是一个简单的修复,只需将 HEADER
更改为更大的数字,例如 4096
,一切都会正常进行。以下是文档中的描述:socket.recv