2015-11-27 42 views
0

嘿,我是相当新的编程,做了一些C#,但对Python来说是全新的。 我已经从我的树莓派(python3)发送图像到我的笔记本电脑(C#)。我可以将字节发送出去,但是当它被接收(重新创建)时,我无法打开图像? :(无法打开jpg(通过套接字从Python3发送到C#)?

顺便说一句,这是我的计算器上的第一篇文章,我希望你能帮助我:)

C#代码(接收):

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Net.Sockets; 
using System.Text; 
using System.Threading.Tasks; 
using System.Drawing; 
using System.IO; 

namespace tmpRaspTcpServer 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      IPAddress localAdd = IPAddress.Parse("xxx.xxx.xxx.xxx"); 
      TcpListener listener = new TcpListener(IPAddress.Any, 8888); 
      Console.WriteLine("Listen..."); 
      listener.Start(); 

      while (true) 
      { 

       TcpClient client = listener.AcceptTcpClient(); 

       NetworkStream nwStream = client.GetStream(); 
       byte[] buffer = new byte[client.ReceiveBufferSize]; 

       int bytesRead = nwStream.Read(buffer, 0, client.ReceiveBufferSize); 

       string dataReceived = Encoding.ASCII.GetString(buffer, 0, bytesRead); 
       Console.WriteLine("Reading bytes: "); 

       FileStream fs = new FileStream("c:\\tmp\\file.jpg", FileMode.Create); 

       TraditionalReceiveBinary(nwStream, fs); 
      } 
     } 

     private static void TraditionalReceiveBinary(NetworkStream nwstream, FileStream fs) 
     { 
      // read the file in chunks of 1KB 
      byte[] buffer = new byte[1024]; 

      int bytesRead; 
      while ((bytesRead = nwstream.Read(buffer, 0, buffer.Length)) > 0) 
      { 

       fs.Write(buffer, 0, bytesRead); 

       Console.Write("."); // a dot for each kb 
      } 
      fs.Flush(); 

     } 
    } 
} 

Python3码(发送):

import socket 
HOST, PORT = "xxx.xxx.xxx.xxx", 8888 

image = open('image.jpg', 'rb') 
image_data = image.read() 
image.close() 

socketData = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
socketData.connect((HOST,PORT)) 

socketData.sendall(image_data) 

我没有得到任何错误,并且当我发送图像时,c#应用程序在控制台中创建点,但该文件已“损坏”或什么东西:(

我试着用不同的编码和标题 - 但没有运气。

+0

通常的原因是要么不读取文件作为二进制文件(但我可以看到你这样做)或不把它写成二进制文件 - 无法看到你指定二进制文件的位置。 – barny

+0

当我读到它的二进制“'rb'”我也应该把它写入二进制流? - 如果是的话,你可以快速考虑一下代码的外观如何? 到目前为止感谢:) –

+0

不需要(不知道它是否可能) - 它是文件读/写,你需要确保二进制文件。 – barny

回答

0

你放弃,你是从插座在读第一TcpClient.ReceiveBufferSize字节:

int bytesRead = nwStream.Read(buffer, 0, client.ReceiveBufferSize); 

这将损坏的输出文件。

+0

谢谢你,现在有效:D –