文章目录
WCF和HTTP编程
HTTP以TCP方式工作方式:
HTTP客户端首先与服务器建立TCP连接,然后客户端通过套接字发送HTTP请求,并通过套接字接收HTTP相应
HTTP默认是无状态的
无状态的含义是:客户端发送一次请求后,服务器并没有存储关于该客户端的任何状态信息
基本HTTP绑定(BasicH偷偷Binding)类
基本HTTP绑定用BasicHTTPBinding类实现,在配置文件中用basicHttpBinding元素来配置,利用BasicHTTPBinding,可轻松实现类似传统Web服务实现的功能
默认值以及可选参数:
消息编码(messageEncoding) utf-8, unicode
传输方式 (transferMode)Buffered, Streamed
是否支持事务,双工: 无事务功能,不支持双工
WCF消息交换模式
请求应答模式:
客户端向WCF服务端发送请求后,服务端执行服务操作,并将操作结果返回到客户端。客户端如果不是通过异步操作来调用的,在服务端返回服务操作服务结果之前,客户端代码将处于阻塞状态
单向模式:
单向模式是指客户端调用WCF服务操作时,服务端不向客户端返回操作结果,即使服务端出现执行错误,它也不会像客户端返回操作结果
双工通信:
双工是指客户端和服务端都可以主动呼叫对方(客户端可以调用服务端方法,服务端也可以调用客户端方法),在这种通信模式中,WCF利用双向绑定实现服务端和客户端相互公开终结点的信息
双工模式并不自动检测服务端或客户端何时关闭其通道
在实现代码汇总,必须要确保提供双工服务的终结点都是安全的
(多人聊天室案例)
利用OperationContract(IsOneWay = true) 定义单向模式
OperationContract不加其他内容即为请求应答模式
WCF与TCP编程
TCP是一种面向连接的传输层协议
一对一通信
安全顺序传输
通过字节流收发数据
传输的数据消息无边界(也就是传输的信息可能被数据接收方多次接收)
UDP是一种无连接的运输层协议
一对一,一对多通信
不保证有序传输
传输速度比TCP块
UDP有消息边界
使用TCPClient和TCPListener实现TCO应用编程
TcpClient类
位于System.Net.Socket命名空间
TcpClient类用于提供本地主机和远程主机的连接信息
该类提供的构造函数主要用于客户端编程
服务端编程时,TcpClient对象由TcpListener对象的AcceptTcpClient方法得到,无需使用构造函数进行创建
TcpClient类常用的构造函数
不带参数的构造函数
public TcpClient()
系统自动分配IP地址和端口号,通常和Connect方法搭配使用
TcpClient client = new TcpClient();
client.Connect("www.abcd.com", 51888);
带有hostname和port参数的构造函数
public TcpClient(string hostname, int port);
hostname表示连接到远程主机的DNS名或IP地址,port表示连接到远程主机的端口号
TcpClient client = new TcpClient("www.abcd.com",51888);
TcpListener类
位于System.Net.Socket命名空间下
TCPListener类用于服务端监听和接收客户端的连接请求
常用构造函数
public TCPListener(IPAddress addr, int port)
addr是本机的ip地址, port是本机监听的端口号
IPAddress serverIP = IPAddress.Parse("127.0.0.1");
TcpListener listener = new TcpListener(severIp,51888);
public TcpListener(IPEndPoint iep)
iep是包含本机IP地址和端口号的IPEndPoint对象
IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 51888);
TcpListener listener = new TcpListener(iep);
创建完成后调用start()方法用于启动监听
public void Start();
public void Start(int backlog)
backlog表示请求队列的最大长度,即最多允许的客户端的连接个数
listen.Start();
listen.Start(19);
Stop方法()
用于关闭TcpListener对象并停止监听,服务端立即停止监听客户端的连接请求,会引发SocketException类型的异常,但不会关闭已经接收连接请求
public void Stop()
listener.Stop()
TCP服务端编程的一般步骤
- 创建一个TCPListener类的实例,调用Start方法在指定端口进行监听; TCPListener li = …; li.Start();
- 在单独线程中,循环调用AcceptTCPListener方法接收客户端的连接请求,并根据该方法的返回值得到与该客户端对应的TcpClient对象; TcpClient cli = li.AcceptTcpClient();
- 每得到一个新的TcpClient对象,就创建一个与该客户端对应的线程,然后通过该线程与客户端进行连接; NetworkStream nts = cli.GetStream();
- 根据传送消息的情况确定是否关闭与客户端的连接; li.Stop()
TCP客户端编程的一般步骤
- 创建一个TcpClient类的实例,并利用该对象与服务端建立连接; TcpClient cli = new TcpClient() cli.Connect(…);
- 利用TcpClient对象的GetStream方法得到网络流,然后利用该网络流与服务端进行数据传输; NetworkStream nts = cli.GetStream();
- 创建一个线程循环接收并处理服务端发送过来的信息; nts.read(…);
- 完成通信工作后,向服务端发送关闭消息,并关闭与服务器的连接; cli.Close();
WCF和UDP编程
单播只能向某个指定的远程主机发送消息,类似TCP通信,本质是一种一对一的通信
UdpClient类
位于System.NET.Socket命名空间下
常用构造函数:
Public UDPClient(IPEndPoint ip)
ip表示本地终结点
IPAddress ip = IPAddress.Parse("127.0.0.1");
IPEndPoint iep = new IPEndPoint(ip, 51666);
UdpClient client = new UdpClient(iep);
发送数据方法:
同步发送Send方法:
public int Send(byte[] data, int length, IPEndPoint remote)
data 表示发送数据的字节序列,length表示长度,remote表示远程的终结点
异步发送SendAsync方法:
参数同上
client.Send(bytes,bytes.length,remoteEndPoint); // 向远程remotePoint终结点发送消息
client.SendAsync(...);
接收数据方法:
同步接收方法Receive方法:
public byte[] Receive(ref IPEndPoint remote)
remote表示远程主机的终结点,初始值为null
IPEndPoint remote = null;
byte[] bytes = client.Receive(ref remote); // 当接收到消息之后remote就表示远程主机的终结点
异步接收方法ReceiveAsync方法:
var result = await client.ReceiveAsync();
string str = Encoding.Unicode.GetString (result.Buffer);