我正在使用 Python(服务器)通过 TCP scoket 将图像发送到 C# Winforms 应用程序(客户端)。我的代码似乎可以工作,但输出的图像似乎不完整(见下文)。
发送图像数据的Python代码:
## Connection code...
## Previous protocol code...
# Send image
with open(imagePath, "rb") as image:
encodedImage = image.read()
socket.sendall(encodedImage)
接收图像数据的C#代码:
// Connection code...
// Previous protocol code...
// Receive image size...
// Receive image
try
{
byte[] imageData = new byte[imageSize];
int totalBytesReceived = 0;
while (totalBytesReceived < imageSize)
{
int bytesRead = stream.Read(imageData, totalBytesReceived, imageSize - totalBytesReceived);
totalBytesReceived += bytesRead;
}
using (MemoryStream ms = new MemoryStream(imageData))
{
Image image = Image.FromStream(ms);
image.Save("test.jpg");
}
logToConsole("Image saved"); // Custom function
}
catch (Exception ex)
{
logToConsole(ex.Message);
}
输出图像:
int bytesRead =stream.Read(imageData,totalBytesReceived,imageSize -totalBytesReceived);
你的想法是正确的,但是每次调用它都会覆盖 imageData。因此,当您执行
new MemoryStream(imageData)
时,您只获得了最后一块数据。
你可能应该做类似的事情
using var ms = new MemoryStream();
while (totalBytesReceived < imageSize)
{
int bytesRead = stream.Read(imageData, totalBytesReceived, imageSize - totalBytesReceived);
ms.Write(imageData, 0, bytesRead);
}
或者只是
using var ms = new MemoryStream();
stream.CopyTo(ms);