TCP监听器在负载平衡器后不工作

本文关键字:工作 平衡 监听器 负载 TCP | 更新日期: 2023-09-27 18:12:32

我在windows服务中有一个TCP侦听器,它侦听特定端口上的任何传入TCP请求并处理消息。当它被直接访问时,它工作得很好。但是,一旦它在负载平衡器后面运行(在内部网中),它就不接受任何请求。我得到错误,如"无法连接到远程服务器"或"操作超时"。过了一段时间,服务以"内存不足"异常终止。请让我知道这可能是什么原因。粘贴下面的代码。我甚至尝试过异步模式(以避免显式线程启动)。但这无济于事。

public class SampleListener: IDisposable
{
    public delegate void JobRecieved(HttpMessage msg);
    public event JobRecieved OnJobRecieved;
    #region Property
    private TcpListener _tcpListener;
    private Thread _listenerThread;
    public int Port { get; private set; }
    public string Url
    {
        get
        {
            return new UriBuilder { Scheme = "http", Port = Port, Host = Dns.GetHostName() }.ToString();
        }
    }
    #endregion
    public SampleListener(int port)
    {
        Port = port;
    }
    ~SampleListener()
    {
        DisposeImpl(false);
    }
    public void Start()
    {
        _tcpListener = new TcpListener(IPAddress.Any, Port);
        _tcpListener.Start();
        _listenerThread = new Thread(ListenCallback);
        _listenerThread.Start();
    }
    public void ListenCallback()
    {
        try
        {
            while (true)
            {
                using (TcpClient client = _tcpListener.AcceptTcpClient())
                using (var clientStream = client.GetStream())
                {
                    var msg = new HttpMessage();
                    msg.Receive(clientStream);
                    SendOKResponse(client, "");
                    OnJobRecieved(msg);
                    client.Close();
                }
            }
        }
        catch (System.Net.Sockets.SocketException e)
        {
            // Expected, TcpClient.Stop called                
        }
        catch (System.Threading.ThreadAbortException)
        {
            // Expected, thread going away
        }
        catch (System.IO.IOException)
        {
            // Expected, shutdown while reading
        }
    }
    private void SendOKResponse(TcpClient tcpClient, String responseBody)
    {
        var response = new HttpMessage
        {
            Status = "200",
            Reason = "OK",
            Version = "HTTP/1.1"
        };
        response.Send(tcpClient.GetStream(), responseBody);
    }
    public void Shutdown()
    {
        lock (this)
        {
            if (_listenerThread != null)
            {
                _listenerThread.Abort();
                _listenerThread = null;
            }
            if (_tcpListener != null)
            {
                _tcpListener.Stop();
                _tcpListener.Server.Close();
                _tcpListener = null;
            }                
        }
    }
    #region IDisposable Members
    private void DisposeImpl(Boolean bDisposing)
    {
        lock (this)
        {
            Shutdown();
        }
    }
    public void Dispose()
    {
        GC.SuppressFinalize(this);
        DisposeImpl(true);
    }
    #endregion
}

TCP监听器在负载平衡器后不工作

这是因为Windows上的NLB需要您的应用程序默认为集群应用程序。如果它不是(这是你的情况),你必须使用粘性会话。显然,你的NLB不使用粘性会话,所以请求可能会在每次通过时传输到不同的服务器。这就是为什么你会得到这些异常(看看这个)。

这发生在我自己的一个项目(一个高性能TCP服务器-与你正在做的相反)。