【问题标题】:Best way to implement socket listener in C#在 C# 中实现套接字侦听器的最佳方法
【发布时间】:2009-11-15 16:35:44
【问题描述】:

我确实已经搜索过答案,但找不到类似的东西......

我对 C# 还很陌生。我需要使用 WinForms 在 C# 中创建一个程序。它基本上有 2 个组件:UI,然后我需要一个永久侦听套接字 TCP 端口的进程。如果收到任何东西,那么我需要引发一个事件或类似的东西,以便我可以更新 UI。

问题:在程序运行时实现需要一直监听的进程的最佳方法是什么?

然后,当我收到消息时,如何通知 UI 需要更新?

谢谢!

【问题讨论】:

    标签: c# winforms sockets


    【解决方案1】:

    您可以使用TcpListener 来等待另一个线程上的传入连接。每次收到新连接时,创建一个新线程来处理它。使用 Control.Invoke 从非 UI 线程更新 UI。这是一个简短的例子:

    public MainForm()
    {
        InitializeComponents();
        StartListener();
    }
    
    private TcpListener _listener;
    private Thread _listenerThread;
    
    private void StartListener()
    {
        _listenerThread = new Thread(RunListener);
        _listenerThread.Start();
    }
    
    private void RunListener()
    {
        _listener = new TcpListener(IPAddress.Any, 8080);
        _listener.Start();
        while(true)
        {
            TcpClient client = _listener.AcceptTcpClient();
            this.Invoke(
                new Action(
                    () =>
                    {
                        textBoxLog.Text += string.Format("\nNew connection from {0}", client.Client.RemoteEndPoint);
                    }
                ));;
            ThreadPool.QueueUserWorkItem(ProcessClient, client);
        }
    }
    
    private void ProcessClient(object state)
    {
        TcpClient client = state as TcpClient;
        // Do something with client
        // ...
    }
    

    【讨论】:

    • 为什么我被否决了?请评论 !我乐于接受批评,但如果我不知道我的回答有什么问题,那就不是很有建设性......
    • 这只是化妆品,但我认为您在此之后多了一个分号。Invoke(...);; (澄清一下,这不是你被否决的原因,至少不是我)
    【解决方案2】:

    您可以使用TcpListener 类。文档中有一个示例。

    【讨论】:

    • 我相信他们正在寻找更多的架构答案......似乎他们不确定如何将 TcpListener 与事件驱动程序集成。
    【解决方案3】:

    在启动时,您可以生成(创建)一个新线程,该线程在无限循环中侦听新消息。一旦收到消息,线程就可以更新一些共享资源(设置一个标志)。当然,如果您使用同步队列来传输消息,则可以使这更加复杂。或者通过 WCF(尽管这对于您的目的来说似乎有些矫枉过正)。

    【讨论】:

      【解决方案4】:

      这可能不是最好的方法,但它应该可以工作......

      您可以在程序启动时在新线程中启动您的 TCP 侦听器代码...这样您就可以在 UI 停止执行其他操作时侦听 TCP 代码。当 TCP 线程中发生某些事情时,它必须通过某种事件或事件队列向 UI 线程发出信号。

      现在,在接收到东西时更新 WinForms 对象方面,我相信只有创建 WinForms 控件的线程才能更新控件。因此,您还必须考虑到这一点。

      这也是我之前遇到过的一个问题......在我当前的项目中,我做了我上面提到的......但是有相当多的线程同步才能让它工作。

      【讨论】:

      • 从另一个线程更新 UI 非常容易:您只需要使用 Control.Invoke 方法,将更新 UI 的委托传递给它
      猜你喜欢
      • 2017-07-20
      • 2011-11-16
      • 1970-01-01
      • 2017-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-24
      • 1970-01-01
      相关资源
      最近更新 更多