gpt4 book ai didi

c# - 发送二进制文件 TcpClient - 文件大于源

转载 作者:太空狗 更新时间:2023-10-30 01:07:45 31 4
gpt4 key购买 nike

为了尝试网络编程,我编写了一个小的控制台应用程序来将 png 文件发送到服务器(另一个控制台应用程序)。服务器正在写入的文件比源 png 文件稍大。而且打不开。

客户端应用程序的代码是:

    private static void SendFile()
{
using (TcpClient tcpClient = new TcpClient("localhost", 6576))
{
using (NetworkStream networkStream = tcpClient.GetStream())
{
//FileStream fileStream = File.Open(@"E:\carry on baggage.PNG", FileMode.Open);

byte[] dataToSend = File.ReadAllBytes(@"E:\carry on baggage.PNG");

networkStream.Write(dataToSend, 0, dataToSend.Length);
networkStream.Flush();

}
}

}

服务器应用程序的代码是:

    private static void Main(string[] args)
{
Thread thread = new Thread(new ThreadStart(Listen));
thread.Start();

Console.WriteLine("Listening...");
Console.ReadLine();
}

private static void Listen()
{
IPAddress localAddress = IPAddress.Parse("127.0.0.1");
int port = 6576;
TcpListener tcpListener = new TcpListener(localAddress, port);
tcpListener.Start();

using (TcpClient tcpClient = tcpListener.AcceptTcpClient())
{
using (NetworkStream networkStream = tcpClient.GetStream())
{
using (Stream stream = new FileStream(@"D:\carry on baggage.PNG", FileMode.Create, FileAccess.ReadWrite))
{
// Buffer for reading data
Byte[] bytes = new Byte[1024];
var data = new List<byte>();

int length;

while ((length = networkStream.Read(bytes, 0, bytes.Length)) != 0)
{
var copy = new byte[length];
Array.Copy(bytes, 0, copy, 0, length);
data.AddRange(copy);
}

BinaryFormatter binaryFormatter = new BinaryFormatter();
stream.Position = 0;
binaryFormatter.Serialize(stream, data.ToArray());
}
}

}
tcpListener.Stop();

写入文件大小为24,103Kb,而源文件只有24,079Kb。

任何人都清楚此操作失败的原因吗?

干杯

最佳答案

您正在使用 BinaryFormatter 编写输出。我很确定这会在输出的开头添加一些字节以指示您正在输出的类型(在本例中为 System.Byte[])。
无需使用格式化程序,只需将字节直接写入文件即可:

using (Stream stream = new FileStream(@"D:\carry on baggage.PNG", FileMode.Create, FileAccess.ReadWrite))
{
// Buffer for reading data
Byte[] bytes = new Byte[1024];

int length;

while ((length = networkStream.Read(bytes, 0, bytes.Length)) != 0)
{
stream.Write(bytes, 0, length);
}
}

关于c# - 发送二进制文件 TcpClient - 文件大于源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11396454/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com