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

时间:2012-09-27 13:23:28

标签: c# java sockets tcp corrupt

我用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”

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

我100%确定字符串在Java应用程序发送之前始终完成。

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

1 个答案:

答案 0 :(得分:3)

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