【发布时间】:2016-06-24 19:07:49
【问题描述】:
我有这两种方法:
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 中为 false,这意味着 stream.Read() 永远不会返回并阻止我的应用程序。奇怪的是,这只是第二次发生,所以我第一个 ProcessRemoteQuery 工作正常,但第二个从来没有。这里的代码有错误吗?我没有包含实际初始化客户端的代码,但我向您保证它已经完成。似乎 ListenForConnection 每次都应该返回数据?任何帮助表示赞赏,谢谢。
【问题讨论】:
-
ListenForConnection中仍有一个错误 - 任何套接字代码都不应该忽略来自Read的返回值。您可能只收到了一个字节。一侧的Writes 和另一侧的Reads 之间没有1-1 关联。如果您想要messaging,则由您 来实现(即固定大小的消息、某种框架等)或提升到比 TCP 更高级别的抽象,这只是“字节流”。
标签: c# .net tcpclient tcplistener networkstream