| 编辑推荐: | 
                                   
                                   
                                    本文来自于csdn,先了解一下网络的基础知识和UDP编程。本文很有意思哦,最后模拟了微信聊天。  | 
                                   
                                  | 
                             
                           
                          第一部分:网络基础 
                      
                         
                            一,最主要的三种网络 
                            (1)电信网络(电话网),负责话音通信,也就是打电话、接听电话。 
                            (2)有线电视网络,主要提供视频服务。 
                            (3)计算机网络,主要是数据传输服务,也就是说是资源共享,其主要的服务就是因特网。 
                            三种网络在各自的通信协议下传输信息,为用户提供通信服务。 
                       
                         
                            二,计算机网络背景 
                           20世纪40年代以来,人们就梦想能拥有一个世界性的信息库。在这个信息库中,信息不仅能被全球的人们存取,而且能轻松地链接到其他地方的信息,使用户可以方便快捷地获得重要的信息。因此,互联网应运而生。 
                             
                          
                            internet泛着互联网;Internet是互联网的一种,称为因特网,但因特网并不是全球唯一的互联网络。例如在欧洲,跨国的互联网络就有“欧盟网”(Euronet),“欧洲学术与研究网”(EARN),“欧洲信息网”(EIN),在美国还有“国际学术网”(BITNET),世界范围的还有“飞多网”(全球性的BBS系统)等。 
                       
                          
                            Internet提供的主要服务有万维网(WWW)、文件传输(FTP)、电子邮件(E-mail)、远程登录(Telnet)、手机(3GHZ)等。万维网联盟称为W3C。 
                        
                           万维网(WWW)常简称为Web。分为Web客户端和Web服务器程序。WWW可以让Web客户端(浏览器)按照超文本传输协议(HTTP)访问浏览Web服务器上的页面。WWW是一个由许多互相链接的超文本组成的系统,这些超文本可以通过互联网被访问。在这个系统中,每个有用的事物,称为一样“资源”;并且由一个全局“统一资源标识符”(URI)标识;这些资源通过超文本传输协议(Hypertext 
                            Transfer Protocol)传送给用户,而后者通过点击链接来获得资源。 
                         
                        
                            三,因特网组成 
                            
 
                            因特网主要是由核心部分和边缘部分组成,网络核心部分是因特网中最复杂的部分。网络中的核心部分要向网络边缘中的大量主机提供连通性,使边缘部分中的任何一个主机都能够向其他主机通信(即传送或接收各种形式的数据)。 
                          
                          
                            因特网的核心部分是由许多网络和把它们互连起来的路由器组成,而主机处在因特网的边缘部分。在因特网核心部分的路由器之间一般都用高速链路相连接,而在网络边缘的主机接入到核心部分则通常以相对较低速率的链路相连接。 
                          
                          
                            在网络边缘的端系统中运行的程序之间的通信方式通常可划分为两大类:客户服务器方式(C/S方式)和对等方式(P2P方式)。还有一种浏览器服务器方式(B/S方式)是C/S方式的一种特例。 
                          
                       
                            四,因特网中节点间信息传递方式 
                            1、电路交换 
                           电路交换首先在发送端和接收端建立连接,然后将报文传输过去,最后释放连接。 
                            电路交换的三个阶段:建立连接、通信、释放连接。电路交换中通过交换机实现两个节点之间的通信。电信网络(电话网)使用的电路交换。 
                             
                         2、报文交换 
                            在通信过程中,通信双方以报文为单位、使用存储-转发机制实现数据交互的通信方式,被称为报文交换。发送电报使用的报文交换。 
                            3、分组交换 
                            分组交换与报文交换一样都使用存储-转发机制,不过分组交换将报文分成多个分组,以分组为单位、使用存储-转发机制实现数据交互。在发送端,先把较长的报文划分成较短的、固定长度的数据段, 
                            每一个数据段前面添加上首部构成分组,各个分组依次发送到接收端,接收端接收到分组后,剥去首部,将其组装成还原成报文。计算机网络使用的分组交换。 
    
                            五、路由选择协议 
                            报文被拆分成分组后,从发送端出发,经过多个路由器,到达接收端,这些路由器根据一定的路由选择协议根据分组的头部地址将分组转发到相应的端口,路由选择协议非常重要的。 
                            1、 关于“最佳路由” 
                            (1.1)不存在一种绝对的最佳路由算法。 
                            (1.2)所谓“最佳”只能是相对于某一种特定要求下得出的较为合理的选择而已。 
                            (1.3)实际的路由选择算法,应尽可能接近于理想的算法。 
                            (1.4)路由选择是个非常复杂的问题 
                            (1.4.1)它是网络中的所有结点共同协调工作的结果。 
                            (1.4.2)路由选择的环境往往是不断变化的,而这种变化有时无法事先知道。 
                          
                       
                            2、 从路由算法的自适应性考虑: 
                            (2.1)静态路由选择策略,即非自适应路由选择,其特点是简单和开销较小,但不能及时适应网络状态的变化。 
                           (2.2)动态路由选择策略,即自适应路由选择,其特点是能较好地适应网络状态的变化,但实现起来较为复杂,开销也比较大。 
                          
                       
                            3、 因特网中的两大类路由选择协议: 
                           (3.1)内部网关协议IGP (Interior Gateway 
                            Protocol) 
                           即在一个自治系统内部使用的路由选择协议。目前这类路由选择协议使用得最多,其具体的协议有多种,如RIP和OSPF协议。RIP: 
                            Routing Information Protocol路由信息协议。RIP协议的三个要点: 
                          
                            (a)仅和相邻路由器交换信息。 
                            (b)交换的信息是当前本路由器所知道的全部信息,即自己的路由表。 
                            (c)按固定的时间间隔交换路由信息,例如,每隔?30?秒;OSPF:Open Shortest Path 
                            First??开放最短路径优先。 
                          
                          
                            (3.2)外部网关协议EGP (External Gateway Protocol) 
                           若源站和目的站处在不同的自治系统中,当数据报传到一个自治系统的边界时,就需要使用一种协议将路由选择信息传递到另一个自治系统中。这样的协议就是外部网关协议EGP。 
                           在外部网关协议中目前使用最多的是BGP-4。BGP:Border 
                            Gateway Protocol边界网关协议。BGP是不同自治系统的路由器之间交换路由信息的协议。边界网关协议BGP只能是力求寻找一条能够到达目的网络且比较好的路由(不能兜圈子),而并非要寻找一条最佳路由。 
                          
                       
                            六、网络协议 
                            为进行网络中的数据交换而建立的规则、标准或约定称为网络协议,网络协议简称为协议。它主要由三个要素组成: 
                            (1)语法,即数据与控制信息的机构或格式; 
                            (2)语义,即需要发出何种控制信息,完成何种动作以及做出何种响应; 
                            (3)同步,即事件实现顺序的详细说明。 
                          
                          
                            由此可见,网络协议是计算机网络的不可缺少的组成部分。实际上,只要我们想让连接在网络上的另一台计算机做点事情,都需要有协议。 
                            对于非常复杂的计算机网络协议,其结构应该是层次式的,我们把计算机网络的各层及其协议的集合,成为网络的体系结构。体系结构是抽象的,而实体则是具体的,是真正在运行的计算机硬件和软件。 
                          
                         
                            七、OSI(网络七层协议) 
                           OSI(网络七层协议)是一个开放性的通信系统互连参考模型,他是一个定义得非常好的协议规范。OSI模型有7层结构,每层都可以有几个子层。OSI的7层从上到下分别是7应用层6表示层5会话层4传输层3网络层2数据链路层1物理层 
                            ;其中高层(即7、6、5、4层)定义了应用程序的功能,下面3层(即3、2、1层)主要面向通过网络的端到端的数据流。 
                            
                         1、各层功能: 
                          
                            (1)第七层:应用层 
                            与其它计算机进行通讯的一个应用,它是对应应用程序的通信服务的。 
                            例如,一个没有通信功能的字处理程序就不能执行通信的代码,从事字处理工作的程序员也不关心OSI的第7层。但是,如果添加了一个传输文件的选项,那么字处理器的程序员就需要实现OSI的第7层。 
                            示例:TELNET,HTTP,FTP,NFS,SMTP等。 
                          
                          
                            (2)第六层:表示层 
                            这一层的主要功能是定义数据格式及加密。 
                            例如,FTP允许你选择以二进制或ASCII格式传输。如果选择二进制,那么发送方和接收方不改变文件的内容。如果选择ASCII格式,发送方将把文本从发送方的字符集转换成标准的ASCII后发送数据。在接收方将标准的ASCII转换成接收方计算机的字符集。 
                            示例:加密,ASCII等。 
                          
                          
                            (3)第五层:会话层 
                            它定义了如何开始、控制和结束一个会话,包括对多个双向消息的控制和管理,以便在只完成连续消息的一部分时可以通知应用,从而使表示层看到的数据是连续的,在某些情况下,如果表示层收到了所有的数据,则用数据代表表示层。 
                            示例:RPC,SQL等。 
                          
                          
                            (4)第四层:传输层 
                            这层的功能包括是否选择差错恢复协议还是无差错恢复协议,及在同一主机上对不同应用的数据流的输入进行复用,还包括对收到的顺序不对的数据包的重新排序功能。 
                            示例:TCP,UDP,SPX。 
                          
                          
                            (5)第三层:网络层 
                            这层对端到端的包传输进行定义,它定义了能够标识所有结点的逻辑地址,还定义了路由实现的方式和学习的方式。为了适应最大传输单元长度小于包长度的传输介质,网络层还定义了如何将一个包分解成更小的包的分段方法。 
                            示例:IP,IPX等。 
                          
                          
                            (6)第二层:数据链路层 
                            它定义了在单个链路上如何传输数据。这些协议与被讨论的各种介质有关。 
                            示例:ATM,FDDI等。 
                          
                          
                            (7)第一层:物理层 
                            OSI的物理层规范是有关传输介质的,这些规范通常也参考了其他组织制定的标准。连接头、帧、帧的使用、电流、编码及光调制等都属于各种物理层规范中的内容。物理层常用多个规范完成对所有细节的定义。 
                            示例:Rj45,802.3等。 
                          
                         
                            2、TCP/UDP协议 
                            (1)概念 
                            TCP (Transmission Control Protocol)和UDP(User Datagram 
                            Protocol)协议属于传输层协议。其中TCP提供IP环境下的数据可靠传输,它提供的服务包括数据流传送、可靠性、有效流控、全双工操作和多路复 
                            用。通过面向连接、端到端和可靠的数据包发送。 
                          
                          
                            通俗说,它是事先为所发送的数据开辟出连接好的通道,然后再进行数据发送;而UDP则不为IP提供可靠性、 
                            流控或差错恢复功能。一般来说,TCP对应的是可靠性要求高的应用,而UDP对应的则是可靠性要求低、传输经济的应用。 
                          
                          
                            TCP支持的应用协议主要 有:Telnet、FTP、SMTP等;UDP支持的应用层协议主要有:NFS(网络文件系统)、SNMP(简单网络管理协议)、DNS(主域名称系 
                            统)、TFTP(通用文件传输协议)等. 
                            
                           
                          
                            (2) 
                            TCP/IP四层模型 
                            TCP/IP协议与低层的数据链路层和物理层无关,这也是TCP/IP的重要特点 
                          
                          
                            (3)网络层与运输层的区别: 
                            在TCP/TP协议族中, 
                            网络层IP提供的是一种不可靠的服务。它只是尽可能快地把分组从源节点送到目的节点,但不提供任何可靠性的保证。 
                            Tcp在不可靠的ip层上,提供了一个可靠的运输层,为了提供这种可靠的服务,TCP采用了超时重传、发送和接受端到端的确认分组等机制。 
                          
                          
                            (4)除了层的数量之外,开放式系统互联(OSI)模型与TCP/IP协议有什么区别? 
                            开放式系统互联模型是一个参考标准,解释协议相互之间应该如何相互作用。 
                            TCP/IP协议是美国国防部发明的,是让互联网成为了目前这个样子的标准之一。 
                            开放式系统互联模型中没有清楚地描绘TCP/IP协议,但是在解释TCP/IP协议时很容易想到开放式系统互联模型。两者的主要区别如下: 
                            TCP/IP协议中的应用层处理开放式系统互联模型中的第五层、第六层和第七层的功能。 
                            TCP/IP协议中的传输层并不能总是保证在传输层可靠地传输数据包,而开放式系统互联模型可以做到。TCP/IP协议还提供一项名为UDP(用户数据报协议)的选择。UDP不能保证可靠的数据包传输。 
                          
                      3、分层优点 
                          
                            (1)人们可以很容易的讨论和学习协议的规范细节。 
                            (2)层间的标准接口方便了工程模块化。 
                            (3)创建了一个更好的互连环境。 
                            (4)降低了复杂度,使程序更容易修改,产品开发的速度更快。 
                            (5)每层利用紧邻的下层服务,更容易记住各层的功能。 
                          
                          
                            大多数的计算机网络都采用层次式结构,即将一个计算机网络分为若干层次: 
                          
                          
                            处在高层次的系统仅是利用较低层次的系统提供的接口和功能,不需了解低层实现该功能所采用的算法和协议;较低层次也仅是使用从高层系统传送来的参数。 
                          
                          
                            这就是层次间的无关性。因为有了这种无关性,层次间的每个模块可以用一个新的模块取代,只要新的模块与旧的模块具有相同的功能和接口,即使它们使用的算法和协议都不一样。 
                          
                          
                            网络中的计算机与终端间要想正确的传送信息和数据,必须在数据传输的顺序、数据的格式及内容等方面有一个约定或规则,这种约定或规则称做协议。 
                          
                          
                       
                            第二部分:Socket 
                          
                          
                            一、socket介绍 
                            网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。 
                          
                          
                            建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。 
                          
                          
                            Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。 
                          
                          
                            在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原义那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 
                            有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。 
                          
                          
                            Socket非常类似于电话插座。以一个国家级电话网为例,电话的通话双方相当于相互通信的2个进程,区号是它的网络地址;区内一个单位的交换机相当于一台主机,主机分配给每个用户的局内号码相当于Socket号。任何用户在通话之前,首先要占有一部电话机,相当于申请一个Socket;同时要知道对方的号码,相当于对方有一个固定的Socket。然后向对方拨号呼叫,相当于发出连接请求(假如对方不在同一区内,还要拨对方区号,相当于给出网络地址)。假如对方在场并空闲(相当于通信的另一主机开机且可以接受连接请求),拿起电话话筒,双方就可以正式通话,相当于连接成功。双方通话的过程,是一方向电话机发出信号和对方从电话机接收信号的过程,相当于向Socket发送数据和从socket接收数据。通话结束后,一方挂起电话机相当于关闭Socket,撤消连接。 
                          
                          
                            二、socket编程 
                          
                          
                            创建Socket 
                            三个步骤: 
                           (1)创建socket对象 
                           (2)引入socket模块 
                           (3)使用socket函数的两个参数: 
                          
                            第一个参数:Address Family: 
                            *AF_INET:internet进程通信 
                            *AF_UNIX:用于同一台机器进程间通信 
                            实际工作中使用AF_INET 
                          
                          
                            第二个参数:Type: 
                            *SOCK_STREAM:流式套接字,主要用于TCP协议 
                            *SOCK_DGRAM:数据包套接字,主要用于UDP 
                          
                          
                     
                            三、UDP基础 
                            1、概念 
                            用户数据报协议,是一个无连接的简单的面向数据报的传输层协议。 
                            UDP不提供可靠性,他只是把应用程序传给IP层的数据报发送出来,但是不能保证他们到达目的地。 
                            由于UDP在传输数据报前不用在客户和服务器之间建立连接,并且没有超时重发机制,所以速度很快。 
                          
                        2、用于方向 
                          
                            屏幕广播(投影屏幕),QQ,微信,SNMP(简单网络管理协议),TFTP(简单文件传送),DNS(域名解释) 
                          
                         
                            3、使用模块 
                            Socket 
                          
                         
                            四、使用UDP 
                         1、通信步骤 
                            
                           
                          服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。 
                          
                         
                            2、UTP发送消息 
                            (1)引入Socket模块 
                            有一个Socket的模块,引入的时候为了方便,将模块中所有的内容都进行引入。 
                           实例:from socket import * 
                          
                          
                            (2)创建套接字 
                            创建一个UDP套接字,第一个参数传递:AF_INET (),internet网络进程通讯。第二个参数传递:SOCK_DGRAM(数据报套接字,主要用于UDP)。 
                            实例:udp_Socket = socket(AF_INET,SOCK_DGRAM) 
                          
                          
                            (3)准备官方地址 
                            一般自己做都是自己发给自己玩,所以先用cmd输入ipconfig查看一下自己的ip,然后自定义一个没有使用的端口。 
                            定义元组,存储IP地址和端口号,第一个元素是lIP地址,第二个元素是端口号。 
                           实例:ipaddress=s(’10.10.16.194’,8888) 
                          
                          
                            (4)从键盘中获取数据 
                            从键盘中获取元素,在键盘中输出要发送的内容。 
                            实例:send_data = input('请输入要发送的数据') 
                          
                          
                            (5)发送数据 
                            将数据处理后发送到程序中去,udpSocket.sendto()函数。 
                            第一个参数传递:采集的数据,如果需要处理要进行处理: 
                            一般变量、标量默认为unicode字符,在上传的时候不识别这些标量,但是我们使用时一般使用utf-8或者gbk,所以,数据要经过处理,对象.encode("utf-8") 
                            第二个参数传递:要上传的官方地址 
                            实例:udpSocket.sendto(data.encode('utf-8'),ipaddress) 
                          
                          
                            (6)关闭资源 
                            在使用资源后要关闭资源,免得内存造成浪费 
                            实例:udpSocket.close() 
                          
                          
                            Utp发送实例: 
                             
                        
                            3、UTP接受消息 
                            有了接收后,UDP就可以收发数据,进行互动了,在发送数据的后面加上接收数据,接收数据与发送数据相差不大 
                            (1)接收数据 
                            等待对方接收数据,如果没有收到数据则会阻塞等待,只到收到数据。 
                            get_data = udp_socket.recvfrom(218) 
                            传递一个参数:参数是接收数据的最大字节数,默认是16字节 
                          
                          
                            (2)接收的结果 
                            接收到数据的结果是一个元组,元组中的第一个元素是接收的数据,元组中的第二个元素是发送方的IP地址和端口号,接收过来的数据需要进行解码,如果不解码,那么默认是16进制数据, 
                            print(get_data[0].decode('utf-8')), 
                            print(get_data[1]) 
                          
                          
                            Utp收发实例: 
                             
                    
                            4、绑定端口 
                            (1)原因 
                            在我们收发信息的时候,接收数据的时候,端口是经常变化的,对收发数据并不是很方便,所以,对接收时候的端口进行统一。 
                          
                          
                            (2)创建一个官方地址 
                            就像发送数据一样,创建一个元组。 
                            元组内两个元素,第一个元素是IP地址,第二个元素是端口号(固定的)。 
                            Local_address = ('10.10.16.194',9999) 
                          
                          
                            (3)锁定端口 
                            使用bind方法: 
                            udpSocket.bind(local_address) 
                          
                          
                            绑定端口实例: 
                              
                      
                            五、实例训练:模拟微信聊天 
                            通过收发绑定的学习,我们已经可以完成一个小的聊天程序 
                            首先我们在pycharm建立两个py文件。 
                            一个是接收消息的py文件,并回复: 
                            UpdReceive.py 
                              
                          
                            另一个是发送消息的py文件: 
                            Udpsend.py 
                              
                          
                            然后运行两个程序: 
                           在updsend里输入你好 
                            
                          在updReceive里会显示,并回复一个我好 
                        
                          再回到updSend,并回复一个大家好 
                           
                          再回到updreceive: 
                             
                          这时候发现个问题,我们用udpsend给udprecrive发送信息时,updreceive里显示发送端的ip为('10.10.16.194', 
                            54475),这是因为我们没有给发送端绑定端口,10.10.16.194是我电脑的ip,我自己给自己发所以ip不会变。端口因为send端没有绑定,所以计算机随机分配了一个端口给send端。 
                          
                         
                            六、实例训练:模拟微信聊天升级版 
                            上个程序有个缺陷,就是必须一问一答,那如何做到真的想微信那样,像发送几条就发送几条呢? 
                            这时候就需要借助上节课的线程来实现了。 
                            还是两个py文件:两个文件是一模一样的,好比你手机的微信和别人手机的微信发信息,可怜我只有一个人,只能自己编辑两个文件,自娱自乐。 
                            UpdReceive.py 
                              
                           Udpsend.py 
                            
                          都运行后,就可以实现无限收发了 
                            
                            |