在tcp从python服务器传输到c#客户端期间丢失数据

时间:2017-12-17 19:07:41

标签: c# python sockets tcp asyncore

首先,如果我的任何代码没有意义,我会道歉,因为我对编码很新,目前在大学。

我的问题如上所述。

我在我的python服务器中有这个代码来发送从我的本地oracle服务器收集的数据:

            query = "SELECT * FROM DATABASE"
            cursor.execute(query)
            for row in cursor:
                for cell in row:
                    cellF = str.format("{0}$",cell)
                    self.send(cellF.encode())

此代码用于在我的C#客户端上接收数据:

public void Read()
    {
        var buffer = new byte[1024];
        var stream = client.socket.GetStream();

        stream.BeginRead(buffer, 0, buffer.Length, EndRead, buffer);
    }

    public void EndRead(IAsyncResult result)
    {
        var stream = client.socket.GetStream();
        int endBytes = stream.EndRead(result);

        if (endBytes == 0)
        {
            return;
        }

        var buffer = (byte[])result.AsyncState;
        string data = Encoding.ASCII.GetString(buffer, 0, endBytes);
        SetRecieved(data);

        stream.BeginRead(buffer, 0, buffer.Length, EndRead, buffer);
    }

修订: 我意识到我有一些misc代码,所以我删除它,现在它一直工作,但只有当方法第二次运行时。

    public void Read()
    {
        while (client.stream.DataAvailable)
        {
            client.stream.BeginRead(client.buffer, 0, client.buffer.Length, EndRead, client.buffer);
        }
    }

    public void EndRead(IAsyncResult result)
    {
        var stream = client.socket.GetStream();
        int endBytes = stream.EndRead(result);

        var buffer = (byte[])result.AsyncState;
        string data = Encoding.ASCII.GetString(buffer, 0, endBytes);
        SetRecieved(data);
    }

我第一次将请求发送到服务器以获取此数据时,它按预期工作,但第二次我请求数据我沿途丢失了随机数据串,第一次始终完美地工作然而我收到所有字符串所以我不确定发生了什么。

1 个答案:

答案 0 :(得分:0)

让我们做一些分析......

  1. 您将一些数据从服务器发送到客户端,该数据小于缓冲区的大小。你读它,就是这样。您在asynccallback函数中调用return。如果您不使用while循环,那么您将无法从服务器接收新数据。

  2. 您从服务器向客户端发送两条消息。这两条消息在同一个缓冲区中,因为它们的总和大小小于缓冲区大小。您使用您的方法将它们视为一个,并且您的数据已损坏,因为您不知道数据大小。

  3. 如果您希望将数据视为单独的邮件,则需要了解邮件大小并以不同方式处理每种情况。数据小于缓冲区大小 - 您需要继续等待传入数据。数据大于缓冲区大小 - 您需要读取整个消息。等等。