运维开发网

python3高级系列04:网络编程

运维开发网 https://www.qedev.com 2021-02-27 08:29 出处:51CTO 作者:mb5fdb0a4002420
本节我们讨论下python中的网络编程,基本内容包括TCP/UDP协议套接字socketTCP编程UDP编程阅读大约需耗时5min,请合理安排阅读时间。TCP/UDP协议TCP和UDP都是OSI七层模型中传输层协议,简单来说就是扔包,携带着源计算机IP地址和端口号,以及目标计算机IP地址和端口号。TCP是面向连接的协议,会经过3次握手建立可靠的连接,保证数据完整顺序到达目标地址。UDP是面向无连接

本节我们讨论下python中的网络编程,基本内容包括

  1. TCP/UDP协议

  2. 套接字socket

  3. TCP编程

  4. UDP编程

阅读大约需耗时5min,请合理安排阅读时间。

python3高级系列04:网络编程

python3高级系列04:网络编程

TCP/UDP协议

TCP和UDP都是OSI七层模型中传输层协议,简单来说就是扔包,携带着源计算机IP地址和端口号,以及目标计算机IP地址和端口号。

TCP是面向连接的协议,会经过3次握手建立可靠的连接,保证数据完整顺序到达目标地址。UDP是面向无连接的协议,使用UDP时无需建立连接,只需知道对方IP地址和端口,就可以直接扔包,UDP虽传输数据不可靠(相对而言)但传输速度较快。

python3高级系列04:网络编程

python3高级系列04:网络编程

套接字socket

网络通信基本都是使用socket,俗称套接字,类似文件句柄,套接字是一个通信句柄,用来实现不同程序、不同计算机(虚拟机)之间的通信。

#coding:utf-8

import socket

sc = 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可以看到如下响应。

python3高级系列04:网络编程

python3高级系列04:网络编程

python3高级系列04:网络编程

TCP编程

上面我们是使用socket创建TCP服务端程序,使用浏览器充当客户端进行访问,模拟两个程序之间通信。我们也可以通过socket创建TCP客户端程序,直接用socket请求服务端地址。

import socket

client = 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收发数据。

python3高级系列04:网络编程

python3高级系列04:网络编程

UDP编程

UDP不是面向连接的,客户端可以直接向目标服务器扔包,服务端只需绑定地址套接字,然后静静等待客户端扔包过来。UDP数据传输不可靠只是相对而言的,很多应用都是在UDP的基础上加一些确认机制,毕竟UDP的占用资源少,传输速度快。

下面我们使用UDP模拟上面的TCP的服务端和客户端程序。

import socket

server = 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 socket

client = 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连接操作,直接向目标服务器地址发送数据即可。

扫码领视频副本.gif

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号