Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过套接字c发送base64字符串#_C#_Sockets_Base64 - Fatal编程技术网

C# 通过套接字c发送base64字符串#

C# 通过套接字c发送base64字符串#,c#,sockets,base64,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.

我正在尝试发送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字符串”

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

received
告诉您缓冲区中当前有效的字节数。您正在使用的
GetString
重载将转换缓冲区中的所有字节

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

s += Encoding.UTF8.GetString(buffer,0,received);
另外,请注意,您使用的这种技术通常不安全,但应该适用于base-64字符子集。并非所有UTF-8字符都占用一个字节,TCP不能保证您不会只获得一次调用
Receive
返回的字符的一部分,而该字符的剩余字节将被下一次调用删除(可能是1)

(马修对此的评论很奇怪,因为你也可以直接发送字节)



1我在这里不是说字节会丢失。这里提供的保证很少,因此不能保证下一次调用将接收该字符的所有剩余字节。

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

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

s += Encoding.UTF8.GetString(buffer,0,received);
另外,请注意,您使用的这种技术通常不安全,但应该适用于base-64字符子集。并非所有UTF-8字符都占用一个字节,TCP不能保证您不会只获得一次调用
Receive
返回的字符的一部分,而该字符的剩余字节将被下一次调用删除(可能是1)

(马修对此的评论很奇怪,因为你也可以直接发送字节)



1我在这里不是说字节会丢失。只是这里提供的保证很少,所以不能保证下次调用会收到该字符的所有剩余字节。

为什么?Base64不仅仅是发送它编码的字节。当你可以发送原始二进制数据时,你到底为什么要发送Base64呢?我知道。只是具体的任务,为什么?Base64不仅仅是发送它编码的字节。当你可以发送原始二进制数据时,你到底为什么要发送Base64呢?我知道。只是特定的任务。它在OP的示例中起作用,因为base64只使用ASCII字符,但一般来说,您不应该在每次接收时解码UTF-8数据,请确保您先接收完所有UTF-8字节,然后一次解码(除非您使用一个在接收字节时可以将字节推入的流式解码器,
编码
类不是流式解码器)。在OP的示例中,数据的EOF是一个断开连接,因此将接收到的字节按原样附加到一个不断增长的
字节[]
缓冲区或流中,然后调用
编码.UTF8.GetString()
仅当断开连接时才在该缓冲区/流上它在OP的示例中起作用,因为base64仅使用ASCII字符,但通常不应在每次接收时解码UTF-8数据,请确保先接收完所有UTF-8字节,然后一次解码(除非您使用一个在接收字节时可以将字节推入的流式解码器,
编码
类不是流式解码器)。在OP的示例中,数据的EOF是一个断开连接,因此将接收到的字节按原样附加到一个不断增长的
字节[]
缓冲区或流中,然后调用
编码.UTF8.GetString()
仅当达到断开连接时才在该缓冲区/流上