python web开发 网络编程 TCP/IP UDP协议
文章目录
- 1. TCP/IP协议
- 1.1 IP协议
- 1.2 TCP协议
- 2. UDP协议
- 3. Socket
- 4. TCP编程
- 4.1 创建TCP服务器
- 4.2 创建TCP客户端
- 4.3 简易聊天工具
- 5. UDP编程
- 5.1 创建UDP服务器
- 5.2 创建UDP客户端
learning from 《python web开发从入门到精通》
1. TCP/IP协议
大家都用同样的协议 protocol
(沟通语言)才能对话
TCP/IP
协议:
- 应用层:
FTP
文件传输,Telnet
远程登录,DNS
域名系统,SMTP
电子邮件传输…(为用户提供服务) - 传输层:
TCP
传输控制,UDP
用户数据报(端到端通信,保证顺序传输数据和完整性) - 网络层:
IP
网际协议,IGMP
互联网组管理,ICMP
互联网控制报文(主机到主机通信) - 链路层:(监视数据在主机和网络之间的交换)
1.1 IP协议
- 数据被分成小包裹通过 IP包发出,不保证到达,不保证顺序
1.2 TCP协议
- 建立在 IP 协议之上,3次握手,建立可靠连接,保证数据顺序到达
- 丢失,自动重发
- TCP 报文 包含数据,源IP,目标IP,源端口,目标端口
2. UDP协议
- 面向无连接的协议,不需建立连接,只需知道对方 IP 和端口
- 不保证一定到达,但是速度比 TCP 快
3. Socket
- 两个程序要网络通信,都需要使用 Socket 套接字(孔,插座的意思)
- 用于描述 IP 地址 和 端口
- 服务打开一个 Socket,并绑定到一个端口上,不同的端口对应不同的服务
python中的套接字:
s = socket.socket(AddressFamily, Type)
AddressFamily
,填socket.AF_INET
(用于 Internet 进程间通信),填socket.AF_UNIX
(用于同一台机器进程间通信)Type
套接字类型,socket.SOCK_STREAM 流式套接字
(主要用于 TCP),socket.SOCK_DGRAM 数据包套接字
(主要用于 UDP)
常用函数:https://www.runoob.com/python/python-socket.html
函数 | 描述 |
---|---|
服务器端套接字 | |
s.bind() | 绑定地址(host,port)到套接字, 在 AF_INET下,以元组(host,port)的形式表示地址。 |
s.listen() | 开始 TCP 监听。backlog 指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为 1,大部分应用程序设为 5 就可以了。 |
s.accept() | 被动接受TCP客户端连接,(阻塞式)等待连接的到来 |
客户端套接字 | |
s.connect() | 主动初始化TCP服务器连接,。一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。 |
s.connect_ex() | connect()函数的扩展版本,出错时返回出错码,而不是抛出异常 |
公共用途的套接字函数 | |
s.recv() | 接收 TCP 数据,数据以字符串形式返回,bufsize 指定要接收的最大数据量。flag 提供有关消息的其他信息,通常可以忽略。 |
s.send() | 发送 TCP 数据,将 string 中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于 string 的字节大小。 |
s.sendall() | 完整发送 TCP 数据。将 string 中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回 None,失败则抛出异常。 |
s.recvfrom() | 接收 UDP 数据,与 recv() 类似,但返回值是(data,address)。其中 data 是包含接收数据的字符串,address 是发送数据的套接字地址。 |
s.sendto() | 发送 UDP 数据,将数据发送到套接字,address 是形式为(ipaddr,port)的元组,指定远程地址。返回值是发送的字节数。 |
s.close() | 关闭套接字 |
s.getpeername() | 返回连接套接字的远程地址。返回值通常是元组(ipaddr,port)。 |
s.getsockname() | 返回套接字自己的地址。通常是一个元组(ipaddr,port) |
s.setsockopt(level,optname,value) | 设置给定套接字选项的值。 |
s.getsockopt(level,optname[.buflen]) | 返回套接字选项的值。 |
s.settimeout(timeout) | 设置套接字操作的超时期,timeout是一个浮点数,单位是秒。值为None表示没有超时期。一般,超时期应该在刚创建套接字时设置,因为它们可能用于连接的操作(如connect()) |
s.gettimeout() | 返回当前超时期的值,单位是秒,如果没有设置超时期,则返回None。 |
s.fileno() | 返回套接字的文件描述符。 |
s.setblocking(flag) | 如果flag为0,则将套接字设为非阻塞模式,否则将套接字设为阻塞模式(默认值)。非阻塞模式下,如果调用recv()没有发现任何数据,或send()调用无法立即发送数据,那么将引起socket.error异常。 |
s.makefile() | 创建一个与该套接字相关连的文件 |
4. TCP编程
主动发起连接的是:客户端
被动响应连接的是:服务器
4.1 创建TCP服务器
- 创建套接字
bind
绑定 IP 和 端口listen
socket 可以被动连接accept
等待客户端连接recv / send
接收发送数据
例子:使用 socket
模块,通过客户端浏览器 向 本地服务器(127.0.0.1) 发起请求;服务器接到请求,向浏览器发送 hello world
import sockethost = "127.0.0.1" # IP
port = 8080 # 端口
web = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
web.bind((host, port)) # 绑定端口
web.listen(5) # 监听,最多5个连接
print("服务器启动成功, 等待客户端连接...")
while True:conn, addr = web.accept() # 建立客户端连接print("客户端连接成功, 地址:", addr)data = conn.recv(1024) # 获取客户端发送的数据print("接收到客户端发送的数据:", data.decode())conn.sendall(b'HTTP/1.1 200 OK\r\n\r\nHello World, Michael!') # 发送数据给客户端conn.close() # 关闭连接print("客户端连接关闭")
服务器启动成功, 等待客户端连接...
客户端连接成功, 地址: ('127.0.0.1', 7631)
接收到客户端发送的数据: GET / HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="96", "Microsoft Edge";v="96"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36 Edg/96.0.1054.34
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6客户端连接关闭
客户端连接成功, 地址: ('127.0.0.1', 7632)
接收到客户端发送的数据: GET /favicon.ico HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="96", "Microsoft Edge";v="96"
sec-ch-ua-mobile: ?0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36 Edg/96.0.1054.34
sec-ch-ua-platform: "Windows"
Accept: image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: no-cors
Sec-Fetch-Dest: image
Referer: http://127.0.0.1:8080/
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6客户端连接关闭
4.2 创建TCP客户端
客户端比较简单一点
import sockets = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = "127.0.0.1"
port = 8080
s.connect((host, port))
while True:send_data = input("请输入要发送的数据:")if send_data == "exit":breaks.send(send_data.encode("utf-8"))recvData = s.recv(1024).decode("utf-8") # 最大接收1024字节print("接收到的数据:", recvData)
s.close()
4.3 简易聊天工具
服务端
import sockethost = socket.gethostname()
port = 12345
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
s.listen(1)
sock, addr = s.accept()
print('建立连接:', addr)
info = sock.recv(1024).decode()
while info != "byebye":if info:print("收到信息:", info)send_data = input("请输入发送的信息:")sock.send(send_data.encode())if send_data == "byebye":breakinfo = sock.recv(1024).decode()
sock.close()
s.close()
客户端
import sockets = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()
port = 12345
s.connect((host, port))
print("已经连接到服务器")
info = ''
while info != 'byebye':send_data = input("请输入要发送的数据:")s.send(send_data.encode())if send_data == 'byebye':breakinfo = s.recv(1024).decode()print("收到服务器的数据:", info)
s.close()
5. UDP编程
UDP 面向消息的协议,无需建立连接,传输是不可靠的,一般用于:
- 语音广播,视频,聊天软件,TFTP(简单文件传送),SNMP(简单网络管理协议),RIP(路由信息协议),DNS(域名解释)
5.1 创建UDP服务器
例子:在客户端输入摄氏温度,发送给服务器,转换为华氏温度,发送给客户端显示
import sockets = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP套接字
s.bind(('127.0.0.1', 1314))
print('绑定 UDP服务 到 1314 端口')
data, addr = s.recvfrom(1024) # 收到的数据是 byte 类型
data = float(data) * 1.8 + 32
send_data = "转换后的温度(华氏温度):" + str(data)
print("从%s:%s收到请求数据" % addr)
s.sendto(send_data.encode('utf-8'), addr) # 发送数据给客户端
s.close()
5.2 创建UDP客户端
import sockets = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
data = input("请输入要转换的摄氏温度:")
s.sendto(data.encode(), ("127.0.0.1", 1314))
print(s.recv(1024).decode())
s.close()
python web开发 网络编程 TCP/IP UDP协议相关推荐
- QT入门第七天 网络编程TCP/IP/UDP+Http和JSON解析+qt事件软键盘【CSDN最详细】
网络编程+Http和JSON解析+qt事件软键盘 第一章 QT中的网络编程 [1]涉及到的类 [2]tcp协议的流程 [2.1]服务器的流程 socket-->bind-->listen- ...
- python web开发 网络编程 HTTP协议、Web服务器、WSGI接口
文章目录 1. HTTP协议 2. Web服务器 3. 静态服务器 创建 web_server.py 4. WSGI 接口 4.1 CGI 通用网关接口 4.2 WSGI 4.3 定义 WSGI 接口 ...
- java socket ip_JAVA 网络编程 TCP/IP、Socket 和协议设计
[JAVA 网络编程 TCP/IP.Socket 和协议设计] TCP/IP 协议简介 IP 首先我们看 IP(Internet Protocol)协议.IP 协议提供了主机和主机间的通信. 为了完成 ...
- WinSock API网络编程——TCP/IP协议详解
WinSock API网络编程--TCP/IP协议(http://www.impcas.ac.cn/usr/lujun/browse.asp?id=winsock_tcp) ...
- 网络编程-TCP/IP协议栈-TCP协议
TCP协议 TCP协议作用 TCP协议位于协议栈的传输层.当应用层向TCP层发送用于网间传输的,用8字节表示的数据流,TCP则吧数据流分割成适当长度的报文段,最大传输段大小(MSS)通常受到改计算机连 ...
- 网络编程-TCP/IP协议栈-IP协议
协议 协议就是约定的一种规则,例如扑克游戏中约定好的各种规则,2<3<4<5<-等,以此作为游戏规则.当所有人都遵循这个规则,那么久可以不需要任何多余的交流就可以进行游戏,这个 ...
- python(18):网络编程(七层协议+tcp/udp+socket编程)
Python作为最热门的语言,使我们每个人应该学习的一门技术! 本文针对初学者,我会用最容易的方式告诉你如何入门python! 一.基本网络概念 1.计算机之间如何进行联机 早期: 以太网:局域网与交 ...
- Python网络编程——TCP与UDP
Python网络编程 TCP(复杂可靠)与UDP(简单不可靠)的区别 1) TCP提供面向连接的传输,通信前要先建立连接(三次握手机制): UDP提供无连接的传输,通信前不需要建立连接. 2) TCP ...
- 编写tcp服务器发送hex格式_Android网络编程-TCP/IP协议
在Android网络编程-计算机网络基础一文中得知,IP协议属于网络层,TCP.UDP协议属于传输层. IP协议是TCP/IP协议族的动力,它为上层协议提供无状态.无连接.不可靠的服务. TCP协议是 ...
最新文章
- 项目经验分享——Java常用工具类集合 转
- mxnet 显存配置,cpu过高配置
- 华为云计算之快照技术
- indigo egit
- 30 个 Pandas技巧,加速你的数据分析处理速度!
- 4月第1周业务风控关注 |国家广播电视总局发布《未成年人节目管理规定》
- Linux 系统应用编程——出错处理(errno)
- 计算机应用类型分类 余额宝属于,按计算机应用的类型分类,余额宝属于。
- 彻底理解SESSION
- 用正则验证用户输入文本框的内容是否是中文汉字
- 电商微商已死、视商来袭
- [文摘20080311]五笔口诀
- 电脑CPU型号是什么意思?
- ubuntu下alphapose 需要的配置小记
- Hadoop是什么,主要有哪些优势?
- pythonbmi代码_用python写一个BMI体制指数测试
- 【流畅的Python学习笔记】2023.4.21
- Dynamics CRM2011 在Visual Studio中开启Javascript的Xrm.Page智能提示
- js如何往数组Array中添加删除元素
- 字节跳动原来这么容易就能进去…
热门文章
- 装机之MBR和GPT
- replaceselection();java'_Java JTextComponent.replaceSelection方法代码示例
- oracle rds 运维服务_从运维的角度分析使用阿里云数据库RDS的必要性–你不应该在阿里云上使用自建的MySQL/SQL Server/Oracle/PostgreSQL数据库...
- webgl获取鼠标形状_三模无线搭配对称手型设计,游戏致胜利器,ROG烈刃2无线鼠标...
- alsa 测试 linux_Electron 构建步骤 (Linux)
- 大数据之MapReduce详解(MR的运行机制及配合WordCount实例来说明运行机制)
- C语言综合期末作业,内蒙古农业大学2010年期末c语言综合作业.doc
- php imap 附件,学习猿地-PHP-imap 使用参考
- java打印的globa类l_Spring异常集中处理和日志集中打印
- linux内核的I2C子系统详解5——i2c_driver的注册、i2c_client的来源