我想撰寫一個程式,允許我將影像從客戶端發送到服務器并撰寫此服務器和此客戶端:
服務器:
import io
import struct
import socket
from PIL import ImageFile, Image
def server():
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 3999))
server_socket.listen(1)
print('Server is listening on port 3999')
while True:
ImageFile.LOAD_TRUNCATED_IMAGES = True
client_socket, address = server_socket.accept()
print('Connection from: ', address)
image = Image.open(io.BytesIO(client_socket.recv(1024)))
image = image.resize((640, 480), Image.ANTIALIAS)
image.save("transfer/image.jpg")
client_socket.close()
if __name__ == '__main__':
server()
這是客戶:
import socket
import io
from PIL import Image
def Client():
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(("localhost", 3999))
byteImgIO = io.BytesIO()
byteImg = Image.open("old.jpeg")
byteImgIO.seek(0)
byteImg.save(byteImgIO, format="JPEG")
byteImgIO.seek(0)
client.send(byteImgIO.read())
client.close()
if __name__ == '__main__':
Client()
print("File sent to server")
這是影像: 要發送的影像
這是輸出: 收到的影像
我做錯了什么?
uj5u.com熱心網友回復:
問題是您的影像不完整。至少有兩個問題:
首先,您只嘗試在客戶端讀取 1024 個位元組。您的影像可能比這更大,并且您可能會得到少于 1024 位元組的大小。因此,您需要讀取直到獲得正確的位元組數,并且您可能希望發送一個 4 位元組的網路位元組順序大小(以位元組為單位)作為幀的第一部分,以便客戶端知道要讀取多少位元組。記住 TCP 是一個連續的流,而不是資料包或訊息。需要告知接收方要讀取多少位元組。
其次,發送者在磁盤上已經有一個 JPEG 編碼的檔案。無需將其從 JPEG 解碼以將其轉換為
PIL Image然后重新編碼為內部的 JPEGBytesIO以發送它。只需以二進制模式打開磁盤檔案,讀取它并發送您讀取的內容。
您可以在這里看到一個非常相似的串行示例,以了解讀取 JPEG 并發送幀大小。
這里的recvall()函式顯示了一種在回圈中在套接字上接收特定位元組數的方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/456320.html
上一篇:如何使用Java/Kotlin套接字向本地網路上的設備發送訊息?
下一篇:接收UDP資料包
