2016-09-17 5 views
0

В моем приложении я хотел реализовать изображения профиля, поэтому я начал со стандартного изображения, которое я преобразовал в массив байтов, а затем в строку base64, однако, когда клиент запрашивает строку из сервер он не полностью прибывает, сервер читает всю строку из базы данных и отправляет ее клиенту, клиент получает только часть строки, это строка (она должна была использовать pastebin): http://pastebin.com/ZmHhsZgG И это строка клиент получает: iVBORw0KGgoAAAANSUhEUgAAAEA Это как сервер получает из базы данных:Отправка базовых конусов соломы base64 полностью не прибывает

public string GetPP(string user) 
    { 
     CONN = new MySqlConnection(); 
     CONN.ConnectionString = Config.CONNSTRING; 
     string query = "select * from members where username='" + user + "'"; 
     try 
     { 
      CONN.Open(); 
      COMMAND = new MySqlCommand(query, CONN); 
      READER = COMMAND.ExecuteReader(); 
      string p = null; 
      while (READER.Read()) 
      { 
       return p = READER.GetString("profilepic"); 
      } 
      return p; 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
      return ""; 
     } 
     finally 
     { 
      CONN.Dispose(); 
     } 
    } 

затем отправляет его:

private void Do() 
    { 
     int requestCount = 0; 
     byte[] bytesFrom = new byte[20025]; 
     string dataFromClient = null; 
     Byte[] sendBytes = null; 
     string serverResponse = null; 
     string rCount = null; 
     requestCount = 0; 
     Responder.Responder R = new Responder.Responder(); 
     while ((true)) 
     { 
      try 
      { 
       byte[] buffer = new byte[4]; 
       requestCount = requestCount + 1; 
       NetworkStream networkStream = clientSocket.GetStream(); 
       buffer = new byte[4]; 
       int readBytes = networkStream.Read(buffer, 0, 4); 
       if (readBytes == 0) 
        break; 
       int MessageSize = BitConverter.ToInt32(buffer, 0); 
       byte[] bufferreader = new byte[MessageSize]; 
       readBytes = networkStream.Read(bufferreader, 0, MessageSize); 
       if (readBytes == 0) 
        break; 
       dataFromClient = Encoding.ASCII.GetString(bufferreader); 
       rCount = Convert.ToString(requestCount); 
       byte[] outbuffer = new byte[4]; 
       serverResponse = R.Respond(dataFromClient); 
       sendBytes = Encoding.ASCII.GetBytes(serverResponse); 
       outbuffer = new byte[4]; 
       outbuffer = BitConverter.GetBytes(sendBytes.Length); 
       networkStream.Write(buffer, 0, 4); 
       networkStream.Flush(); 
       networkStream.Write(sendBytes, 0, sendBytes.Length); 
       networkStream.Flush(); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(" >> " + ex.ToString()); 
      } 
     } 
     Console.WriteLine("User Server >> " + "Client No:" + Convert.ToString(clNo) + " Stopped!"); 
    } 

И клиент получает:

  byte[] inbuffer = new byte[4]; 
      buffer = new byte[4]; 
      int readBytes = serverStream.Read(buffer, 0, 4); 
      int MessageSize = BitConverter.ToInt32(buffer, 0); 
      Console.WriteLine(Convert.ToString(MessageSize)); 
      byte[] bufferreader = new byte[MessageSize]; 
      readBytes = serverStream.Read(bufferreader, 0, MessageSize); 
      string dataFromServer = Encoding.ASCII.GetString(bufferreader); 
      if (dataFromServer.Contains("reauth")) 
      { 
       MessageBox.Show("Session Expired! Please Re-authenticate.."); 
       this.Close(); 
      } 
      else 
      { 
       richTextBox1.Text = dataFromServer; //used to see what it receives 
       MemoryStream mStream = new MemoryStream(); 
       byte[] pData = Convert.FromBase64String(dataFromServer); 
       mStream.Write(pData, 0, Convert.ToInt32(pData.Length)); 
       Bitmap bm = new Bitmap(mStream, false); 
       mStream.Dispose(); 
       pictureBox1.Image = bm; 
      } 
      clientSocket.Close(); 

Заранее спасибо

+0

Какова переменная «буфер» в коде сервера? можете ли вы показать этот код? –

+0

Да, простите, весь код для этой части –

+0

Вы сохраняете возвращаемое значение из 'NetworkStream.Read()', но все же вы, кажется, думаете, что все получено в одном вызове 'Read()'. Вы должны проверить значение 'readBytes' и продолжать читать, пока не прочитаете достаточное количество байтов. –

ответ

1

Я думаю, что данные не в полной мере чтения, так как «буфер» переменную, вы посылаете как индикатор длины не инициализируется к обновленному значению. Я предполагаю, что вы хотели бы отправить было:

serverResponse = R.Respond(dataFromClient); 
sendBytes = Encoding.ASCII.GetBytes(serverResponse); 
outbuffer = new byte[4]; 
outbuffer = BitConverter.GetBytes(sendBytes.Length); 
**networkStream.Write(outbuffer , 0, 4);** 
networkStream.Flush(); 
networkStream.Write(sendBytes, 0, sendBytes.Length); 
networkStream.Flush(); 
+0

Он также ожидает, что все будет принято в одном вызове 'Read()'. Не могли бы вы накрыть это и в своем ответе? :) –

+0

Да, вы правы, сейчас это работает, черт возьми, это было действительно глупо от меня, как я пропустил это, но спасибо :) –

+0

Я вижу два чтения. –

0

метод NetworkStream.Read возвращает количество байт, успешно read.If вы хотите прочитать всю информацию, вы должны прочитать несколько times.You могут попытаться следовать кодам:

private int read(NetworkStream ns, Byte[] data_buffer) 
    { 
     int result = -1; 

     const int kBufferSize = 1024 * 1024; 
     Byte[] buffer = new Byte[kBufferSize]; 
     int read_size = 0; 
     int real_read_size = 0; 
     int read_length; 
     int total_length; 

     if (ns != null && data_buffer != null) 
     { 
      try 
      { 
       total_length = data_buffer.Length; 
       read_size = 0; 
       real_read_size = 0; 
       read_length = 0; 

       while (true) 
       { 
        read_size = kBufferSize <= (total_length - read_length) ? kBufferSize : total_length - read_length; 
        //todo:if (ns.CanRead) 
        real_read_size = ns.Read(buffer, 0, read_size); 


        if (real_read_size > 0) 
        { 
         Array.Copy(buffer, 0, data_buffer, read_length, real_read_size); 

         read_length += real_read_size; 

         //Console.WriteLine("net Read " + read_length.ToString() + " byte!"); 

         if (read_length >= total_length) 
         { 
          result = 0; 
          break; 
         } 
        } 
        else 
        { 
         Console.WriteLine("net Read 0 byte!"); 
         result = -1; 
         break; 
        } 
       } 



      } 
      catch (IOException e) 
      { 
       Console.WriteLine("SocketException: {0}", e); 
      } 
      finally 
      { 

      } 
     } 

     return result; 
    }