我试图发送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字符串"。
如何解决这个问题? 非常感谢!
答案 0 :(得分:2)
received
告诉您缓冲区中有多少字节当前有效。您GetString
的重载使用了缓冲区中所有字节的转换。
您可以切换到传递显式索引和计数:
s += Encoding.UTF8.GetString(buffer,0,received);
另请注意,您使用的此技术通常不安全,但应该适用于base-64字符子集。并非所有UTF-8字符都占用一个字节,并且TCP不能保证您不会只获得Receive
一次调用返回的字符的部分,而剩下的字节为这个角色将在下次通话时被提供(希望 1 )。
(而且Matthew关于这一切的评论都很奇怪,因为你也可以直接发送字节)
1 我不是说这里的字节会丢失。仅此处提供的保证很少,因此您无法保证下一个呼叫将接收该字符剩余字节的所有。