gpt4 book ai didi

c# - 偶尔接收到的TCP数据顺序错误,不完整

转载 作者:可可西里 更新时间:2023-11-01 02:34:03 24 4
gpt4 key购买 nike

我已经用 Java 创建了 TCP 服务器应用程序,并用 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”

这似乎是个小问题,但实际上它几乎毁了我的应用程序。我读了很多帖子,但我读到的唯一答案是“这不应该发生在 TCP”或“首先发送 tcp 消息的长度”,这在这种情况下没有任何帮助,因为问题是数据被分割成多个包,它根本没有以正确的顺序到达,而这是 TCP 应该做的事情。

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

我真的很想知道我在这里做错了什么。我的代码有什么问题吗?对于这个问题的任何帮助,我将不胜感激。提前致谢。

最佳答案

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

关于c# - 偶尔接收到的TCP数据顺序错误,不完整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12622435/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com