【问题标题】:DataAvailable is false but more data should have been sentDataAvailable 为 false,但应发送更多数据
【发布时间】: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


【解决方案1】:

所以我非常非常愚蠢,并且最近更改了此设置,以便客户端不会每次都连接。 Listener.AcceptTcpClient 在发送第一条消息后一直在等待新的客户端,但一直没有收到,从而阻塞了整个过程。

【讨论】:

  • 是的,我有,反正我已经重构了连接逻辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-06
  • 1970-01-01
  • 2011-10-18
  • 2022-01-11
  • 2021-03-15
相关资源
最近更新 更多