在tcp从python服务器传输到c#客户端期间丢失数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在tcp从python服务器传输到c#客户端期间丢失数据相关的知识,希望对你有一定的参考价值。
首先,如果我的任何代码没有意义,我会道歉,因为我对编码很新,现在在大学。
无论如何,我的问题如上所述。
我在我的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);
}
我第一次将请求发送到服务器以获取此数据它按预期工作但第二次我请求数据我沿途松散随机数据串,第一次始终完美地工作但我收到所有字符串所以我不确定发生了什么。
答案
让我们做一些分析......
- 您将一些数据从服务器发送到客户端,该数据小于缓冲区的大小。你读它,就是这样。你在asynccallback函数中调用
return
。如果您不使用while循环,那么您将无法从服务器接收新数据。 - 您将两条消息从服务器发送到客户端。这两条消息在同一个缓冲区中,因为它们的总和大小小于缓冲区大小。您使用您的方法将它们视为一个,并且您的数据已损坏,因为您不知道数据大小。
如果要将数据视为单独的消息,则需要了解消息大小并以不同方式处理每种情况。数据小于缓冲区大小 - 您需要继续等待传入数据。数据大于缓冲区大小 - 您需要读取整个消息。等等。
以上是关于在tcp从python服务器传输到c#客户端期间丢失数据的主要内容,如果未能解决你的问题,请参考以下文章