网络编程是使用域名、IP地址、端口连接到另一台计算机上对应的程序,按照规定的协议(数据格式)来交换数据。网络编程主要做的工作就是在发送端把信息通过规定好的协议进行组装包,在接收端按照规定好的协议把包进行解析,从而提取出对应的信息,本质就是计算机设备之间的数据交换,这里的网络,常指的也是计算机网络。
什么是计算机网络?
计算机网络是不同地理位置的独立自主的计算机及外部设备,通过通信线路互联而成的系统的总称,计算机网络实现了多台计算机之间的信息传递和资源共享。简单地说,计算机网络就是以通信和共享资源为目的相互连接的计算机集合。
面对海量的计算机用户,计算机网络是如何准确完整快速地将某个资源传输到指定的计算机上的呢?就像送快递一样,总得有个“地址”吧,这个地址就是“IP地址+端口号”,IP号是定位网络上计算机的唯一标识(localhost),一个IP地址下可以开几万个不同的端口(Port),可以同时用不同端口收发数据,相当于多个进程同时处理网络上的数据,那这些进程是通过什么规则保持互不干扰的呢?
网络通信协议
网络通信协议是实现网络通信的基础,是计算机网络上通信的计算机都必须遵守的约定。我们今天使用的因特网的基础是TCP/IP协议簇,其中就包含重要的TCP用户传输协议、UDP用户数据报协议。
TCP:全称传输控制协议,它是基于IP提供的寻址和路由服务而建立起来的负责实现端到端可靠传输的协议。它保证了三件事:
数据不传丢不传错匹配控制数据发送者和接收者之间的传输速度控制避免网络拥塞
套接字编程
套接字可以理解为用C语言写成的应用程序开发库,可以用于网络编程。而Python可以基于套接字来使用传输层提供的传输服务,并基于此开发网络应用。
TCP套接字:使用TCP协议提供的传输服务来实现网络通信的编程接口。在Python中可以通过创建socket对象并指定type属性为SOCK_STREAM来使用TCP套接字。将套接字对象绑定到IP地址和端口上(端口是IP的扩展,用以区分计算机上的不同服务)。下面的代码实现了一个提供时间日期的服务器。
fromsocketimportsocket,SOCK_STREAM,AF_INETfromdatetimeimportdatetimedefmain()
1.创建套接字对象并指定使用哪种传输服务#family=AF_INET-IPv4地址#family=AF_INET6-IPv6地址#type=SOCK_STREAM-TCP套接字#type=SOCK_DGRAM-UDP套接字#type=SOCK_RAW-原始套接字server=socket(family=AF_INET,type=SOCK_STREAM)#2.绑定IP地址和端口(端口用于区分不同的服务)#同一时间在同一个端口上只能绑定一个服务否则报错server.bind((..1.2,))#3.开启监听-监听客户端连接到服务器#参数可以理解为连接队列的大小server.listen()print(服务器启动开始监听...)whileTrue
4.通过循环接收客户端的连接并作出相应的处理(提供服务)#accept方法是一个阻塞方法如果没有客户端连接到服务器代码不会向下执行#accept方法返回一个元组其中的第一个元素是客户端对象#第二个元素是连接到服务器的客户端的地址(由IP和端口两部分构成)client,addr=server.accept()print(str(addr)+连接到了服务器.)#5.发送数据client.send(str(datetime.now()).encode(utf-8))#6.断开连接client.close()if__name__==__main__:main()
下面的代码实现了一个提供时间日期的客户端。
fromsocketimportsocketdefmain()
1.创建套接字对象默认使用IPv4和TCP协议client=socket()#2.连接到服务器(需要指定IP地址和端口)client.connect((..1.2,))#3.从服务器接收数据print(client.recv().decode(utf-8))client.close()if__name__==__main__:main()
UDP套接字:UDP是轻便级的传输协议,与TCP协议相比,少了对传输可靠性和可达性的承诺,但因此性能会更高,UDP套接字是使用UDP协议创建网络应用实现网络通信的编程接口。
那什么是网络应用呢?指的是浏览器中使用的程序软件,需要通过互联网进行操作。常见的网络应用有:1.电子邮件;2.远程登陆;3.网上聊天......如下是简单实现发送短信功能的程序。
importurllib.parseimport