gpt4 book ai didi

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

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

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

无论如何,我的问题与描述的一样。

我的 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. 您从服务器向客户端发送一些小于缓冲区大小的数据。你读了它,仅此而已。您在 asynccallback 函数中调用 return。如果您不使用 while 循环,那么您将无法从服务器接收新数据。

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

如果您想将数据视为单独的消息,您需要知道消息大小并以不同方式处理每种情况。数据小于缓冲区大小 - 您需要继续等待传入数据。数据大于缓冲区大小——您需要阅读整条消息。等等。

关于c# - 在从 python 服务器到 c# 客户端的 tcp 传输期间丢失数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47858503/

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