云南云桥建设股份有限公司官方网站,做结构图的网站,中国机械采购网,wordpress负载均衡上传附件文章目录1. TCP/IP协议1.1 IP协议1.2 TCP协议2. UDP协议3. Socket4. 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 流式套接字主要用于 TCPsocket.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 是形式为ipaddrport的元组指定远程地址。返回值是发送的字节数。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(bHTTP/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;v99, Chromium;v96, Microsoft Edge;v96
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/xhtmlxml,application/xml;q0.9,image/webp,image/apng,*/*;q0.8,application/signed-exchange;vb3;q0.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;q0.9,en;q0.8,en-GB;q0.7,en-US;q0.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;v99, Chromium;v96, Microsoft Edge;v96
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/svgxml,image/*,*/*;q0.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;q0.9,en;q0.8,en-GB;q0.7,en-US;q0.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()