问题描述
我正在尝试使用tcpclient从tcp服务器检索数据,发送请求和接收响应,除了一件事之外,它都可以正常工作。 当我尝试多次使用 networkstream.readasync 然后 networkstream.writeasync 时,readasync函数读取的是先前writeasync的上一个响应而不是最后一个。我必须设置超时时间才能阅读。除了设置超时之外,还有什么方法可以等待直到新数据可用?
伪代码示例:
connectasync(host,port);
//reads a hello message from the server
networkstram.readasync();
//sending a request to the server
networkstram.writeasync();
//reads again the hello message from the previous read
//not the response from the previously sended writeasync
networkstram.readasync()
伪代码解决方案:
connectasync(host,port);
//reads a hello message from the server
networkstram.readasync();
//sending a request to the server
networkstram.writeasync();
//wait for 1 second
wait(1000)
//reads correctly
networkstram.readasync()
如果您有更好的方法等待新的可用数据,而不是使用固定的超时时间,请告诉我。 谢谢。
更新 注意:我什至尝试了同步版本的读写操作。 我只是使用异步来阻止用户界面。
public async Task<string> sendQuery()
{
try
{
client.Connect(ConfigParameters.ip,ConfigParameters.port);
if (client.Connected == true)
{
Console.WriteLine("Connected");
var networkStream = client.GetStream();
// Receive data from server
//Receiving HELLO message from the server
byte[] buffer = new byte[1024];
await networkStream.ReadAsync(buffer,buffer.Length);
var serverResponse = Encoding.ASCII.GetString(buffer);
Console.WriteLine("Server: " + serverResponse);
Array.Clear(buffer,buffer.Lenght);
Array.Resize(ref buffer,1024);
// Send data to server
// send query to the server
string data = QueryStore.queryStart+QueryStore.query1.getLRC() + QueryStore.queryEnd;
buffer = System.Text.Encoding.ASCII.GetBytes(data);
await networkStream.WriteAsync(buffer,buffer.Length);
Array.Clear(buffer,1024);
// Receive data from server
// receive still HELLO message
buffer = new byte[1024];
await networkStream.ReadAsync(buffer,buffer.Length);
serverResponse = Encoding.ASCII.GetString(buffer);
Console.WriteLine("Server: " + serverResponse);
networkStream.Close();
client.Close();
return "ok";
}
}
catch(SocketException)
{
client.Close();
return "error";
}
finally
{
client.Close();
return "";
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)