在实际项目中,涉及套接字的都必须使用多线程,当接收端所接收到的消息需要显示到窗体控件上时,必须使用委托。这是因为窗体控件在窗体初始化时便被声明,即控件在主线程中被定义;而窗体控件具有一个属性,那就是:控件不具备跨线程的能力。因此,套接字编程中凡是涉及到窗体控件时,都必须调用控件的异步方法。下面举例说明:

  1 发送端(或者客户端)程序代码:

三 C# Socket通信 窗体控件与多线程using System;
三 C# Socket通信 窗体控件与多线程
using System.Collections.Generic;
三 C# Socket通信 窗体控件与多线程
using System.ComponentModel;
三 C# Socket通信 窗体控件与多线程
using System.Data;
三 C# Socket通信 窗体控件与多线程
using System.Drawing;
三 C# Socket通信 窗体控件与多线程
using System.Text;
三 C# Socket通信 窗体控件与多线程
using System.Windows.Forms;
三 C# Socket通信 窗体控件与多线程
三 C# Socket通信 窗体控件与多线程
using System.Net;
三 C# Socket通信 窗体控件与多线程
using System.Net.Sockets;
三 C# Socket通信 窗体控件与多线程
using System.Threading;
三 C# Socket通信 窗体控件与多线程
三 C# Socket通信 窗体控件与多线程
namespace DelTest
}

  发送端的界面很简单,如下图图1所示:

三 C# Socket通信 窗体控件与多线程   三 C# Socket通信 窗体控件与多线程

                        图1                          图2

  2 接收端(或者服务端)程序代码(界面如上图图2所示):

三 C# Socket通信 窗体控件与多线程using System;
三 C# Socket通信 窗体控件与多线程
using System.Collections.Generic;
三 C# Socket通信 窗体控件与多线程
using System.ComponentModel;
三 C# Socket通信 窗体控件与多线程
using System.Data;
三 C# Socket通信 窗体控件与多线程
using System.Drawing;
三 C# Socket通信 窗体控件与多线程
using System.Text;
三 C# Socket通信 窗体控件与多线程
using System.Windows.Forms;
三 C# Socket通信 窗体控件与多线程
三 C# Socket通信 窗体控件与多线程
using System.Net;
三 C# Socket通信 窗体控件与多线程
using System.Net.Sockets;
三 C# Socket通信 窗体控件与多线程
using System.Threading;
三 C# Socket通信 窗体控件与多线程
三 C# Socket通信 窗体控件与多线程
namespace SocketRec
}

  3 总结

  凡是涉及窗体控件的套接字编程,当控件需要显示侦听到的套接字时,必须使用控件的Invoke(EventHandler void, object obj)异步调用方法,否则程序肯定报错。通常在套接字编程中使用到的控件有:TextBox、RichTextBox、PictureBox……

  在一个大型项目中,套接字的侦听一般被封装在最底层,而控件的显示则封装在最上层,这中间可能隔了若干层,那么侦听到的套接字流只能通过委托来一层一层地传递数据,因为委托的功能很强大,可以跨线程。委托的签名只需满足void delegateMethod(object obj)即可,即:使用obj这个参数来传递数据。

  当然,在真正的项目中,套接字编程基本都会使用多线程技术,如果连接的终端很多,还会使用异步技术,下面的几篇文章将会介绍一下C#中的线程使用方法以及多线程如何共享数据和如何让一个方法在多线程中同步。最后再帖上项目中的主要代码,以做留念和参考。

相关文章: