我有这两种方法:
public QueryResult ListenForConnection()
{
if (!ServerStarted)
{
IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
Listener = new TcpListener(ipAddress, 4044);
Listener.Start();
ServerStarted = true;
while (true)
{
Thread.Sleep(10);
TcpClient tcpClient = Listener.AcceptTcpClient();
byte[] requestByteBuffer = new byte[1024];
NetworkStream stream = tcpClient.GetStream();
stream.Read(requestByteBuffer, 0, requestByteBuffer.Length);
string httpMessage = Encoding.ASCII.GetString(requestByteBuffer, 0, requestByteBuffer.Length);
Query query = JsonConvert.DeserializeObject<Query>(httpMessage);
QueryResult queryResult = QueryService.ExecuteQuery(query);
string queryResultJson = JsonConvert.SerializeObject(queryResult);
byte[] responseByteBuffer = new byte[1024];
responseByteBuffer = Encoding.ASCII.GetBytes(queryResultJson);
stream.Write(responseByteBuffer, 0, responseByteBuffer.Length);
stream.Flush();
}
}
else
{
return new QueryResult("Failed", null, null);
}
}
和
public QueryResult ProcessRemoteQuery(Query query)
{
Byte[] byteBuffer = new Byte[1024];
string jsonSerializedQuery = JsonConvert.SerializeObject(query);
byteBuffer = Encoding.ASCII.GetBytes(jsonSerializedQuery);
NetworkStream stream = Client.GetStream();
stream.Write(byteBuffer, 0, byteBuffer.Length);
stream.Flush();
Byte[] responseByteBuffer = new Byte[1024];
int responseBytes = stream.Read(responseByteBuffer, 0, responseByteBuffer.Length);
string jsonDeserializedQueryResult = Encoding.ASCII.GetString(responseByteBuffer, 0, responseBytes);
QueryResult response = JsonConvert.DeserializeObject<QueryResult>(jsonDeserializedQueryResult);
return response;
}
由于某种原因,ProcessAmoteQuery中的DataAvailable为false,这意味着stream.Read()永远不会返回并阻止我的应用程序。奇怪的是,这只是第二次发生,所以我第一次ProcessRemoteQuery工作正常,但第二次从来没有。这里的代码有错误吗?我没有包含实际初始化客户端的代码,但我向您保证已完成。似乎ListenForConnection每次都应该返回数据吗?感谢任何帮助。谢谢。
答案 0 :(得分:0)
所以我非常愚蠢,并且最近改变了这一点,以便客户端每次都不会连接。 Listener.AcceptTcpClient在发送第一条消息后正在等待一个新客户端,并且永远不会得到一个,阻止整个消息。