WCF和TCP应用编程
TCP应用编程概述
TCP的特点
1️⃣概念:
TCP是Transmission Control Protocol(传输控制协议)的简称,是TCP/IP体系中面向连接的运输层协议,在网络中提供双工和可靠的服务。
2️⃣特点:
一对一通信。
安全顺序传输。
通过字节流收发数据。
传输的数据无消息边界(TCP是将数据组装为多个数据报以字节流的形式进行传输,因此可能会出现发送方单次发送的消息与接收方单次接收的消息不一致的现象)
TCP应用编程的技术选择
编写TCP应用程序的技术包含:
1.用Socket类实现
(1)TCP通信过程中的所有细节全部通过自己编写的程序来控制。
(2)特点:方式灵活,但需要程序员编写的代码多。
(3)建议:定义一些新的协议或者对底层的细节进行更灵活的控制时使用此技术。
2.用TcpClient和TcpListener以及多线程实现
(1)TcpClient和TcpListener类对Socket进一步封装后的类,在一定程度上简化了用Socket编写TCP程序的难度,但灵活性也受到一定的限制。
(2)特点:TCP数据传输过程中的监听和通信细节(比如消息边界问题)仍然需要程序员自己通过代码去解决。
3. 用TcpClient和TcpListener以及多任务实现
(1)编写TCP应用程序时,不需要开发人员考虑多线程创建、管理以及负载平衡等实现细节,只需要将多线程看作是多个任务来实现即可。
4.用WCF实现
(1)监听和无消息边界等问题均有WCF内部自动完成。
(2)程序员只需要考虑传输过程中的业务逻辑即可。另外,利用WCF还可以实现自定义的协议。
在.NET框架4.0及更高版本中,第3种和第4种是建议的做法。在.NET框架3.5及更低版本中,只能用第1种和第2种方式实现。
利用传统技术实现TCP应用编程
TcpClient类和TcpListener类
①TcpListener类用于监听客户端连接请求。
②TcpClient类用于提供本地主机和远程主机的连接信息。
TcpClient类
(1)位于System.Net.Sockets命名空间下。
(2)提供的构造函数主要用 于客户端编程,而服务器端程序是通过TcpListener对象的AcceptTcpClient方法得到TcpClient对象的,不需要在服务端创建对象。
TcpClient的构造函数有以下重载形式。
TcpClient( )
(1)用不带参数的构造函数创建TcpClient对象时,系统会自动分配IP地址和端口号,例如:
TcpClient tcpClient=new TcpClient( );
tcpClient.Connect(“www.abcd.com”, 51888);
TcpClient(string hostname,int port)
(1)自动为客户端分配IP地址和端口号,并自动与远程主机建立连接。
(2)例如:
TcpClient tcpClient = new TcpClient(“www.abcd.com”, 51888);
TcpClient(AddressFamily family)
(1)这种构造函数创建的TcpClient对象也能自动分配本地IP地址和端口号,但是它使用AddressFamily枚举指定使用哪种网络协议(IPv4或者IPv6)。
(2)例如:
TcpClient tcpClient = new TcpClient(AddressFamily.InterNetwork);
tcpClient.Connect("www.abcd.com", 51888);
TcpClient(IPEndPoint iep)
(1)该构造函数的参数iep用于指定本机(客户端)IP地址与端口号。当客户端有一个以上的IP地址时,如果程序员希望指定IP地址和端口号,可以使用这种方式。
(2)例如:
IPAddress[] address = Dns.GetHostAddresses(Dns.GetHostName( ));
IPEndPoint iep = new IPEndPoint(address[0], 51888);
TcpClient tcpClient = new TcpClient(iep);
tcpClient.Connect("www.abcd.com", 51888);
TcpListener类
①TcpListener类用于在服务端监听和接收客户端传入的连接请求。
该类的构造函数常用的有以下两种重载形式。
TcpListener(IPEndPoint iep)
(1)通过IPEndPoint类型的对象在指定的IP地址与端口监听客户端连接请求,iep包含了本机的IP地址与端口号。
TcpListener(IPAddress localAddr, int port)
(1)直接指定本机IP地址和端口,并通过指定的本机IP地址和端口监听客户端传入的连接请求。
在同步工作方式下,对应有Start方法、Stop方法、AcceptSocket方法和AcceptTcpClient方法。另外,与这些同步方法对应的异步方法都有Async后缀。
(1)Start方法
TcpListener对象的Start方法用于启动监听。
public void Start( )
public void Start(int backlog)
(2)Stop方法
TcpListener对象的Stop方法用于关闭TcpListener并停止监听请求,语法如下。
public void Stop( )
(3)AcceptTcpClient方法
用于在同步阻塞方式下获取并返回一个封装了Socket的TcpClient对象,同时从传入的连接队列中移除该客户端的连接请求。得到该对象后,就可以通过该对象的GetStream方法生成NetworkStream对象,再利用NetworkStream对象与客户端通信。
(4)AcceptSocket方法
用于在同步阻塞方式下获取并返回一个用来接收和发送数据的Socket对象,同时从传入的连接队列中移除该客户端的连接请求。
简单应用只需要调用AcceptTcpClient,如果需要更细化的行为控制,则用AcceptSocket来实现。
用TcpListener和TcpClient编写TCP应用程序的一般步骤
编写TCP服务端代码的一般步骤
1)创建一个TcpListener对象,然后调用该对象的Start方法在指定的端口进行监听。
2)在单独的线程中,循环调用TcpListener对象的AcceptTcpClient方法接收客户端连接请求,并根据该方法返回的结果得到与该客户端对应的TcpClient对象。
3)每得到一个新的TcpClient对象,就创建一个与该客户端对应的线程,然后通过该线程与对应的客户端通信。
4)根据传送信息的情况确定是否关闭与客户端的连接。
编写TCP客户端代码的一般步骤
1)利用TcpClient的构造函数创建一个TcpClient对象,并利用该对象与服务端建立连接。
2)利用TcpClient对象的GetStream方法得到网络流,然后利用该网络流与服务端进行数据传输。
3)创建一个线程监听指定的端口,循环接收并处理服务端发送过来的信息。
4)完成通信工作后,向服务端发送关闭信息,并关闭与服务器的连接。

解决TCP无消息边界问题的办法
(1)发送固定长度的消息
这种办法适用于消息长度固定的场合。
(2)将消息长度与消息一起发送
一般在每次发送的消息前面用4个字节表明本次消息的长度,然后将其和消息一起发送到对方;对方接收到消息后,首先从前4个字节获取实际的消息长度,再根据消息长度值依次接收发送方发送的数据。
这种办法适用于任何场合。
(3)使用特殊标记分隔消息
使用特殊分隔符对消息进行分隔。
这种办法主要用于消息本身不包含特殊标记的场合。
利用WCF实现TCP应用编程
WCF与TCP相关的绑定
利用WCF编写TCP应用程序时,只需要在服务端配置文件中设置相关的绑定,就可以轻松实现相应的功能,而且不容易出错。
NetTcpBinding
(1)NetTcpBinding类用于将WCF和TCP绑定在一起,并以服务的形式提供TCP服务端和客户端之间的通信。
(2)在服务端配置文件中,用元素来配置。
在服务端配置文件中,元素默认配置如下:
安全模式:Transport(保证传输安全)。
消息编码方式:Binary(采用二进制消息编码器)。
传输协议:TCP。
会话:提供传输会话(也可以配置为可靠对话)。
事务:无事务处理功能(也可以配置为支持事务处理)。
双工:支持。
其他与TCP相关的绑定
(1)除了NetTcpBinding以外,WCF与TCP相关的绑定还有MexTcpBinding、NetTcpContextBinding
(2)WCF有一个约定:凡是具有Net前缀的绑定默认都使用二进制编码器对消息进行编码,而不带Net前缀的绑定则默认使用文本消息编码。

392

被折叠的 条评论
为什么被折叠?



