为了让我的脚趾处于网络编程的水域,我编写了一个控制台应用程序来发送一个png文件到服务器(另一个控制台应用程序)。由服务器写入的文件略大于源png文件。它不会打开。发送二进制文件TcpClient - 文件比源文件大
客户端应用程序的代码是:
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。
任何人都明白为什么这个操作失败了吗?
干杯
嗯,基本上它should't已经发生了,因为我自己也是在同一应用程序的工作。但我想这可能是PNG文件的一些问题。 – akhil 2012-07-09 13:58:52
尝试此链接http://www.daniweb.com/software-development/csharp/threads/380894/transferring-a-file-over-c-networkstream – akhil 2012-07-09 14:03:18
比较两个'byte []'找出它们是不同的然后从那里出发。我看到两个阵列之间的一个主要区别,大小是不同的,一个是图像的大小,另一个是1024. **我要发送的第一个数据包是需要的缓冲区的大小** – 2012-07-09 14:09:26