SOAP消息可以和各种网络传输协议绑定,例如SOAP1.0规范最初规定的HTTP协议,以及新SOAP规范和主流SOAP供应商推出的SMTP、FTP、POP3、BEEP、JMS、MSMQ等协议。
2.2 Socket
Socket也被称为套接字,用于描述IP地址和端口,作为网络通信连接的句柄。在基于TCP/IP的网络应用开发中,Socket通信方式是一种常用的机制。由于TCP/IP协议的广泛应用,使得Socket通信方式具有非常强的适用性,除了用于网络通信之外,还可以应用于跨平台通信、硬件控制、进程间通信等多种场合。Socket通信应用程序通常运行时间长、对环境变化敏感、并发控制复杂。因此,如何保证Socket通信稳定、高效,可靠,是一个非常重要的问题。
2.2.1 NET下的多线程Socket通信方式
在.NET中,对Winsock32API中的套接字服务进行了封装,在System.Net.Sockets命名空间里包含了Windows套接字接口,使得开发Socket通信程序的难度大大降低。Socket通信有两种类型,面向连接的TCP方式和UDP报文方式,当前的应用以TCP方式居多,本文主要讨论TCP方式的应用。一般的Socket网络通信应用,存在着很多的并发的接收和发送动作,为了提高效率,往往通过多线程的方式来进行通信。
(1) 服务器端的监听及新连接处理
服务器的一个重要任务,就是持续监听端口,等待客户端的连接。当收到新的连接请求时,建立连接,并进行相应的处理。服务器的监听是一个连续不断的过程,当新连接建立后,还需要继续监听,循环不断。在执行监听动作Listen时,当前线程将阻塞于此。所以,服务器的监听处理,不能放在主线程中,必须放在一个独立的线程中,否则将导致主界面无响应。
当收到连接请求后,服务器端将建立一个新的连接。这个连接可能会存在一段时间,进行数据的收发。连接的处理和主线程以及监听线程有相对独立性,也需要放在一个独立的线程中。
(2) 连接线程的处理
在连接线程中,无论在服务器端还是客户端,都需要相同的处理:信息的收发。可以将连接的收发分开处理,在连接线程中主要完成数据的接收,而把数据的发送放到一个公共的线程中;也可以把接收和发送放在一个线程中处理。后者相对简单,以下是这种方法的实现。
A 阻塞读,如果接收到数据,放到接收缓冲区中;
B 阻塞读方法设定有一个超时值,如果超时,将进行后面的动作;
C 检查发送缓冲,如果有待发送的内容则进行发送,没有则继续往后执行;
D 线程sleep一段时间;
E 循环,再次回到(1)进行阻塞读。
(3) 多线程处理的不足
使用多线程的方式进行Socket通信,是最常用、最直观的方法,容易理解,代码逻辑也比较直观。但是,使用这种方式也有不足之处:
A 在服务器端监听、连接线程读入数据时,都采用了阻塞的方式。必须采用多线程方式处理才能不影响程序的执行,而过多的线程操作,增加了程序的复杂度。
B 由于线程的创建、管理都需要开发者来进行控制,而网络的情况又复杂多变,对程序的稳定性影响较大。
C 多线程方式开发较复杂,不便用于一些轻量级的应用场合。
2.2.2 使用异步方式处理
.NET的Socket通信支持异步方式,它不用阻塞等待,当事件发生后,会自动调用回调函数进行处理。异步方式通信,从本质上来说,仍然也是以多线程方式进行的:当执行异步委托时,也不是在主线程执行,而是在独立的线程中执行。只不过这些独立线程来源于系统的线程池,由系统分配和文护,对用户来说,无需管理和控制。这样就降低了代码的复杂度,同时减少了因为线程管理不当影响系统稳定性的风险。 基于WCF的消息推送服务研究与实现(4):http://www.youerw.com/jisuanji/lunwen_5903.html