2016-09-17 3 views
0

In meiner Anwendung wollte ich Profilbilder zu implementieren, also habe ich mit einem Standardbild, das ich in ein Byte - Array und dann Base64 - String konvertiert, aber wenn der Client die Zeichenfolge aus dem angefordert Server es nicht vollständig ankommt, liest der Server die gesamte Zeichenfolge aus der Datenbank und sendet es an den Client, der Client erhält nur einen Teil der Zeichenfolge, das ist die Zeichenfolge (musste Pastebin verwenden): http://pastebin.com/ZmHhsZgG Und das ist die Zeichenfolge der Kunde erhält: iVBORw0KGgoAAAANSUhEUgAAAEA Dies ist, wie der Server aus der Datenbank bekommt:Das Senden von Base64 - String - Trog Sockets kommt nicht vollständig

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(); 
     } 
    } 

dann sendet er:

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!"); 
    } 

Und der Kunde erhält:

  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(); 

Vielen Dank im Voraus

+0

Was hält die Variable 'buffer' im Servercode? Kannst du diesen Code zeigen? –

+0

Ja, sorry, der gesamte Code für diesen speziellen Teil wurde angehängt –

+0

Sie speichern den Rückgabewert von 'NetworkStream.Read()', aber Sie scheinen zu glauben, dass alles in einem einzigen 'Read() 'Aufruf empfangen wird. Sie müssen den Wert von 'readBytes' überprüfen und weiterlesen, bis Sie die ausreichende Anzahl an Bytes gelesen haben. –

Antwort

1

ich die Daten denke nicht vollständig gelesen wird, weil der ‚Puffer‘ Variable, die Sie als der Längenindikator senden nicht initialisiert zu einem aktualisierten Wert. Ich denke, was Sie wollten, war senden:

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

Er erwartet auch, dass alles in einem einzigen 'Read()' Anruf empfangen wird. Könnten Sie das auch in Ihrer Antwort behandeln? :) –

+0

Ja du hast Recht, es funktioniert jetzt, verdammt das war wirklich dumm von mir, wie habe ich das vermisst, aber danke :) –

+0

Ich sehe zwei Leseanrufe .. –

0

NetworkStream.Read Methode gibt die Anzahl der Bytes erfolgreich read.If Sie gesamten Daten lesen möchten, müssen Sie times.You versuchen Codes folgen können mehrere lesen:

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; 
    }