本节我们讨论下python中的网络编程,基本内容包括
TCP/UDP协议
套接字socket
TCP编程
UDP编程
阅读大约需耗时5min,请合理安排阅读时间。
TCP/UDP协议
TCP和UDP都是OSI七层模型中传输层协议,简单来说就是扔包,携带着源计算机IP地址和端口号,以及目标计算机IP地址和端口号。
TCP是面向连接的协议,会经过3次握手建立可靠的连接,保证数据完整顺序到达目标地址。UDP是面向无连接的协议,使用UDP时无需建立连接,只需知道对方IP地址和端口,就可以直接扔包,UDP虽传输数据不可靠(相对而言)但传输速度较快。
套接字socket
网络通信基本都是使用socket,俗称套接字,类似文件句柄,套接字是一个通信句柄,用来实现不同程序、不同计算机(虚拟机)之间的通信。
#coding:utf-8import socketsc = socket.socket(socket.AF_INET,socket.SOCK_STREAM)sc.bind(('127.0.0.1',8080))sc.listen(5)while True: conn,addr = sc.accept() data = conn.recv(1024) print(addr,data) conn.sendall(b'HTTP/1.1 200 OK\r\n\r\n'+'你好,小麦'.encode(encoding='GBK')) conn.close()
上面我们使用socket模块创建socket,这里模拟的是服务端程序。例如我们上网浏览网页,就是通过浏览器请求服务器资源,浏览器可以称之为客户端,浏览器地址栏url就是服务器资源路径。我们使用浏览器访问127.0.0.1:8080可以看到如下响应。
TCP编程
上面我们是使用socket创建TCP服务端程序,使用浏览器充当客户端进行访问,模拟两个程序之间通信。我们也可以通过socket创建TCP客户端程序,直接用socket请求服务端地址。
import socketclient = socket.socket(socket.AF_INET,socket.SOCK_STREAM)client.connect(('127.0.0.1',8080))msg='我是小麦'client.send(msg.encode(encoding='utf-8'))recv = client.recv(1024).decode(encoding='utf-8')print(recv)client.close()
运行程序我们可以看到服务端收到了客户端发来的数据,客户端收到了服务端的响应数据。
对比上面的程序,可以看到TCP服务端创建socket之后基本就3个步骤,1、绑定ip,port 2、打开监听 3、等待接收客户端连接 4、使用连接后的socket收发数据;客户端程序相对更简单,创建socket之后,直接连接connect目标ip,port,使用socket收发数据。
UDP编程
UDP不是面向连接的,客户端可以直接向目标服务器扔包,服务端只需绑定地址套接字,然后静静等待客户端扔包过来。UDP数据传输不可靠只是相对而言的,很多应用都是在UDP的基础上加一些确认机制,毕竟UDP的占用资源少,传输速度快。
下面我们使用UDP模拟上面的TCP的服务端和客户端程序。
import socketserver = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)server.bind(('127.0.0.1',9000))msg,addr = server.recvfrom(1024)print(msg.decode())server.sendto('udp server'.encode(),addr)server.close()import socketclient = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)client.sendto('udp client'.encode(),('127.0.0.1',9000))print(client.recv(1024).decode())client.close()
注意这里server使用的是recvfrom方法接收UDP数据,返回客户端请求数据以及客户端连接地址(IP和端口)。client发送数据时也不需要connect连接操作,直接向目标服务器地址发送数据即可。
精彩评论