【黑马程序员】网络通信机制和Socket的简单了解

来源:互联网 发布:桃子圈微博全数据图 编辑:程序博客网 时间:2024/05/22 01:40

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------


在我们的电脑上,一般都会装有QQ、YY、或网络游戏等需要通过联网实现其功能的程序,那么计算机是如何通过网络来联系其它设备上的程序呢?先看下图:

如图所示:假设有3台计算机通过网络互相联接,每个计算机都被分配有一个IP地址,计算机之间可以通过IP地址实现互相访问。如果计算机1想访问计算机3,就必须先通过计算机3的IP地址(192.168.1.3)找到计算机3,这样才能实现访问。现在计算机1和计算机3都有一个QQ应用程序,此时计算机1通过QQ给计算机3发送消息,这条消息附带有IP地址和端口号(192.168.1.3:101),它通过计算机3的IP地址传到计算机3里面。可是计算机3又正在运行一个YY应用程序,那么计算机3该把接收到的信息传给谁呢?事实上,我们会给每个应用程序绑定一个端口。当计算机上的网卡接收到网络传来的消息的时候,它会向每个应用程序发送这条消息,只有端口号匹配的程序才会接收这条消息。

Socket的英文原义是“孔”或“插座”,作为进程通信机制,取后一种意思,通常也称为“套接字”。Socket用于描述IP地址和端口,是一个通信链的句柄,说白了其实就是让两个程序通信用的。Socket非常类似于电话插座,以一个电话网为例。电话的通话双方相当于两个相互通信的程序,电话号码就是IP地址。任何用户在通话之前,首先要占有一部电话机,相当于申请一个Socket;同时要知道对方的号码,相当于对方有一个固定的Socket;然后向对方拨号呼叫,相当于发出连接请求;对方假如在场并且空闲,那他就会拿起话筒开始通话,相当于连接成功;双方通话的过程,是一方向电话机发出信号,对方从电话机接收信号的过程,相当于用Socket发送数据和用Socket接收数据;通话完毕后,一方挂掉电话,相当于关闭Socket,撤消连接。

Socket本身并不能和外界通信,它只是调用系统的套接字来和外界通信。在Internet上有很多个这样的主机,这些主机一般运行的很多服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上。不同的端口对应于不同的服务(应用程序)。例如:http使用80商品,ftp使用21端口,smtp使用23端口等。

Socket有两种类型,第一种是流式Socket(Stream),它是一种面向连接的Socket,针对于面向连接的TCP服务应用,安全性好,但效率低。第二种数据报式Socket(DataGram),它是一种无连接的Socket,对应于无连接的UDP服务应用,不安全(易丢失、顺序混乱、在接收端在分析重排及要求重发),但效率高。

Socket的一般应用模式是服务器端和客户端。服务端会有一个Socket负责监听是否有客户端的连接消息,然后客户端也有一个Socket,它连接服务端指定端口,负责接收和发送服务端的消息。如果服务端负责监听的Socket监听到有客户端发来连接请求,那么它就会创建一个新的连接Socket,专门负责和客户端通信。通过以上Socket的工作流程,我们可以发现Socketz应用模式的以下几个特点。

服务器端的Socket至少需要两个:其中一个负责接收客户端的连接请求,但不负责与客户端通信。当服务器端每成功接收到一个客户端的连接请求时,它都会在服务器端产生一个对应的Socket,负责和客户端通信。而客户端会通过创建一个Socket对象来初始化一个服务器端的TCP连接,连接Socket必须指定将要连接的服务器端的地址和端口。

如下图为Socket的通讯过程:


套接字的使用分为两种模式:阻塞模式和非阻塞模式。阻塞模式也称为同步模式,在这种模式下,Socket操作直到全部操作完成后才返回。也就是当接收消息时,它需要阻塞当前所在的线程,直到监听到有消息传送完毕,当前线程才会响应。在BSD UNIX中,套接字是以阻塞模式执行的,这对以命令行方式执行的UNIX程序来说不是问题,但阻塞模式不太适合于Windows下的消息驱动体系,所以Windows为所有函数提供了非阻塞模式的版本,非阻塞模式又称为异步模式。异步模式就是创建另外一个线程来监听消息。一般来说,Socket接口推荐使用非阻塞模式进行通信编程,仅在绝对有必要的情况下才采用阻塞方式进行通信编程。

Socket类为网络通信提供了一套丰富的方法和属性。所要求的命名空间为System.Net.Sockets。一个Socket实例包含了一相本地或者一个远程端点的套接字信息。Socket类的构造函数为:

public Socket(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType);
其中AddressFamily为网络类型,指定Socket使用的寻址方案,例如,AddressFamily.InterNetwork表明为IPv4的地址;SocketType指定Socket类型,例如,SocketType.Stream表明连接是基于流套接字的,而SocketType.Dgram表示连接是基于数据报套接字的;ProtocolType是指定Socket使用的协议,例如ProtocolType.Tcp表示连接协议是Tcp协议,而ProtocolType.Udp则表明连接协议是UDP协议。

Socket构造函数的3个参数中,对于网络上的IP通信来说,AddressFamily总是使用AddressFamily.InterNetwork枚举值。而SocketType参数则与ProtocolType参数配合使用,不允许其它的匹配形式,也不允许混淆匹配。下表列出了可用于IP通信的匹配组合:SocketTypeProtocolType说明DgramUdp无连接通信StreamTcp面向连接通信RawIcmpInternet控制报文协议RawRaw简单IP包通信

套接字创建后,就可以用Socket提供的一些属性方便地设置或检索信息。


---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------


原创粉丝点击