首先,如果我的任何代码没有意义,我会道歉,因为我对编码很新,现在在大学。
无论如何,我的问题如上所述。
我在我的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);
}
我第一次将请求发送到服务器以获取此数据它按预期工作但第二次我请求数据我沿途松散随机数据串,第一次始终完美地工作但我收到所有字符串所以我不确定发生了什么。
让我们做一些分析......
return
。如果您不使用while循环,那么您将无法从服务器接收新数据。如果要将数据视为单独的消息,则需要了解消息大小并以不同方式处理每种情况。数据小于缓冲区大小 - 您需要继续等待传入数据。数据大于缓冲区大小 - 您需要读取整个消息。等等。