多客户端服务器行为异常

本文关键字:异常 服务器 客户端 | 更新日期: 2023-09-27 18:34:11

下面是一个代码段。我正在尝试分别处理上游和下游。但不幸的是,handleUpStream() 在 handleDownStream 之后从未发生过。

如果我删除句柄下游,一切都很好。我在handleDownStream中缺少一些东西,我不知道是什么。

    public void run()
    {
        while (running)
        {
            if (ClientPool == null)
                continue;
            foreach (Client c in ClientPool)
            {
                NetworkStream networkStream = c.getTcpClient().GetStream();
                handleDownStream(c, networkStream);
                handleUpstream(c, networkStream);
            }
        }
    }
    public void handleDownStream(Client c, NetworkStream networkstream)
    {
        try
        {
            networkstream.Read(bytesFrom, 0, (int)c.getTcpClient().ReceiveBufferSize);
            dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
            Console.WriteLine("Message From: " + c.getClientIp() + " : " + dataFromClient);
            dataFromClient = null;
            bytesFrom = new byte[10025];
        }
        catch (Exception e)
        { 
            // I tried to see if there was some sort of exception here that was a silent killer. 
            Console.WriteLine(e.ToString());
            return;
        }
    }
    public void handleUpstream(Client c, NetworkStream networkstream)
    {
        // The below never happens.
        Console.WriteLine("this lol");
        if (c.getTimeSinceLastMessage() > 30000 && c.getPinged())
        {
            Console.WriteLine("Removing Client From Pool, " + c.getClientIp());
            removeClientFromPool(c);
            return;
        }
        if (c.getTimeSinceLastMessage() > 15000 && c.getPinged() == false)
        {
            Console.WriteLine("Sending ping to Client, " + c.getClientIp());
            c.switchPinged();
            bytesToSend = Encoding.ASCII.GetBytes("ping");
            networkstream.Write(bytesToSend, 0, bytesToSend.Length);
            networkstream.Flush();
            bytesToSend = null;
        }
    }

多客户端服务器行为异常

嗯,这很尴尬...

除了检查它之外,您还可以阅读,还需要检查那里是否有数据可以读取......对于那些像我这样的新手或忘记检查这里是更新的代码。很明显,如果你调用networkstream.read(),它会等待一条消息(它与线程的同步器)。

这是修订后的工作代码,适用于那些需要查看发生了什么的人。

public void run()
    {
        while (running)
        {
            if (ClientPool == null)
                continue;
            foreach (Client c in ClientPool)
            {
                NetworkStream networkStream = c.getTcpClient().GetStream();
                if (networkStream.CanRead)
                    handleDownStream(c, networkStream);
                handleUpstream(c, networkStream);
            }
        }
    }
    public void handleDownStream(Client c, NetworkStream networkstream)
    {
        if (networkstream.DataAvailable == false)
            return;
        try
        {
            networkstream.Read(bytesFrom, 0, (int)c.getTcpClient().ReceiveBufferSize);
            dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
            Console.WriteLine("Message From: " + c.getClientIp() + " : " + dataFromClient);
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
            return;
        }
    }
    public void handleUpstream(Client c, NetworkStream networkstream)
    {
        if (c.getTimeSinceLastMessage() > 30000 && c.getPinged())
        {
            Console.WriteLine("Removing Client From Pool, " + c.getClientIp());
            removeClientFromPool(c);
            return;
        }
        if (c.getTimeSinceLastMessage() > 15000 && c.getPinged() == false)
        {
            Console.WriteLine("Sending ping to Client, " + c.getClientIp());
            c.switchPinged();
            bytesToSend = Encoding.ASCII.GetBytes("ping");
            networkstream.Write(bytesToSend, 0, bytesToSend.Length);
            networkstream.Flush();
            bytesToSend = null;
        }
    }