通过TCPCLIENT C#发送大图



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

public static void sendFile(string file, string ip)
    {
        using (TcpClient client = new TcpClient())
        {
            client.Connect(IPAddress.Parse(ip), 44451);
            //Console.WriteLine(ip);
            NetworkStream nwStream = client.GetStream();
            MemoryStream ms = new MemoryStream();
            Image x = Image.FromFile(file);
            x.Save(ms, x.RawFormat);
            byte[] bytesToSend = ms.ToArray();
            nwStream.Write(bytesToSend, 0, bytesToSend.Length);
            nwStream.Flush();
            client.Close();
        }
    }

,我正在用此

在另一端接收该文件
            NetworkStream nwStream = clientCopy.GetStream();
        byte[] buffer = new byte[clientCopy.ReceiveBufferSize];

        //---read incoming stream---
        int bytesRead = nwStream.Read(buffer, 0, clientCopy.ReceiveBufferSize);

MemoryStream ms = new MemoryStream(buffer);
            Image returnImage = Image.FromStream(ms);
            //ms.Flush();
            //ms.Close();
            String path;
            if (!Directory.Exists(path = @"C:UsersacerAppDataRoamingtest"))
            {
                Directory.CreateDirectory(@"C:UsersacerAppDataRoamingtest");
            }
            string format;
            if (ImageFormat.Jpeg.Equals(returnImage.RawFormat))
            {
                format = ".jpg";
            }
            else if (ImageFormat.Png.Equals(returnImage.RawFormat))
            {
                format = ".png";
            }
            else
            {
                format = ".jpg";
            }
            returnImage.Save(@"C:UsersacerAppDataRoamingtestdefault_pic" + format, returnImage.RawFormat);

如果我发送的图片很小(周围< 20kb(在另一端收到文件100%,但是如果我在> = 100kb附近发送文件,则收到图像的一半,但只有一半已加载。我知道阅读流的方法直到所有数据都读取,但我不知道如何正确实施。

谢谢

您只调用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如上上述是最简单的选项。(

TCP协议(像任何其他流协议一样(无法按原样传输数据。在大多数情况下,不可能知道所有数据是否到达,还是收到无关数据的数据以及预期的数据。因此,几乎总是需要定义基础协议,例如,通过发送消息标头(例如在HTTP中(或定义消息分离器(例如Telnet中的换行符;但是,将分隔符用于大尺寸消息是不切实际的(。在最简单的情况下,它足以定义仅包含消息长度的非常简单的标头

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

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

相关内容

  • 没有找到相关文章

最新更新