【问题标题】:C# Sending image on tcp client/serverC# 在 tcp 客户端/服务器上发送图像
【发布时间】:2013-07-25 11:17:15
【问题描述】:
  im trying to make a client and server that the server sends image to the client

到目前为止,只能发送一张图像,而其他图像未被神秘错误接受 我试图找出错误但没有运气... 这是服务器代码: 公共无效发送图像(图像img) {

        TcpClient tempClient = _Client;

        if (tempClient.Connected) //If the client is connected
        {
            NetworkStream stream = tempClient.GetStream();
            Bitmap bmp = new Bitmap(img);
            BinaryWriter bw = new BinaryWriter(stream);
            MemoryStream ms = new MemoryStream();
            bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
            byte[] buffer = ms.ToArray();
          byte[] lengthbts=  Get8LengthByte(buffer);
          stream.Write(lengthbts,0,8);
          stream.Write(buffer, 0, buffer.Length );
          stream.Flush();
        //   bw.Close();



        }

    }
    byte[] Get8LengthByte(byte[] bytes)
    {
        string length = bytes.Length.ToString();
        while (length.Length < 8)
        {
            length = "0" + length;
        }
        return Encoding.Default.GetBytes(length);
    }

这是客户端代码

       NetworkStream stream = client.GetStream();
            //Bitmap bmp = new Bitmap(img);
            BinaryReader br = new BinaryReader(stream);
            byte[] datalen = new byte[8];
            br.Read(datalen, 0, 8);
            string lenStr = (Encoding.Default.GetString(datalen));
            int len = int.Parse(lenStr);//BitConverter.ToInt32(datalen, 0);//
            Console.WriteLine(len);
            byte[] buffer = new byte[len];
            br.Read(buffer, 0, buffer.Length);
              MemoryStream ms = new MemoryStream(buffer, 0, buffer.Length);
            ms.Position = 0;
            Image img = Image.FromStream(ms);
            Invoke(new MethodInvoker(delegate()
            {
                pictureBox1.Image = img;
            }
            ));

这个想法是首先发送图片字节的长度为8字节长度 例如,如果字节长度为 10,则 8 字节长度为“00000010” 收到的第一张图片非常好而且很快 但是第二个返回一个错误,可以使 8 字节长度为整数,收到的 byte[] 更像“?///???”和类似的东西,如果有人能帮我弄清楚,我将非常感激

【问题讨论】:

    标签: c# image sockets send


    【解决方案1】:

    很难说。我可以建议的一件事是:如果您获得正确的长度值并且文件大> 4K,那么您应该继续阅读直到长度完成, 例如:

    int offset=0;
    int bLeft=len;
    byte[] buffer = new byte[len];
    while (bLeft > 0)
    {
        int ret = br.read(buffer, offset, bLeft);
        if (ret > 0)
        {
             bLeft-=ret;
             offset+=ret; 
        }
        else if (ret == 0) 
        {
            // the socket has been closed
        }
        else {
           // there is an error in the socket
        }
    }
    

    如果您的问题是发送文件的长度,我不会弄乱字符串和编码,只需发送 4 个字节并读取 4 个字节,就像这样

        byte[] bLength = new byte[4];
        int len = 123456;
        bLength[0] = (byte)((len & 0xff000000) >> 24);
        bLength[1] = (byte)((len & 0x00ff0000) >> 16);
        bLength[2] = (byte)((len & 0x0000ff00) >> 8);
        bLength[3] = (byte)(len & 0xff);
        // Send 4 bytes
    
        // Read only 4 bytes
        byte[] buff = new byte[4];
        br.read(buff, 0, 4);
        int length = (int)(buff[0] << 24) | (int)(buff[1] << 16) | (int)(buff[2] << 8) | buff[3];
    

    【讨论】:

    • 非常感谢它的工作可能流没有读取整个图像字节并且错过了很多谢谢!
    猜你喜欢
    • 2019-03-12
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多