如何在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
相关产品推荐
相关产品推荐

