WCF与HTTP/TCP/UDP编程

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服务端编程的一般步骤

  1. 创建一个TCPListener类的实例,调用Start方法在指定端口进行监听; TCPListener li = …; li.Start();
  2. 在单独线程中,循环调用AcceptTCPListener方法接收客户端的连接请求,并根据该方法的返回值得到与该客户端对应的TcpClient对象; TcpClient cli = li.AcceptTcpClient();
  3. 每得到一个新的TcpClient对象,就创建一个与该客户端对应的线程,然后通过该线程与客户端进行连接; NetworkStream nts = cli.GetStream();
  4. 根据传送消息的情况确定是否关闭与客户端的连接; li.Stop()

TCP客户端编程的一般步骤

  1. 创建一个TcpClient类的实例,并利用该对象与服务端建立连接; TcpClient cli = new TcpClient() cli.Connect(…);
  2. 利用TcpClient对象的GetStream方法得到网络流,然后利用该网络流与服务端进行数据传输; NetworkStream nts = cli.GetStream();
  3. 创建一个线程循环接收并处理服务端发送过来的信息; nts.read(…);
  4. 完成通信工作后,向服务端发送关闭消息,并关闭与服务器的连接; 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);
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值