TCP数据顺序错误和不完整的偶尔接收(TCP data occasionally received

2019-09-23 03:16发布

我已经在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报文首的长度”,这将不会在这种情况下,任何帮助,因为这个问题ISN “T数据在多个包被分裂,它根本不按照正确的顺序,这是一件好事TCP应该做的到位。

我100%肯定的字符串始终完全是由Java应用程序发送之前。

我真的不知道我在做什么错在这里。 有什么事搞砸了不好的在我的代码? 我很感激这个问题的任何帮助。 提前致谢。

Answer 1:

Wireshark的努力后,它会出现在服务器中存在我的问题。 显然,每一个TCP消息是在一个单独的线程中发送。 感谢您对所有您的意见! 我现在的问题就解决了。



文章来源: TCP data occasionally received in wrong order and incomplete