【问题标题】:TCP data occasionally received in wrong order and incompleteTCP 数据偶尔接收顺序错误且不完整
【发布时间】:2012-09-27 13:23:28
【问题描述】:

我已经在 J​​ava 中创建了 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 应用程序发送之前始终是完整的。

我真的想知道我在这里做错了什么。我的代码中有什么不好的地方吗?我将不胜感激有关此问题的任何帮助。提前致谢。

【问题讨论】:

  • 好吧,我不想这么说,但是“这不应该发生在 TCP 上”。使用 Wireshark 查看网络流量时,您会看到什么?你在使用多个线程吗?
  • 这可能是多方面的,最好是 CodeCaster 所说的与 wireshark 核对。你也没有在java中指定你的Charset,在C#中你读的是int。
  • 您是否尝试过使用 StreamReader 的 ReadLine 方法而不是使用您自己的方法来读取行?
  • 是的,我有。我编写了一个自定义的 ReadLine 方法,以防止使用分隔符将 tcp 消息拆分为多个包。使用 StreamReader 的 ReadLine() 方法具有相同的结果。
  • CodeCaster 看来你是正确的。这实际上是线程的问题。谢谢大家!

标签: c# java sockets tcp corrupt


【解决方案1】:

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

【讨论】:

  • 换句话说,从一开始就没有“正确的顺序”之类的东西。
猜你喜欢
  • 1970-01-01
  • 2011-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-14
  • 2019-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多