通过socket c#发送base64字符串

时间:2018-04-27 12:32:42

标签: c# sockets base64

我试图发送base64编码的图像。

客户代码:

private void button1_Click(object sender, EventArgs e)
    {
        IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse(ip), port);
        client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        client.Connect(ipEndPoint);
        Bitmap printScreen = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
        Graphics g = Graphics.FromImage(printScreen as Image);
        g.CopyFromScreen(0, 0, 0, 0, printScreen.Size);
        MemoryStream ms = new MemoryStream();
        printScreen.Save(ms, ImageFormat.Jpeg);
        client.Send(Encoding.UTF8.GetBytes(Convert.ToBase64String(ms.ToArray())));
        client.Shutdown(SocketShutdown.Both);
    }

服务器代码:

const int BUFFER_SIZE = 2048;
static byte[] buffer = new byte[BUFFER_SIZE];
static void ReceiveCallback(IAsyncResult AR)
    {
        Socket current = (Socket)AR.AsyncState;
        int received = current.EndReceive(AR);
        if (received > 0)
        {
            s += Encoding.UTF8.GetString(buffer);
            current.BeginReceive(buffer, 0, BUFFER_SIZE, SocketFlags.None, ReceiveCallback, current);
        } else
        {
            Console.WriteLine(s.Length);
            var bytes = Convert.FromBase64String(s);
            using (var imageFile = new FileStream("test.jpg", FileMode.Create))
            {
                imageFile.Write(bytes, 0, bytes.Length);
                imageFile.Flush();
            }
            s = "";
        }
    }

但图片通常不会传输。 通常会发生此错误: "输入数据无效Base-64字符串"。

如何解决这个问题? 非常感谢!

1 个答案:

答案 0 :(得分:2)

received告诉您缓冲区中有多少字节当前有效。您GetString的重载使用了缓冲区中所有字节的转换。

您可以切换到传递显式索引和计数:

s += Encoding.UTF8.GetString(buffer,0,received);

另请注意,您使用的此技术通常不安全,但应该适用于base-64字符子集。并非所有UTF-8字符都占用一个字节,并且TCP不能保证您不会只获得Receive一次调用返回的字符的部分,而剩下的字节为这个角色将在下次通话时被提供(希望 1 )。

(而且Matthew关于这一切的评论都很奇怪,因为你也可以直接发送字节)

1 我不是说这里的字节会丢失。仅此处提供的保证很少,因此您无法保证下一个呼叫将接收该字符剩余字节的所有