2016-03-10 26 views
1

我有两种方法: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似乎应该每次都返回数据?任何帮助表示赞赏,谢谢。

+0

“ListenForConnection”中仍然存在一个错误 - 没有套接字代码应该忽略来自'Read'的返回值。您可能只收到一个字节。在一方'写'和另一方'读'之间没有关联。如果你想要*消息传递*,那么实现它(即固定大小的消息,某种类型的帧等)或者移动到比TCP更高级别的抽象(这只是“字节流”)就取决于你。 –

回答

0

所以我非常非常愚蠢,最近改变了这个,所以客户端每次都不连接。 Listener.AcceptTcpClient在发送第一条消息后正在等待新客户端,并且从来没有收到过,阻塞了整个事情。

+0

这是否意味着你已经解决了你的问题? –

+0

是的,我已经将连接逻辑重构了一点点。 –

相关问题