通过TCPClient c#发送大图像

时间:2017-06-25 13:30:09

标签: c# file tcpclient transfer

我有以下代码将图片发送到接收应用程序

SELECT e.EmployeeId, e.JobTitle, COUNT(c.SupportRepId) AS Customers
FROM Employee e JOIN
     Customer c 
     ON c.SupportRepId = e.EmployeeId
GROUP BY e.EmployeeId, e.JobTitle;

我正在收到另一端的文件

SELECT e.*, c.Customers
FROM Employee e JOIN
     (SELECT c.SupportRepId, COUNT(c.SupportRepId) AS Customers
      FROM Customer c 
      GROUP BY c.SupportRepId
     ) c
     ON c.SupportRepId = e.EmployeeId;

如果我发送的图片很小(大约<20kb),则文件在另一端收到100%,但如果我发送的文件大于&gt; = 100kb,则会收到图片但只有一半图像已加载。我知道在读取所有数据之前读取流的方法,但我不知道如何正确实现它。

谢谢

2 个答案:

答案 0 :(得分:4)

您只需拨打Read一次,但肯定无法读取所有字节。你可以循环,调用Read并在每次迭代时复制相关的字节数,或者你可以使用Stream.CopyTo

var imageStream = new MemoryStream();
nwStream.CopyTo(imageStream);
// Rewind so that anything reading the data will read from the start
imageStream.Position = 0;

...或者您可以直接从网络流中读取图像:

// No need for another stream...
Image returnImage = Image.FromStream(nwStream);

(它的可能会因为流不可搜索而失败...在这种情况下,如上所述使用CopyTo将是最简单的选项。)< / p>

答案 1 :(得分:0)

TCP协议(与任何其他流协议一样)不能用于按原样传输数据。大多数情况下,不可能知道是否所有数据都已到达,或者是否与预期的数据一起接收到不相关的数据块。因此,几乎总是需要定义底层协议,例如通过发送消息头(如在HTTP中)或定义消息分隔符(如Telnet中的换行符;但是,对大型消息使用分隔符是不切实际的)。在大多数简单的情况下,定义非常简单的标题就足够了,它只包含消息的长度

因此,在您的情况下,您可以发送4字节图像长度,然后发送图像。在服务器端,您将读取4个字节的大小,然后在循环中调用Read,直到收到完整的消息。

请注意,您可以收到比预期更多的字节。这意味着最后一个块包含下一个消息的开头。