2013-07-25 84 views
0
im trying to make a client and server that the server sends image to the client 

到目前为止,它可能只发送一个图像和其他人的arent神秘的错误 接受我试图找出错误,但没有运气... 这是服务器代码: 公共无效SendImage(图像张图片) {C#TCP客户端发送图像/服务器

 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字节长度为整数字节[]收到更像“/// ???”和类似的东西,如果有人可以帮助我的数字出来,我将非常感激

回答

1

这很难说。有一件事我可以建议是:如果你得到的长度值正确,该文件是大> 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]; 
+0

非常感谢你,它可能工作流didnt读取整个图像字节和missedmuch它的谢谢! –

相关问题