2012-07-09 59 views
3

为了让我的脚趾处于网络编程的水域,我编写了一个控制台应用程序来发送一个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。

任何人都明白为什么这个操作失败了吗?

干杯

+0

嗯,基本上它should't已经发生了,因为我自己也是在同一应用程序的工作。但我想这可能是PNG文件的一些问题。 – akhil 2012-07-09 13:58:52

+0

尝试此链接http://www.daniweb.com/software-development/csharp/threads/380894/transferring-a-file-over-c-networkstream – akhil 2012-07-09 14:03:18

+0

比较两个'byte []'找出它们是不同的然后从那里出发。我看到两个阵列之间的一个主要区别,大小是不同的,一个是图像的大小,另一个是1024. **我要发送的第一个数据包是需要的缓冲区的大小** – 2012-07-09 14:09:26

回答

5

您正在使用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); 
    } 
} 
+0

这工作!感谢Martin。 – onefootswill 2012-07-09 21:42:38