文章目录

  • 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服务器

  1. 创建套接字
  2. bind 绑定 IP 和 端口
  3. listen socket 可以被动连接
  4. accept 等待客户端连接
  5. 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协议相关推荐

  1. QT入门第七天 网络编程TCP/IP/UDP+Http和JSON解析+qt事件软键盘【CSDN最详细】

    网络编程+Http和JSON解析+qt事件软键盘 第一章 QT中的网络编程 [1]涉及到的类 [2]tcp协议的流程 [2.1]服务器的流程 socket-->bind-->listen- ...

  2. python web开发 网络编程 HTTP协议、Web服务器、WSGI接口

    文章目录 1. HTTP协议 2. Web服务器 3. 静态服务器 创建 web_server.py 4. WSGI 接口 4.1 CGI 通用网关接口 4.2 WSGI 4.3 定义 WSGI 接口 ...

  3. java socket ip_JAVA 网络编程 TCP/IP、Socket 和协议设计

    [JAVA 网络编程 TCP/IP.Socket 和协议设计] TCP/IP 协议简介 IP 首先我们看 IP(Internet Protocol)协议.IP 协议提供了主机和主机间的通信. 为了完成 ...

  4. WinSock API网络编程——TCP/IP协议详解

     WinSock API网络编程--TCP/IP协议(http://www.impcas.ac.cn/usr/lujun/browse.asp?id=winsock_tcp)            ...

  5. 网络编程-TCP/IP协议栈-TCP协议

    TCP协议 TCP协议作用 TCP协议位于协议栈的传输层.当应用层向TCP层发送用于网间传输的,用8字节表示的数据流,TCP则吧数据流分割成适当长度的报文段,最大传输段大小(MSS)通常受到改计算机连 ...

  6. 网络编程-TCP/IP协议栈-IP协议

    协议 协议就是约定的一种规则,例如扑克游戏中约定好的各种规则,2<3<4<5<-等,以此作为游戏规则.当所有人都遵循这个规则,那么久可以不需要任何多余的交流就可以进行游戏,这个 ...

  7. python(18):网络编程(七层协议+tcp/udp+socket编程)

    Python作为最热门的语言,使我们每个人应该学习的一门技术! 本文针对初学者,我会用最容易的方式告诉你如何入门python! 一.基本网络概念 1.计算机之间如何进行联机 早期: 以太网:局域网与交 ...

  8. Python网络编程——TCP与UDP

    Python网络编程 TCP(复杂可靠)与UDP(简单不可靠)的区别 1) TCP提供面向连接的传输,通信前要先建立连接(三次握手机制): UDP提供无连接的传输,通信前不需要建立连接. 2) TCP ...

  9. 编写tcp服务器发送hex格式_Android网络编程-TCP/IP协议

    在Android网络编程-计算机网络基础一文中得知,IP协议属于网络层,TCP.UDP协议属于传输层. IP协议是TCP/IP协议族的动力,它为上层协议提供无状态.无连接.不可靠的服务. TCP协议是 ...

最新文章

  1. 项目经验分享——Java常用工具类集合 转
  2. mxnet 显存配置,cpu过高配置
  3. 华为云计算之快照技术
  4. indigo egit
  5. 30 个 Pandas技巧,加速你的数据分析处理速度!
  6. 4月第1周业务风控关注 |国家广播电视总局发布《未成年人节目管理规定》
  7. Linux 系统应用编程——出错处理(errno)
  8. 计算机应用类型分类 余额宝属于,按计算机应用的类型分类,余额宝属于。
  9. 彻底理解SESSION
  10. 用正则验证用户输入文本框的内容是否是中文汉字
  11. 电商微商已死、视商来袭
  12. [文摘20080311]五笔口诀
  13. 电脑CPU型号是什么意思?
  14. ubuntu下alphapose 需要的配置小记
  15. Hadoop是什么,主要有哪些优势?
  16. pythonbmi代码_用python写一个BMI体制指数测试
  17. 【流畅的Python学习笔记】2023.4.21
  18. Dynamics CRM2011 在Visual Studio中开启Javascript的Xrm.Page智能提示
  19. js如何往数组Array中添加删除元素
  20. 字节跳动原来这么容易就能进去…

热门文章

  1. 装机之MBR和GPT
  2. replaceselection();java'_Java JTextComponent.replaceSelection方法代码示例
  3. oracle rds 运维服务_从运维的角度分析使用阿里云数据库RDS的必要性–你不应该在阿里云上使用自建的MySQL/SQL Server/Oracle/PostgreSQL数据库...
  4. webgl获取鼠标形状_三模无线搭配对称手型设计,游戏致胜利器,ROG烈刃2无线鼠标...
  5. alsa 测试 linux_Electron 构建步骤 (Linux)
  6. 大数据之MapReduce详解(MR的运行机制及配合WordCount实例来说明运行机制)
  7. C语言综合期末作业,内蒙古农业大学2010年期末c语言综合作业.doc
  8. php imap 附件,学习猿地-PHP-imap 使用参考
  9. java打印的globa类l_Spring异常集中处理和日志集中打印
  10. linux内核的I2C子系统详解5——i2c_driver的注册、i2c_client的来源