python web开发 网络编程 TCP/IP UDP协议

简介: 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)



image.pngimage.png


4. TCP编程


主动发起连接的是:客户端

被动响应连接的是:服务器


4.1 创建TCP服务器


1.创建套接字

2.bind 绑定 IP 和 端口

3.listen socket 可以被动连接

4.accept 等待客户端连接

5.recv / send 接收发送数据

例子:使用 socket 模块,通过客户端浏览器 向 本地服务器(127.0.0.1) 发起请求;服务器接到请求,向浏览器发送 hello world

import socket
host = "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("客户端连接关闭")

image.png

服务器启动成功, 等待客户端连接...
客户端连接成功, 地址: ('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 socket
s = 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":
        break
    s.send(send_data.encode("utf-8"))
    recvData = s.recv(1024).decode("utf-8")  # 最大接收1024字节
    print("接收到的数据:", recvData)
s.close()

image.png



4.3 简易聊天工具


服务端

import socket
host = 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":
        break
    info = sock.recv(1024).decode()
sock.close()
s.close()

客户端

import socket
s = 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':
        break
    info = s.recv(1024).decode()
    print("收到服务器的数据:", info)
s.close()

image.png



5. UDP编程


UDP 面向消息的协议,无需建立连接,传输是不可靠的,一般用于:


语音广播,视频,聊天软件,TFTP(简单文件传送),SNMP(简单网络管理协议),RIP(路由信息协议),DNS(域名解释)


5.1 创建UDP服务器


例子:在客户端输入摄氏温度,发送给服务器,转换为华氏温度,发送给客户端显示

import socket
s = 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 socket
s = 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()

image.png

相关文章
|
18天前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
205 55
|
28天前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
153 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
13天前
|
域名解析 缓存 网络协议
Web基础与HTTP协议
通过掌握这些基础知识和技术,开发者可以更加高效地构建和优化Web应用,提供更好的用户体验和系统性能。
64 15
|
4天前
|
算法 网络协议 Python
探秘Win11共享文件夹之Python网络通信算法实现
本文探讨了Win11共享文件夹背后的网络通信算法,重点介绍基于TCP的文件传输机制,并提供Python代码示例。Win11共享文件夹利用SMB协议实现局域网内的文件共享,通过TCP协议确保文件传输的完整性和可靠性。服务器端监听客户端连接请求,接收文件请求并分块发送文件内容;客户端则连接服务器、接收数据并保存为本地文件。文中通过Python代码详细展示了这一过程,帮助读者理解并优化文件共享系统。
|
10天前
|
监控 网络协议 网络性能优化
不再困惑!一文搞懂TCP与UDP的所有区别
本文介绍网络基础中TCP与UDP的区别及其应用场景。TCP是面向连接、可靠传输的协议,适用于HTTP、FTP等需要保证数据完整性的场景;UDP是无连接、不可靠但速度快的协议,适合DNS、RIP等对实时性要求高的应用。文章通过对比两者在连接方式、可靠性、速度、流量控制和数据包大小等方面的差异,帮助读者理解其各自特点与适用场景。
|
20天前
|
存储 网络协议 安全
用于 syslog 收集的协议:TCP、UDP、RELP
系统日志是从Linux/Unix设备及网络设备生成的日志,可通过syslog服务器集中管理。日志传输支持UDP、TCP和RELP协议。UDP无连接且不可靠,不推荐使用;TCP可靠,常用于rsyslog和syslog-ng;RELP提供可靠传输和反向确认。集中管理日志有助于故障排除和安全审计,EventLog Analyzer等工具可自动收集、解析和分析日志。
|
28天前
|
机器学习/深度学习 人工智能 算法
深度学习入门:用Python构建你的第一个神经网络
在人工智能的海洋中,深度学习是那艘能够带你远航的船。本文将作为你的航标,引导你搭建第一个神经网络模型,让你领略深度学习的魅力。通过简单直观的语言和实例,我们将一起探索隐藏在数据背后的模式,体验从零开始创造智能系统的快感。准备好了吗?让我们启航吧!
70 3
|
2月前
|
网络安全 Python
Python网络编程小示例:生成CIDR表示的IP地址范围
本文介绍了如何使用Python生成CIDR表示的IP地址范围,通过解析CIDR字符串,将其转换为二进制形式,应用子网掩码,最终生成该CIDR块内所有可用的IP地址列表。示例代码利用了Python的`ipaddress`模块,展示了从指定CIDR表达式中提取所有IP地址的过程。
55 6
|
2月前
|
机器学习/深度学习 自然语言处理 语音技术
Python在深度学习领域的应用,重点讲解了神经网络的基础概念、基本结构、训练过程及优化技巧
本文介绍了Python在深度学习领域的应用,重点讲解了神经网络的基础概念、基本结构、训练过程及优化技巧,并通过TensorFlow和PyTorch等库展示了实现神经网络的具体示例,涵盖图像识别、语音识别等多个应用场景。
67 8
|
2月前
|
网络协议 网络性能优化 数据处理
深入解析:TCP与UDP的核心技术差异
在网络通信的世界里,TCP(传输控制协议)和UDP(用户数据报协议)是两种核心的传输层协议,它们在确保数据传输的可靠性、效率和实时性方面扮演着不同的角色。本文将深入探讨这两种协议的技术差异,并探讨它们在不同应用场景下的适用性。
71 4

热门文章

最新文章