偶尔以错误的顺序接收TCP数据并且不完整

我用Java创建了TCP Server应用程序,用C#创建了一个客户端应用程序。 当我发送数据时,客户端有时会无序地接收数据,有时会完全丢失部分。 基本上,我在服务器(java)中使用的代码看起来像这样(剥离):

ServerSocket welcomeSocket = new ServerSocket(port); Socket connectionSocket = welcomeSocket.accept(); outputStream = new DataOutputStream(socket.getOutputStream()); //Create stream outputStream.writeBytes(message + "\n"); outputStream.flush(); 

我使用“\ n”作为分隔符。 在客户端(C#)我使用以下代码:

 private const char Delimiter = '\n'; tcpclnt = new TcpClient(); tcpclnt.NoDelay = true; tcpclnt.Client.DontFragment = true; tcpclnt.Connect(ip, port); //This function is executed in a separate thread public void Receive() { try { stream = tcpclnt.GetStream(); streamreader = new StreamReader(stream); this.Connected = true; while (Connected) { string line = ReadLine(streamreader); Console.WriteLine("Received data: " + line); } } } private string ReadLine(StreamReader reader) { bool finished = false; string line = ""; while (finished == false) { int asciiNumber = reader.Read(); char character = Convert.ToChar(asciiNumber); if (!character.Equals(Delimiter)) line += character; else finished = true; } return line; } 

代码不是很复杂。 但是,从服务器发送的数据并不总是在客户端中正确接收。 举个例子,我应该收到以下两个字符串:“5_8_1”和“6_LEVELDATA”

然而,我(有时)得到的是:“5_8_61”和“_LEVELDATA”

另一个例子:“5_4_1”和“6_LEVELDATA”产生一个单独的字符串:“5_6_LEVELDATA”

这似乎是一个小问题,但实际上它确实毁了我的应用程序。 我已经阅读了很多post,但我读过的唯一答案是“这不应该发生在TCP上”或“首先发送tcp消息的长度”,这在任何情况下都无济于事,因为问题不在于此数据被分成多个包,它只是没有按正确的顺序到达,这是TCP应该做的事情。

我100%确定字符串在Java应用程序发送之前总是完整的。

我真的很想知道我在这里做错了什么。 我的代码中有什么东西搞糟了吗? 我很感激这个问题的任何帮助。 提前致谢。

在尝试Wireshark之​​后,看来我的问题存在于服务器中。 显然,每个TCP消息都是在一个单独的线程中发送的。 感谢您的所有评论! 我的问题现在解决了。