【问题标题】:Many TcpListener incoming connections许多 TcpListener 传入连接
【发布时间】:2016-11-20 00:14:34
【问题描述】:

我需要制作一个接受并保持很长时间许多连接(预计超过 100k)的服务器。

我的代码如下:

public delegate Task ClientConnectedEventHandler(Stream stream);

public class Listener
{
    public event ClientConnectedEventHandler OnClientConnected;

    private readonly TcpListener _tcpListener;

    public Listener()
    {
        _tcpListener = new TcpListener(new IPEndPoint(IPAddress.Any, 8082));
    }

    public void Start()
    {
        _tcpListener.Start();
        _tcpListener.BeginAcceptTcpClient(Accept, null);
    }

    private void Accept(IAsyncResult asyncResult)
    {
        _tcpListener.BeginAcceptTcpClient(Accept, null);
        var client = _tcpListener.EndAcceptTcpClient(asyncResult);
        var stream = client.GetStream();
        OnClientConnected?.Invoke(stream).ContinueWith(_ => client.Close());
    }
}

class Program
{
    static void Main(string[] args)
    {
        var listener = new Listener();
        var count = 0;
        var infoLock = new object();

        listener.OnClientConnected += async stream =>
        {
            lock (infoLock)
            {
                count++;
                Console.Title = count.ToString();
            }
            while (true)
            {
                // Some logic
                await Task.Delay(100);
            }
        };

        listener.Start();
        while (true)
        {
            Thread.Sleep(100);
        }
    }
}

当逻辑占用 300-400 毫秒时没有问题。但是如果我想长时间保持传入的连接,在接受 8 个客户端后,count 变量的增量非常缓慢,而且内存使用量很大。我做错了什么以及如何解决这个问题?

【问题讨论】:

标签: c# .net websocket tcplistener


【解决方案1】:

您的内存问题可能是由于未释放非托管资源所致。 TcpClientNetworkStream 都实现了 IDisposable 并且应该包装在 Using 块中或手动关闭/处置。对于初学者,请参阅How to properly and completely close/reset a TcpClient connection?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-08
    • 2012-01-16
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 2012-07-29
    相关资源
    最近更新 更多