Mein Szenario: Ich habe einen Asynchron-TCP-Server, die Verbindungen akzeptiert, und es antwortet mit dieser Methode auf Anfragen:TCP-Client manchmal nur ein Teil der Nachricht erhält
private void SendMessage(Client client, string message)
{
var buffer = Encoding.UTF8.GetBytes(message);
try
{
client.TCPClient.GetStream().Write(buffer, 0, buffer.Length);
}
catch (Exception ex) when (ex is InvalidOperationException || ex is System.IO.IOException)
{
RemoveClient(client);
Task exceptionHandler = Program.ExceptionHandler.Server(ex);
}
}
Und ich habe eine Anwendungs-Client, der erhält Daten mit dieser Methode:
private string GetMessage()
{
StringBuilder returndata = new StringBuilder();
NetworkStream clientStream = this.tcpClient.GetStream();
var sr = new StreamReader(clientStream, Encoding.UTF8);
int value;
while (sr.Peek() >= 0 || clientStream.DataAvailable)
{
value = sr.Read();
returndata.Append((char)value);
}
return returndata.ToString();
}
Meist I Objekte serialisiert mit JSON, senden und es hat bis jetzt gut funktioniert. Wenn ich den Client neu starte, ergreift es Daten vom Server, aber manchmal kommt nur ein Teil davon und die Anwendung stürzt mit ArgumentException bei JSON deserialize ab. Es ist seltsam, dass, wenn es passiert (zufällig) sr.Peek() = -1, aber clientStream.DataAvailable = true
Eine andere Information ist, dass immer, wenn es die readed Nachricht stürzt gleich ist.
Jeder konnte mir helfen, was dazu führen konnte, dass ich manchmal nur einen Teil der Nachricht nicht alle bekam?
Ein Schreibvorgang entspricht nicht einem Lesevorgang. Siehe letztes Beispiel [hier] (https://msdn.microsoft.com/en-us/library/system.net.sockets.socket (v = vs.110) .aspx) für ein Beispiel. Wenn Sie in msdn suchen, gibt es weitere Beispiele. – CodingYoshi
Related: [Unterbrochene TCP-Nachrichten] (https://stackoverflow.com/q/7257139). – dbc