C#网络编程(二、.Net网络编程基本概念)

感谢:见证大牛成长之路的无私奉献,让人受益匪浅,本文有个人轻微修改,请点击链接查看原文,尊重楼主版权。


网络编程基本概念:

.NET框架在System.NET命名空间下提供了一系列的类用于网络通信.从层次上来说,这些类可以分为两组:

一组位于System.Net.Sockets命名空间下,提供底层的,基于传输层协议的通信,如TCP,UDP;

一组位于System.Net命名空间下,提供高层的,一局应用层协议的通信,如HTTP,FTP,SMTP.
 
面向连接的传输协议----TCP
 
我以前说过关于TCP的内容,在协议里面,这里不打算多说了,我单纯的说一点关于

TCP协议的特点:
 
1/ TCP是面向连接的,也就是说两个远程主机(或者叫进程,远程通信实际上是进程之间的通信,进程是指运行中的程序)必须首先进行一个握手过程,确认连接成功之后才能传输实际的数据.比如,进程A想要将字符创”Hello”发送给进程B,他首先要建立连接.在这一过程中,进程A首先需要知道进程B的位置(主机地址和端口号).随后发送一个不包含实际数据的请求报文,可将这个报文称之为”hi”.如果进程B接收到这个”hi”,就向A回复一个”hi”,进程A随后才发送实际的数据”hello”.
 
2/ TCP是全双工的,如果两个主机上的进程,A和B之间建立好连接,那么数据就可以从A到B,也可以从B到A.

3/ TCP是点对点的,意思是说一个TCP连接总是两者之间的,在发送中,通过一个连接将数据发给多个接收方是不可能的.如果想让数据发给多个接收方,就需要创建多个链接.
 
4/ TCP最重要的一个特性应该是可靠性吧,意思说连接建立后,数据的发送一定能够到达,并且是有序的.如果发送方发送了ABC,那么接收方收到的也一定是ABC,而不是别的顺序.
 

套接字(Socket):


在编程中,和TCP相关的就是套接字(Socket).TCP是属于传输层协议,这个大家应该知道吧,OSI?知道吗?如何从应用程序中获取来自传输层的数据呢?通过套接字.

套接字像是传输层打开的一扇门,应用程序通过这扇门向远程发送数据,或者接受来自远程的数据.这个门后面的事情,比如消息是如何传递的,是如何保证可靠性的,开发者是不需要关心的,这属于网络底层的事情.开发者需要关心和处理的是经过这扇门传递到应用程序中的数据.
 
如果想写封信给远方的朋友,信中的内容需要你自己写,而当将信投入到邮筒中的时候,邮筒的那个口就相当于套接字,信在进入邮筒之后就是其他人的事了,不需要你参与了.我们从来不会去关心信是如何从你这里到你朋友那里的,只要写好了投入邮箱就可以了.
 
两个应用程序之间的对话是通过套接字这个出入口来完成的,实际上套接字包含的最重要的就是两个信息:发出连接的本地IP地址和端口号,连接到的远程IP地址和端口号.
 
这里又出现了端口号这个名词,一般来说计算机同时运行着非常多的应用程序,它们可能需要同远程主机打交道,所以远程主机就需要有一个ID来标示它想与本地机器上的哪个应用程序打交道,这里的ID就是端口.将端口分配给一个应用程序,这样来自这个端口的数据总是针对这个应用程序的.有一个很形象的例子可以说明这个问题:可以将主机地址想象成电话号码,将端口号想象成分机号码.
 
在.NET中,提供了System.Net.Sockets.Cosket类,通过它可以直接对套接字进行编程.同时.NET还提供了两个帮助类对套接字进行了包装,使得操作变得更加简单,这两个类时TcpClient和TcpListener.


通过名字就能看出来,TcpListener用于接收连接请求,TcpClient用于接收和发送数据.TcpListener持续的保持对端口的监听,一旦受到一个连接请求后,就额可以获得一个TcpClient对象,而数据的发送和接收都是由TcpClient完成的.此时,TcpListener并没有停止工作,他继续保持对端口的监听,以应对新的连接请求.
 
现在有这样一种情况:两台主机,A和B,起初他们彼此独立.当他们想要进行数据通信时,需要一方发起连接,另一方则要对本机的某一端口进行侦听.在监听方收到连接请求,并建立连接后,它们之间就可以进行数据通信了.发起连接的一方并不需要进行监听.因为连接数全双工的,可以使用已经建立的连接进行数据收发.在前面说过了,将发起连接的一方叫做客户端,另一端叫做服务端,现在可以得出:总是在服务端使用TcpListener类,因为他需要建立起一个初始的连接.
 
即时通信程序的三种模式:
网络编程的一个最常见的的应用就是即时通信程序.
 
先来看一下点对点模式:
当采用这种模式时,每台计算机既是客户端也是服务端,因为他需要进行端口的监听.实现这个模式的难点是:各个主机之间如何知道其他主机的存在?此时通常的做法是当某一个主机上线时,通过UDP协议进行一个IP广播,使用这个方式来通知其他主机自己已经上线并说明位置,收到广播的主机发挥一个应答,此时主机便知道其他主机的存在,然后便可以进行连接和通信.
 
第二种模式引入了服务器,这种方式解决了上面判断有多少主机在线的问题.由服务器来专门进行广播.服务器持续保持对端口的监听状态,每当有主机上线时,首先连接到服务器,服务器收到连接后,将该主机的IP地址和端口号发往其他在线主机.这样其他主机便知道该主机已上线,并知道其所在位置,从而可以进行连接和对话.在服务器进行了广播之后,因为各个主机已经知道了其他主机的位置,因为主机之间的对话就不在通过服务器了,而是直接进行连接.因为,使用这种模式各个主机依然需要保持对端口的监听.
 
第三种模式是最简单的一种也是最实用的一种,主机的登陆与离线与第二种模式类似,由服务器进行广播,但是区别是每台主机在上线时就与服务器建立了连接,彼此并不建立连接,那么当从主机A向主机B发送消息时,就需要通过这样一条路径:A->服务器->B,通过这种方式,各个主机不需要再对端口进行监听,只需要服务器对端口进行监听就够了.
 
对于一些较大的文件,比如图片或者文件,如果想从A发往B,以服务器为中介进行传输效率会很低,此时可以临时搭建一个主机A到B的连接,用于传输大文件.当文件传输结束后再关闭连接.为啥么不能一直开着?而是用了之后立马抛弃呢?
 
除此之外,由于消息都经过服务器,因此服务器还可以缓存主机之间的对话,即当A发送B时,如果B离线,服务器可以对消息进行缓存,当主机B上线的时候连接到服务器,服务器自动将缓存的消息发往B.
 
理论就说这么多,下面开始讲解代码.

感谢:见证大牛成长之路的无私奉献,让人受益匪浅,本文有个人轻微修改,请点击文首链接查看原文,尊重楼主版权。

本书结合大量实例,全面介绍了基于visual c#.net网络编程,内容包括web forms、asp.net、tcp、udp端口通信、远程访问、msmq消息队列、电子邮作客户端系统、网络编程应用技巧与web services等。<br>本书所有的源代码可以通过http://www.tupwk.com.cn下载到,用户无需输入任何内容,即可使用本书中展示的所有技巧。<br>本书结构清晰,内容全面,由浅及深、注重实用,适合于初级和中级网络程序员、网络软件开发人员、网络管理员及广大计算机编程爱好者阅读。<br>第1章 net平台<br>1.1 net平台简介<br>1.1.1 什么是.net<br>1.1.2 net的功能<br>1.1.3 net的核心组件<br>1.2 net平台特点<br>1.3 net平台架构<br>1.4 本章小结<br>第2章 c#web编程基础<br>2.1 internet发展简史<br>2.1.1 www与internet<br>2.1.2 web的工作原理<br>2.1.3 超文本传输协议<br>2.2 web编程起步<br>2.2.1 html页面<br>2.2.2 html表单<br>2.2.3 静态和动态web页面<br>2.2.4 web的演化过程<br>2.3 netweb编程<br>2.3.1 aspnet<br>2.3.2 webforms<br>2.4 本章小结<br>第3章 基于asp.net网络编程<br>3.1 webforms<br>3.1.1 创建第一个web窗体<br>3.1.2 在web窗体上添加控件<br>3.1.3 将控件与数据绑定<br>3.1.4 webforms的事件响应<br>3.2 服务器端控件<br>3.3 自定义控件<br>3.3.1 创建项目<br>3.3.2 将控件添加到工具箱<br>3.3.3 个性化控件<br>3.3.4 创建自定义设计器<br>3.3.5 测试控件<br>3.4 html控件<br>3.5 aspnet应用程序<br>3.5.1 什么是应用程序<br>3.5.2 配置web.config<br>3.5.3 编写global.asax<br>3.5.4 应用和会话<br>3.5.5 安全访问控制<br>3.6 本章小结<br>第4章 基于tcp/udp协议的socket编程<br>4.1 hternet和socket简介<br>4.1.1 tcp协议简介<br>4.1.2 udp协议简介<br>4.1.3 端口简介<br>4.1.4 system.net名称空间<br>4.1.5 system.net.sockets名称空间<br>4.2 基于tcp协议的网络会话实例<br>4.2.1 服务器端编程<br>4.2.2 客户端编程<br>4.2.3 编译运行<br>4.3 基于tcp的p2p文件共享应用<br>4.3.1 qremotefilestream协议<br>4.3.2 qremotefilestreamserver类<br>4.3.3 qremotefilestreamproxy类<br>4.3.4 qfilesharingpeer类<br>4.3.5 p2p-gui程序的编写和编译运行<br>4.4 基于udp协议的网络会话实例<br>4.4.1 服务器端编程<br>4.4.2 客户端编程<br>4.4.3 编译运行<br>4.5 基于udp广播的自动收报机的实现<br>4.5.1 服务器和客户端的公共类<br>4.5.2 服务器端编程<br>4.5.3 客户端编程<br>4.5.4 编译运行<br>4.6 基于udp的客户一服务器聊天应用的实现<br>4.6.1 qtcpserversession类<br>4.6.2 qtcpserver类<br>4.6.3 聊天协议<br>4.6.4 qchatserver类<br>4.6.5 qchatclient类<br>4.6.6 编译和运行程序<br>4.7 网络资料的访问<br>4.7.1 代理的概念<br>4.7.2 访问网络资源的客户端程序<br>4.8 本章小结<br>第5章 远程访问<br>……<br>第6章 基于msmq的消息队列<br>第7章 电子邮件客户端系统<br>第8章 网络编程实用技巧示例<br>第9章 xmlwebservices编程<br>第10章 一个大整数计算的webserrices<br>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值