Python高级--网络编程(socket)
一、⽹络通信概述
1.What-什么是⽹络
网络是由节点和连线构成,表示诸多对象及其相互联系。在计算机世界里,⽹络就是⼀种辅助双⽅或者多⽅能够连接在⼀起的⼯具。
2.Why-为什么使用网络
就是为了联通多⽅然后进⾏通信⽤的,即把数据从⼀⽅传递给另外⼀⽅前⾯的学习编写的程序都是单机的,即不能和其他电脑上的程序进⾏通信为了让在不同的电脑上运⾏的软件,之间能够互相传递数据,就需要借助⽹络的功能。
总结:
1、 使⽤⽹络能够把多⽅链接在⼀起,然后可以进⾏数据传递
2、 所谓的⽹络编程就是,让在不同的电脑上的软件能够进⾏数据传递,即进程之间的通信
3.协议
网络协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合。
有的说英语,有的说中⽂,有的说德语,说同⼀种语⾔的⼈可以交流,不同的语⾔之间就不⾏了。为了解决不同种族⼈之间的语⾔沟通障碍,现规定国际通⽤语⾔是英语,这就是⼀个规定,这就是协议。
同理,为了解决计算机与计算机之间的信息共享和沟通,我们指定了网络协议用于信息的沟通和传递。
早期的计算机⽹络,都是由各⼚商⾃⼰规定⼀套协议,IBM、Apple和Microsoft都有各⾃的⽹络协议,互不兼容
为了使不同计算机厂家生产的计算机能够相互通信,以便在更大的范围内建立计算机网络,国际标准化组织(ISO)在1978年提出了“开放系统互联参考模型”,即著名的OSI/RM模型(Open System Interconnection/Reference Model)。它将计算机网络体系结构的通信协议划分为七层,自下而上依次为:物理层(Physics Layer)、数据链路层(Data Link Layer)、网络层(Network Layer)、传输层(Transport Layer)、会话层(Session Layer)、表示层(Presentation Layer)、应用层(Application Layer)。
4.常用协议(族)(protocol)
TCP/IP协议毫无疑问是这三大协议中最重要的一个,作为互联网的基础协议,没有它就根本不可能上网,任何和互联网有关的操作都离不开TCP/IP协议。
NetBEUI即NetBios Enhanced User Interface ,或NetBios增强用户接口。它是NetBIOS协议的增强版本,曾被许多操作系统采用,例如Windows for Workgroup、Win 9x系列、Windows NT等。NETBEUI协议在许多情形下很有用,是WINDOWS98之前的操作系统的缺省协议。NetBEUI协议是一种短小精悍、通信效率高的广播型协议。
IPX/SPX协议本来就是Novell开发的专用于NetWare网络中的协议,但是也非常常用--大部分可以联机的游戏都支持IPX/SPX协议,比如星际争霸,反恐精英等等。
5.端⼝(port)
"端口"是英文port的意译,可以认为是设备与外界通讯交流的出入口。端口可分为虚拟端口和物理端口,其中虚拟端口指计算机内部或交换机路由器内的端口,不可见。例如计算机中的80端口、21端口、23端口等。物理端口又称为接口,是可见端口,计算机背板的RJ45网口,交换机路由器集线器等RJ45端口。电话使用RJ11插口也属于物理端口的范畴。
我们网络编程协议中说的是虚拟端口。端⼝就好⼀个房⼦的⻔,是出⼊这间房⼦的必经之路。
如果⼀个进程需要收发⽹络数据,那么就需要有这样的端⼝。在linux系统中,端⼝可以有65535(2的16次⽅减1)个之多!既然有这么多,操作系统为了统⼀管理,所以进⾏了编号,这就是端⼝号
5-1.常见知名端口:
80端⼝分配给HTTP服务 21端⼝分配给FTP服务 443 端口分配给HTTPS服务 |
⼀般情况下,如果⼀个程序需要使⽤知名端⼝的需要有root权限。
5-2.动态端口
动态端⼝的范围是从1024到65535,之所以称为动态端⼝,是因为它⼀般不固定分配某种服务,⽽是动态分配。
动态分配是指当⼀个系统进程或应⽤程序进程需要⽹络通信时,它向主机申请⼀个端⼝,主机从可⽤的端⼝号中分配⼀个供它使⽤。当这个进程关闭时,同时也就释放了所占⽤的端⼝号。
5-3.查看端⼝
⽤“netstat ”查看端⼝状态
netstat -a,查看所有端口
netstat -aon 查看所有端口和进程编号
6.IP地址
6-1.什么是IP地址
IP地址是指互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址),是IP Address的缩写。IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。
6-2.ip地址的作⽤
⽤来在⽹络中标记⼀台电脑的⼀串数字,⽐如114. 114. 114. 114;在网络中的惟⼀性。
6-3.ip地址的分类
早期的IP地址主要指的是IPv4,随着网络的发展IPv4的数量已经不能满足日新月异的网络发展,所以现在IP地址分为两大类:
1、 IPv4
2、 IPv6
6-4.IPv4的分类:
每⼀个IP地址包括两部分:⽹络地址和主机地址
A类IP地址:⼀个A类IP地址由1字节的⽹络地址和3字节主机地址组成,⽹络地址的最⾼位必须是“0”。地址范围1.0.0.1-126.255.255.254,可⽤的A类⽹络有126个,每个⽹络能容纳1677214个主机。
B类IP地址:⼀个B类IP地址由2个字节的⽹络地址和2个字节的主机地址组成,⽹络地址的最⾼位必须是“10”, 地址范围128.1.0.1-191.255.255.254。可⽤的B类⽹络有16384个,每个⽹络能容纳65534主机。
C类IP地址:⼀个C类IP地址由3字节的⽹络地址和1字节的主机地址组成,⽹络地址的最⾼位必须是“110”, 范围192.0.1.1-223.255.255.254。C类⽹络可达2097152个,每个⽹络能容纳254个主机。
D类地址⽤于多点⼴播:D类IP地址第⼀个字节以“1110”开始,它是⼀个专⻔保留的地址,它并不指向特定的⽹络,⽬前这⼀类地址被⽤在多点⼴播(Multicast)中多点⼴播地址⽤来⼀次寻址⼀组计算机。地址范围224.0.0.1-239.255.255.254
E类IP地址:以“1111”开始,为将来使⽤保留。E类地址保留,仅作实验和开发⽤
私有ip:在这么多⽹络IP中,国际规定有⼀部分IP地址是⽤于我们的局域⽹使⽤,也
就是属于私⽹IP,不在公⽹中使⽤的,它们的范围是:
10.0.0.0~10.255.255.255 172.16.0.0~172.31.255.255 192.168.0.0~192.168.255.255 |
特殊IP地址:IP地址127.0.0.1~127.255.255.255⽤于回路测试。如:127.0.0.1可以代表本机IP地址,⽤ http://127.0.0.1 就可以测试本机中配置的Web服务器。
6-5.IPv6:
IPv6是Internet Protocol Version 6的缩写,其中Internet Protocol译为“互联网协议”。IPv6是IETF(互联网工程任务组,Internet Engineering Task Force)设计的用于替代现行版本IP协议(IPv4)的下一代IP协议,号称可以为全世界的每一粒沙子编上一个网址。
由于IPv4最大的问题在于网络地址资源有限,严重制约了互联网的应用和发展。IPv6的使用,不仅能解决网络地址资源数量的问题,而且也解决了多种接入设备连入互联网的障碍。
7.⼦⽹掩码
用来指定IP地址哪些位是⽹络号、哪些是主机号。
⼦⽹掩码只有⼀个作⽤,就是将某个IP地址划分成⽹络地址和主机地址两部分⼦⽹掩码的设定必须遵循⼀定的规则。
与IP地址相同,⼦⽹掩码的⻓度也是32位,
Ø 左边是⽹络位,⽤⼆进制数字“1”表示;
Ø 右边是主机位,⽤⼆进制数字“0”表示。
假设IP地址为“192.168.1.1”⼦⽹掩码为“255.255.255.0”。
其中,“1”有24个,代表与此相对应的IP地址左边24位是网络号; “0”有8个,代表与此相对应的IP地址右边8位是主机号。 这样,子网掩码就确定了⼀个IP地址的32位⼆进制数字中哪些是网络号、哪些是主机号。 这对于采⽤TCP/IP协议的⽹络来说⾮常重要,只有通过子网掩码,才能表明⼀台主机所在网络 |
二、socket简介
1.本地进程间通信
前面我们学习了不同进程间的通信,有很多实现方式:
队列 管道 Manager |
但是以上通信⽅式都是在⼀台机器上不同进程之间的通信⽅式,那么问题来了,如果是两台或者两台以上的电脑进程之间如何通信呢?--答案就是网络通信。
2.⽹络中进程间通信
⾸要解决的问题是如何唯⼀标识⼀个进程,否则通信⽆从谈起!在本地可以通过进程PID来唯⼀标识⼀个进程,但是在⽹络中这是⾏不通的。
其实TCP/IP协议族已经帮我们解决了这个问题,⽹络层的“ip地址”可以唯⼀标识⽹络中的主机,⽽传输层的“协议+端⼝”可以唯⼀标识主机中的应⽤程序(进程)。
这样利⽤ip地址,协议,端⼝ 就可以标识⽹络的进程了,⽹络中的进程通信就可以利⽤这个标志与其它进程进⾏交互。这个就是网络编程,又称为socket编程。
3.什么是socket
socket(简称套接字)是进程间通信的⼀种⽅式,它与其他进程间通信的⼀个主要不同是--它能实现不同计算机间的进程间通信,我们⽹络上各种各样的服务⼤多都是基于Socket 来完成通信的。
例如我们每天浏览⽹⻚、QQ、微信、收发email等等……
4.创建socket
在Python中使⽤socket模块的函数socket就可以完成:
import socket socket.socket(AddressFamily, Type) |
说明:
函数socket.socket 创建⼀个socket,返回该socket 的描述符,该函数带有两个参数:
Ø Address Family:可以选择 AF_INET(⽤于Internet进程间通信)或者AF_UNIX(⽤于同⼀台机器进程间通信),实际⼯作中常⽤AF_INET
Ø Type:套接字类型,可以是SOCK_STREAM(流式套接字,主要⽤于TCP 协议)或者SOCK_DGRAM(数据报套接字,主要⽤于UDP协议)
创建⼀个tcp socket(TCP套接字):
import socket |
创建⼀个tcp socket(UDP套接字):
import socket ss = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) |
我们发现socket创建的时候,需要制定type类型,我们这里写了两种,表示了两种网络编程中最常见的网络协议类型,分别是UDP和TCP,那么什么是UDP和TCP协议呢?它们有什么区别呢?
三、UDP协议
1.什么是UDP协议
UDP (user datagram protocol)---⽤户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。UDP不提供可靠性,它只是把应⽤程序传给IP层的数据报发送出去,但是并不能保证它们能到达⽬的地。由于UDP在传输数据报前不⽤在客户和服务器之间建⽴⼀个连接,且没有超时重发等机制,故⽽传输速度很快。
UDP是⼀种⾯向⽆连接的协议,每个数据报都是⼀个独⽴的信息,包括完整的源地址或⽬的地址,它在⽹络上以任何可能的路径传往⽬的地,因此能否到达⽬的地,到达⽬的地的时间以及内容的正确性都是不能被保证的。
2.UDP特点:
UDP是⾯向⽆连接的通讯协议,UDP数据包括⽬的端⼝号和源端⼝号信息,由于通讯不需要连接,所以可以实现⼴播发送。 UDP传输数据时有⼤⼩限制,每个被传输的数据报必须限定在64KB之内。 UDP是⼀个不可靠的协议,发送⽅所发送的数据报并不⼀定以相同的次序到达接收⽅。
适⽤情况:
UDP是⾯向消息的协议,通信时不需要建⽴连接,数据的传输⾃然是不可靠的,UDP⼀般⽤于多点通信和实时的数据业务,⽐如:
Ø 语⾳⼴播 Ø 视频 Ø QQ(消息,文件的上传下载使用的TCP) Ø TFTP(简单⽂件传送) Ø SNMP(简单⽹络管理协议) Ø RIP(路由信息协议,如报告股票市场,航空信息) Ø DNS(域名解释) |
注重速度流畅,也就是速度为第一位。
UDP操作简单,⽽且仅需要较少的监护,因此通常⽤于局域⽹⾼可靠性的分散系统中client/server应⽤程序。例如视频会议系统,并不要求⾳频视频数据绝对的正确,只要保证连贯性就可以了,这种情况下显然使⽤UDP会更合理⼀些。
3.(1)udp⽹络程序-发送数据
创建⼀个udp客户端程序的流程是简单,具体步骤如下:
1、 创建客户端套接字
2、 发送/接收数据
3、 关闭套接字
实现代码如下:
import socket |
使用一个网络调试助手工具接受数据:
发现数据确实已经发生成功!!
# 1.导入socket模块 import socket # 2.获取socket对象 # socket 方法有两个参数,第一个参数family表示协议族,我们一般使用IPv4 # 第二个参数type表示数据传输时使用的协议,socket.SOCK_DGRAM = UDP,socket.SOCK_STREAM = TCP udp = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM) print(udp) # 这里也可以绑定ip地址和端口号,发放数据一般都不用绑定,由系统自动分配,若绑定则按照bind的端口号 udp.bind(("192.168.13.130", 8081)) # 3.发送资源 第一个参数为发送内容,后面是参数为一个元祖,第一个是要发送数据到的对方ip地址第二个是端口号 # ①在字符串前面加上字母b,转换为字节流 # udp.sendto(b"hello socket in python",("192.168.13.130", 8080)) # ②中文转换为字节流,一般用encode("utf-8")编码,但是网络调试助手暂时不支持,用的是"gbk" udp.sendto("你好,你在干嘛?".encode("gbk"), ("192.168.13.130", 8080)) print("数据发送成功") # 4.关闭资源 udp.close()
3.(2)udp⽹络程序-接受数据
不绑定IP地址和端口
接受数据存在两种情况,第一种就是我们默认不绑定IP地址和端口,有python解释器自动的为我们动态的分配:
代码如下:
import socket |