簡體   English   中英

通過 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)

並且服務器端的終端返回這個:

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變量中,並且您不能將新變量定義為 function 本身。

您的代碼的主要問題是 header。 您定義的HEADER變量是指您願意發送的數據量。 在您的情況下,您選擇了 40 個再見。 問題是您的列表超出了您分配的大小。 因此,您只能發送其中的一小部分。

這是一個簡單的修復,只需將HEADER更改為更大的數字,如4096 ,一切都會正常工作。 這是文檔中的描述: socket.recv

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM