You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中通过Socket发送Base64字符串?

完整客户端实现代码

先把你的代码补全并优化,加入资源释放、异常处理和完整的Base64发送逻辑:

private void button1_Click(object sender, EventArgs e)
{
    // 替换成你的服务器IP和端口
    string serverIp = "127.0.0.1";
    int serverPort = 8888;

    // 所有资源用using自动释放,避免内存泄漏
    using (Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
    {
        try
        {
            // 连接服务器
            IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse(serverIp), serverPort);
            client.Connect(ipEndPoint);
            MessageBox.Show("已连接到服务器");

            // 1. 捕获全屏截图
            using (Bitmap printScreen = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height))
            using (Graphics g = Graphics.FromImage(printScreen))
            {
                g.CopyFromScreen(0, 0, 0, 0, printScreen.Size);

                // 2. 将Bitmap转为Base64字符串
                string base64Image;
                using (MemoryStream ms = new MemoryStream())
                {
                    // 用PNG格式保存,截图无压缩损失;如果要减小体积可以用ImageFormat.Jpeg并设置质量
                    printScreen.Save(ms, ImageFormat.Png);
                    byte[] imageBytes = ms.ToArray();
                    base64Image = Convert.ToBase64String(imageBytes);
                }

                // 3. 通过Socket发送Base64字符串
                byte[] sendData = Encoding.UTF8.GetBytes(base64Image);
                // 确保所有数据都发送完成(Socket.Send可能只发一部分)
                SendAll(client, sendData);

                MessageBox.Show("截图已发送");
            }
        }
        catch (SocketException ex)
        {
            MessageBox.Show($"连接或发送失败:{ex.Message}");
        }
        catch (Exception ex)
        {
            MessageBox.Show($"未知错误:{ex.Message}");
        }
        // client会在using结束后自动关闭
    }
}

// 辅助方法:确保Socket发送全部数据
private void SendAll(Socket socket, byte[] data)
{
    int totalSent = 0;
    while (totalSent < data.Length)
    {
        int sent = socket.Send(data, totalSent, data.Length - totalSent, SocketFlags.None);
        if (sent == 0)
        {
            throw new IOException("连接已断开");
        }
        totalSent += sent;
    }
}
关键步骤解析
  • 屏幕截图:你的原有代码已经实现了全屏捕获,这里用using包裹Bitmap和Graphics,确保使用后立即释放内存,避免长时间运行导致内存溢出。
  • 转Base64编码:通过MemoryStream将图片转为字节数组,再用Convert.ToBase64String生成Base64字符串。如果觉得Base64体积太大(比原字节数组大33%左右),可以直接发送图片字节数组,不用转Base64,能节省带宽。
  • Socket完整发送:Socket的Send方法不一定会一次性发送所有数据,所以写了SendAll辅助方法循环发送,直到全部字节都发送完成,避免数据截断。
潜在问题排查指南
  • 连接失败:检查服务器IP和端口是否正确,服务器是否在对应端口监听,本地/服务器防火墙是否允许该端口的TCP通信。
  • 发送后服务器收不到完整数据:大概率是没处理Send的返回值,一定要用类似SendAll的逻辑确保全部数据发送;另外服务器端也要对应实现完整接收逻辑(比如循环接收直到收到所有字节)。
  • 内存泄漏:所有实现了IDisposable的对象(Bitmap、Graphics、MemoryStream、Socket)必须用using包裹,或者手动调用Dispose(),否则会占用大量内存。
  • Base64字符串过大导致超时:全屏截图的Base64字符串可能非常大(比如4K屏截图转PNG后Base64可能超过10MB),建议先压缩图片:比如缩小分辨率、用JPG格式并设置压缩质量,或者直接发送图片字节数组代替Base64。
  • 服务器端解析失败:如果服务器接收后转图片出错,要检查编码是否一致(客户端用UTF-8转字节,服务器也要用UTF-8转回字符串),以及Base64字符串是否完整。

内容的提问来源于stack exchange,提问作者cosinusx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:08:40