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
Was hält die Variable 'buffer' im Servercode? Kannst du diesen Code zeigen? –
Ja, sorry, der gesamte Code für diesen speziellen Teil wurde angehängt –
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. –