重新连接Socket

时间:2014-08-15 11:13:20

标签: c# asp.net sockets

所以我在一个asp.net(C#)应用程序(非常糟糕的方法)中运行套接字服务器,通知任何连接的设备, 就像我开始在这家公司工作一样,改变它并不是我的主管的优先事项,即使它会更好。

所以当我们对网站进行更新时,Socket连接保持打开状态(在另一个线程中),然后我们必须重新启动服务器,但我想要做的是以某种方式在启动时获取线程ID套接字,然后存储它,如果更新完成,它应该重新连接到该线程并以某种方式结束Socket或重置它。

这可能吗?

这是示例代码

    private void Start()
    {
        _socketServer = new TcpListener(IPAddress.Any, Convert.ToInt32(ConfigurationManager.AppSettings["NotificationSocketPort"]));
        _socketServer.Start();
        _acceptingThread = new Thread(() =>
        {
            while (true)
            {
                try
                {
                    var client = _socketServer.AcceptTcpClient();
                    StartClient(client);
                }
                catch (ObjectDisposedException ex)
                {
                    _acceptingThread = null;
                    _socketServer = null;
                    Start();
                    break;
                }
            }
        });
        _acceptingThread.Start();
    }

    public void Close()
    {
        if (_acceptingThread != null)
        {

            _acceptingThread.Abort(0x0);
            _socketServer.Stop();
            _acceptingThread = null;
            _socketServer = null;
        }
    }

在global.asax

protected void Application_End(object sender, EventArgs e)
{
    SocketNotifier.GetNotifierInstance().Close();
}

SocketNotifier正在使用Singleton设计模式

2 个答案:

答案 0 :(得分:2)

坦率地说,这只是错误的做法。 Web应用程序重新启动,应该会重启。套接字不喜欢这样,不应该期望这样。这里你最好的选择是将套接字代码重新编写为Windows服务 - 这样它就可以独立于web-app运行。

答案 1 :(得分:1)

  

他们[套接字]保持打开状态,这是IIS工作进程终止并启动新进程后的问题

可能IIS无法关闭旧流程。这使插座保持打开状态。您的套接字线程是前台线程。它不会阻止进程终止。此外,中止线程不会影响IO。当套接字关闭时,套接字监听方法会自动重启。

删除这些问题。使线程成为后台线程。不要中止它。如果是ObjectDisposedException,请不要重新启动它。