
十六.Python网络编程
发布日期:2021-05-07 00:20:24
浏览次数:19
分类:技术文章
本文共 5860 字,大约阅读时间需要 19 分钟。
Python网络编程
#网络编程
# osi七层协议#物理层 电缆 光纤 双绞线#链路层 以太网协议#网络层 ICMP IGMP IP(IPV4 IPV6) ARP RARP协议#传输层 TCP UDP协议#会话层 Session#表示层#应用层 应用程序层面#套接字#1.基于文件的套接字 AF_UNIX#2.基于网络的套接字 AF_INET#TCP协议#三次握手 四次挥手#SYN 用与客户端与服务端的连接#ACK 用于客户端与服务器端的信息确认#FIN 用于客户端与服务器端的断开连接#三次握手 用于服务器与客户端的连接#第一次握手 客户端向服务器发出连接请求 >> C->> SYN x>>S#第二次握手 服务器端确认要与客户端建立连接,并且请求与客户端连接 S>> SYN y ACK=+1 >>C #客户端向服务器端的连接建立成功#第三次握手 客户端确认与服务器端建立连接 C>> ACK=+1 >>S #服务器向客户端的连接建立成功# 连接建立成功#TCP协议为什么能够保证数据传输的完整性#TCP协议在传输文件后等待另一端的确认信息,如果没有收到确认接收的信息,会重新发送,直到收到确认已接收的信息为止#所以传输的数据是完整的。#客户端发送数据,服务器端接收到数据,发出ACK确认信息,对客户端说我收到信息了,你继续向我发送数据吧#四次挥手 服务器与客户端双方连接通道关闭#第一次挥手 服务器端数据接收完毕后就会发出Fin请求关闭已建立的连接 S>>Fin y >> C#第二次挥手 客户端发出确认信息确认关闭服务器到客户端建立的连接 C>>ACK>> S 服务器与客户端的连接关闭#第三次挥手 客户端数据接收完毕后就会发出Fin请求关闭已建立的连接 C>>Fin x >>S#第四次挥手 服务器发出确认信息确认关闭服务器到客户端建立的连接 S>>ACK>> C 客户端与服务器端的连接关闭#Socket编程#Socket Socket是TCP和UDP协议封装的接口,通过调用Socket可以完成TCP和UDP的功能#服务器端工作流程#创建socket服务器 server=socket.socket(套接字协议,TCP|UDP协议) //socket.AF_INET,socket.SOCKET_STREAM(TCP协议)#绑定ip和端口地址 server.bind((ip,port))#建立监听该端口的线程数量 server.listen(5)#等待客户端的请求 conn,addr=server.accept()#获取连接与地址#发送信息 conn.send(byte)#接收信息 info=conn.recv(1024) 接收的数据大小#关闭连接 conn.close()#客户端工作流程#创建客户端 client=socket.socket(socket.AF_INET,socket.SOCKET_STREAM)#通过ip和端口号连接服务器 client.conn((ip,port))#发送信息 client.send(byte)# 接收信息 info=socket.recv(1024)#关闭连接 socket.close()#TCP服务器端
#导入socket模块import socket#创建服务器端serverserver=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#server.bind() 服务器绑定要监听的ip和端口号server.bind(("127.0.0.1",8005))#建立监听的进程数量server.listen(6)#开始等待客户端的连接,如果有连接获取与客户端的连接与地址conn,addr=server.accept()#接收客户端发来的信息info=conn.recv(1024)#输出客户端发来的信息print("客户端发来信息:>>%s"%info.decode("utf-8"))#向客户端发送信息,信息必须是二进制数据conn.send("hello".encode(encoding="utf-8"))#服务器端发出请求给客户端要关闭服务器向客户端的连接conn.close()print("服务器端关闭连接!")#关闭服务器端server.close()#TCP客户端
#导入socket模块import socket#创建客户端clientclient=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#client.connect((ip,port)) 客户端与服务器端建立连接client.connect(("127.0.0.1",8005))#client.send() 客户端向服务器端发送信息client.send("你好".encode("utf-8"))#client.recv() 客户端接收服务器端发来的信息info=client.recv(1024)#输出服务器端发来的内容print("服务器端发来信息:>>%s"%info.decode("utf-8"))#客户端请求关闭客户端向服务器端建立的连接client.close()print("客户端关闭连接!")#关闭服务器端client.close()#UDP协议
#服务器端
#UDP#UDP是服务器与客户端的一种网络协议,相对于TCP协议更加高效#UDP协议接收数据不存在粘包问题,因为UDP协议不存在优化算法,所以不存在粘包问题#但是UDP协议是一种不可靠的传输,因为UDP没有三次握手,所以UDP发送的数据不能保证UDP服务器或者客户端能够接收#服务器#server=socket(AF_INET,SOCK_DGRAM) #创建udp服务器#server.bind() #绑定ip与端口#data,addr=server.recvfrom() #接收数据与地址#data.sendto(data,addr) #发送数据到客户端#客户端#client=socket(AF_INET,SOCK_DGRAM) #创建UDP客户端#client.sendto(data,addr) #发送数据#client.recvfrom() #接收服务器的数据#从socket导入所有函数from socket import *#导入时间模块import time#设置服务器监听的ip与端口号ip_port=("127.0.0.1",8005)#设置接收数据的缓冲大小buffer_size=1024#创建udp服务器udp_server=socket(AF_INET,SOCK_DGRAM)#bind() udp服务器绑定ip与端口udp_server.bind(ip_port)#循环接收发送数据报while True: #获取客户端发送的数据,包含内容与客户端地址 data,addr=udp_server.recvfrom(buffer_size) #打印客户端发来的内容 print("客户端%s发来信息>>:%s"%(addr,str(data))) #sendto(data,addr)服务器向客户端回应数据 udp_server.sendto(time.strftime(data.decode("utf-8"),time.localtime()).encode("utf-8"),addr)#UDP 客户端
#导入socket的所有函数from socket import *#设置服务器的ip和端口ip_port=("127.0.0.1",8005)#设置缓冲区的大小buffer_size=1024#获取udp客户端udp_client=socket(AF_INET,SOCK_DGRAM)#循环发送,接收数据报while True: #接收控制台输入 msg=input(">>") #sendto(data,addr) 向服务器发送数据 udp_client.sendto(msg.encode("utf-8"),ip_port) #recvfrom()从服务器接收数据 data=udp_client.recvfrom(buffer_size) #打印从服务器获取的时间数据 print("当前时间为:>>%s"%data.decode("utf-8"))#TCP协议模拟系统命令行
#server
#导入socket模块所有函数from socket import *import subprocess#设置服务器监听的ip和端口ip_port=("127.0.0.1",8005)#设置半连接池的容量back_log=5#设置缓冲区的大小buffer_size=1024#创建服务器server=socket(AF_INET,SOCK_STREAM)#服务器绑定ip与端口号server.bind(ip_port)#监听该端口号server.listen(back_log)#循环监听端口号,为不同的客户端服务while True: try: #获取客户端的连接与客户端的地址 print("服务器等待连接...") conn,addr=server.accept() #循环收发客户端的信息 while True: try: #接收客户端发来的内容 data=conn.recv(buffer_size).decode("utf-8") #如果内容为空,继续下次循环 if not data:break #输出客户端发来的内容 print("客户端发来信息:>>%s"%data) res=subprocess.Popen(data,shell=True,stderr=subprocess.PIPE, stdout=subprocess.PIPE, stdin=subprocess.PIPE) con=res.stderr.read().decode("gbk") if not con: con=res.stdout.read().decode("gbk") if not con: con=">>执行成功!" #向客户端发送信息 conn.send(con.upper().encode("utf-8")) except Exception as e: #遇到错误,打印错误,避免程序崩溃,退出此次循环 print(e) break conn.close() except Exception as e: #客户端异常终止,打印错误,继续下次循环,监听端口,等待下一个客户端的介入 print(e) continue#client
#导入socket的函数from socket import *from functools import partialdef a(client,buffer_size): return client.recv(buffer_size)#设置服务器的ip和端口ip_port=("127.0.0.1",8005)#设置缓冲区buffer_size=1024#获取TCP客户端client=socket(AF_INET,SOCK_STREAM)#连接TCP服务器client.connect(ip_port)#循环收发信息while True: try: #输入发送信息 msg=input(">>") #输入quit退出程序 if msg=="quit": break #向服务器发送信息 client.send(msg.encode("utf-8")) #接收TCP服务器发来的内容 while True: data=client.recv(buffer_size) # 输出服务器发来的信息 print("服务器发来信息:>>%s" % data.decode("utf-8")) #如果此次接收的数据大小小于buffersize,就相当于此次是最后的数据 if len(data)
发表评论
最新留言
感谢大佬
[***.8.128.20]2025年04月03日 22时49分58秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Accessing Excel Spreadsheets via C++
2019-03-04
excel上传核心
2019-03-04
json.parse细节
2019-03-04
redis
2019-03-04
ReID基础 | ReID工程中的一些小trick
2019-03-04
LINQ之Single,SingleOrDefault
2019-03-04
OpenCV6边缘检测[Canny算法]
2019-03-04
Hadoop_Scala操作Hbase
2019-03-04
Scala_1.控制台打印,变量定义,函数定义
2019-03-04
十五.Python异常处理
2019-03-04
c++备考期末必须看的知识点(一篇就够了)
2019-03-04
qt中初始化界面的几种方法
2019-03-04
【图论】游乐场
2019-03-04
【图论】【最短路】USACO 2.4 牛的旅行 (最短路)
2019-03-04
【图论】【最短路】工厂的烦恼
2019-03-04
C语言初阶——指针
2019-03-04
[88]. 合并两个有序数组(C语言)
2019-03-04
最全环境搭建-常用软件安装
2019-03-04
Linux 安装 MySql
2019-03-04
系统架构
2019-03-04