在C#中实现套接字侦听器的最佳方法

我已经找到了答案,但找不到类似的东西……

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

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

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

谢谢!

您可以使用等待另一个线程上的传入连接的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 // ... } 

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

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

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

您可以在程序启动时在新线程中启动TCP侦听器代码…这样您就可以在UI关闭其他内容时监听TCP代码。 当TCP线程中发生某些事情时,它必须通过某种事件或事件队列来通知UI线程。

现在,就收到内容时更新WinForms对象而言,我相信只有创建WinForms控件的线程才能更新控件。 所以,你也必须考虑到这一点。

这是我之前遇到的一个问题……在我目前的项目中,我做了我上面提到的…但是有很multithreading同步才能使它工作。