[英]C# Sending image on tcp client/server
im trying to make a client and server that the server sends image to the client
到目前为止,仅可能发送一个图像,而其他的则不被神秘的错误所接受,我试图找出错误但没有运气...这是服务器代码:public void SendImage(Image img){
TcpClient tempClient = _Client;
if (tempClient.Connected) //If the client is connected
{
NetworkStream stream = tempClient.GetStream();
Bitmap bmp = new Bitmap(img);
BinaryWriter bw = new BinaryWriter(stream);
MemoryStream ms = new MemoryStream();
bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
byte[] buffer = ms.ToArray();
byte[] lengthbts= Get8LengthByte(buffer);
stream.Write(lengthbts,0,8);
stream.Write(buffer, 0, buffer.Length );
stream.Flush();
// bw.Close();
}
}
byte[] Get8LengthByte(byte[] bytes)
{
string length = bytes.Length.ToString();
while (length.Length < 8)
{
length = "0" + length;
}
return Encoding.Default.GetBytes(length);
}
这是客户代码
NetworkStream stream = client.GetStream();
//Bitmap bmp = new Bitmap(img);
BinaryReader br = new BinaryReader(stream);
byte[] datalen = new byte[8];
br.Read(datalen, 0, 8);
string lenStr = (Encoding.Default.GetString(datalen));
int len = int.Parse(lenStr);//BitConverter.ToInt32(datalen, 0);//
Console.WriteLine(len);
byte[] buffer = new byte[len];
br.Read(buffer, 0, buffer.Length);
MemoryStream ms = new MemoryStream(buffer, 0, buffer.Length);
ms.Position = 0;
Image img = Image.FromStream(ms);
Invoke(new MethodInvoker(delegate()
{
pictureBox1.Image = img;
}
));
想法是先发送图片字节的长度作为8字节长度,例如,如果字节长度为10,则8字节长度为“ 00000010”,则接收到的第一个图像非常好且快速,但是第二个返回的错误可以使8字节长度为整数,使byte []收到的内容更像是“?/// ???” 诸如此类的事情,如果有人可以帮助我弄清楚,我将非常感激
很难说。 我可以建议的一件事是:如果长度值正确,并且文件大于4K,则应继续读取直到长度结束,例如:
int offset=0;
int bLeft=len;
byte[] buffer = new byte[len];
while (bLeft > 0)
{
int ret = br.read(buffer, offset, bLeft);
if (ret > 0)
{
bLeft-=ret;
offset+=ret;
}
else if (ret == 0)
{
// the socket has been closed
}
else {
// there is an error in the socket
}
}
如果您的问题是发送文件的长度,那么我不会弄乱字符串和编码,只需发送4个字节并读取4个字节,就像这样
byte[] bLength = new byte[4];
int len = 123456;
bLength[0] = (byte)((len & 0xff000000) >> 24);
bLength[1] = (byte)((len & 0x00ff0000) >> 16);
bLength[2] = (byte)((len & 0x0000ff00) >> 8);
bLength[3] = (byte)(len & 0xff);
// Send 4 bytes
// Read only 4 bytes
byte[] buff = new byte[4];
br.read(buff, 0, 4);
int length = (int)(buff[0] << 24) | (int)(buff[1] << 16) | (int)(buff[2] << 8) | buff[3];
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.