我有两种方法:DataAvailable是假的,但更多的数据应该已被送往
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;
}
出于某种原因,DataAvailable是ProcessRemoteQuery假的,意思是stream.Read()从不返回并阻止我的应用程序。奇怪的是,这只是第二次发生,所以我第一次ProcessRemoteQuery工作正常,但第二次永远不会。这里的代码有bug吗?我没有包含实际初始化客户端的代码,但我向你保证它已完成。 ListenForConnection似乎应该每次都返回数据?任何帮助表示赞赏,谢谢。
“ListenForConnection”中仍然存在一个错误 - 没有套接字代码应该忽略来自'Read'的返回值。您可能只收到一个字节。在一方'写'和另一方'读'之间没有关联。如果你想要*消息传递*,那么实现它(即固定大小的消息,某种类型的帧等)或者移动到比TCP更高级别的抽象(这只是“字节流”)就取决于你。 –