壹、互连网协议
python,
壹、互联网协议
客户端/服务器架设
1.硬件C/S架构(打印机)
二.软件C/S架构(互连网中到处是C/S架构):B/S架构也是C/S架构的壹种,B/S是浏览器/服务器
C/S架构与socket的涉嫌:大家用socket正是为着落成C/S架构的支付
osi七层
引子:
事项2个完好的微型Computer连串是由硬件、操作系统、应用软件3者结合,具备了那四个尺码,一台计算机种类就足以本身跟本身玩了(打个单机游戏,玩个扫雷啥的)
比方你要跟外人一齐玩,那您就须要上网了,什么是网络?
网络的主干正是由一批协议组成,协议正是正统,比如全世界人通讯的正规是意大利共和国语
假设把计算机比作人,互连网球组织议正是Computer界的乌克兰语。全数的微型计算机都学会了互连网球协会议,那全部的微处理器都就可以遵守统壹的科班去收发新闻之所以做到通讯了。
人人依照分工分裂把网络球协会议从逻辑上划分了层级,
详尽网络通讯原理:http://www.cnblogs.com/linhaifeng/articles/5937962.html
为啥学习socket一定要先读书网络球组织议?
首先C/S架构是依据互联网通讯的
然后互连网的主导即一群互联网协议,也正是说道正式。若是你想付出一款基于网络通讯的软件,就无法不依据这个标准
socke层
二、socket是什么?
socket是应用层与TCP/IP协议通讯的中游软件抽象层,它是壹组接口。在设计格局中,Socket其实便是三个外衣格局,它把纷纭的TCP/IP协议族隐藏在Socket接口前面,对用户来讲,壹组大致的接口正是任何,让Socket去协会数量,以符合钦赐的合计。
为此,我们无需深切掌握tcp/udp协议,socket已经为我们封装好了,我们只须求遵照socket的规定去编制程序,写出的主次自然便是遵纪守法tcp/udp标准的。
三、基于TCP和UDP协议的socket
套接字的分类:
基于文件类型的套接字家族:AF_UNIX(在Unix系统上,1切皆文件,基于文件的套接字调用的正是底层的文件系统来取数据,四个套接字进度同时运转在同一机器,能够经过走访同一个文件系统直接完成通讯)
基于网络项目标套接字家族:AF_INET
(python支持诸多样地点家族,不过由于大家只关心互联网编制程序,所以超过一半时候大家只利用AF_INET)
套接字的做事流程:
上面大家举个打电话的小例子来验证一下
一旦您要给您的2个朋友打电话,先拨号,朋友听到对讲机铃声后谈到电话,这时你和你的情人就建立起了一而再,就足以出口了。等沟通甘休,挂断电话停止此番交谈。 生活中的场景就解释了那职业原理。
(如果您去一家餐饮店就餐,假使何地的组长正是服务端,而你自个儿正是客户端,当您去用餐的时候,你一定的明亮格外饭店,也便是服务端的地址吧,可是对于你协调的话,客栈的COO不供给知道您的地点吧)
套接字函数
1 import socket
2 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
3 # 1.服务端套接字函数
4 phone.bind('主机ip地址',端口号) #绑定到(主机,端口号)套接字
5 phone.listen() #开始TCP监听
6 phone.accept() #被动接受TCP客户的连接,等待连接的到来
劳务端套接字函数
1 2.客户端套接字函数
2 import socket
3 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#买手机
4 phone.connect() #主动连接服务端的ip和端口
5 phone.connect_ex() #connect()函数的扩展版本,出错的时候返回错码,而不是抛出异常
365体育网站,客户端套接字函数
1 3.服务端和客户端的公共用途的嵌套字函数
2 phone.recv() #接受TCP数据
3 phone.send() #发送TCP数据
4 phone.recvfrom() #接受UDP数据
5 phone.sendto() #发送UDP数据
6 phone.getpeername() #接收到当前套接字远端的地址
7 phone.getsockname() #返回指定套接字的参数
8 phone.setsockopt() #设置指定套接字的参数
9 phone.close() #关闭套接字
服务端和客户端的公共用途的嵌套字函数
1 面向锁的套接字方法
2 phone.setblocking() #设置套接字的阻塞与非阻塞模式
3 phone.settimeout() #设置阻塞套接字操作的超时时间
4 phone.gettimeout() #得到阻塞套接字操作的超时时间
面向锁的套接字方法
1 面向文件的套接字函数
2 phone.fileno() # 套接字的文件描述符
3 phone.makefile() #创建一个与该套接字相关的文件
面向文件的套接字函数
TCP是基于链接的,必须先运营服务器,然后再开发银行客户端去链接服务端
服务端:
1 import socket
2 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#买手机
3 phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #可以多次启动
4 #执行多次的时候会报错,那么怎么办呢、?就在绑卡前面加上上面那句setsockopt方法就ok了
5 phone.bind(('192.168.20.44',8080))#绑定手机卡(ip,端口)
6 # 端口号在1024以前的是系统用的,1024以后的都是你自己写的程序去定义的端口
7
8 print('starting run......')
9 phone.listen(5) #开机 5代表的是最多挂起5个,也可以好多个
10 while True: #链接循环
11 coon,client_addr=phone.accept()#等待接电话,(coon是建立的链接,客户端的ip和端口号组成的元组)
12 print(coon,client_addr)
13
14 #收发消息
15 while True: #通信循环
16 try: #如果不加try...except ,就会报错,因为它不知道你什么时候断开链接的,服务器还以为你在运行
17 data = coon.recv(1024) #收了1024个字节的消息
18 print('client data 收到消息:%s'%data.decode('utf-8'))
19 coon.send(data.upper()) #发消息
20 except Exception: #因为你不知道客户端什么时候断开链接,
21 break
22 coon.close() #挂电话
23 phone.close() #关机
24
25
26 # 处理逻辑错误的两种方式:
27 # if 判断
28 # try...except 异常处理
29 # 异常处理
30 # 当你知道直接错误的条件时就用if判断了
31 # 当程序错误一定发生,但是你又预知不了它出错的条件是什么的时候,就用try...except
服务端
客户端:
1 import socket
2 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#买手机
3 phone.connect(('192.168.20.44',8080)) #直接连接服务端的ip和端口
4
5 # 发收消息
6 while True:
7 msg = input('>>:').strip() #用户输入
8 if not msg:continue #如果为空就继续输
9 phone.send(msg.encode('utf-8')) # 发送你输入的消息
10 # phone.send('hello'.encode('utf-8'))
11 data = phone.recv(1024) #在接收一下
12 print('server back res服务端返回结果:>>%s'%data.decode('utf-8'))
13
14 phone.close()
客户端
注意:
借使你在重启服务端的时候可能境遇这么的主题材料:
本条是出于您的服务端如故存在4回挥手的time_wait状态在挤占地址(假使不懂,请深入钻研1.tcp1次握手,伍回挥手
贰.syn洪流攻击
三.服务器高并发意况下会有恢宏的time_wait状态的优化措施)。那么怎么消除吗?你也能够那样的
1 #加入一条socket配置,重用ip和端口
2
3 phone=socket(AF_INET,SOCK_STREAM)
4 phone.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #就是它,在bind前加
5 phone.bind(('127.0.0.1',8080))
四、基于TCP协议模拟ssh远程实践命令
1 import socket
2 import subprocess
3 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#买手机
4 phone.bind(('192.168.20.44',8081))#绑定手机卡
5 phone.listen(5)#阻塞的最大个数
6 print('starting....')
7 while True:
8 conn,addr=phone.accept()#等待连接
9 print(addr,conn)
10 while True:
11 cmd=conn.recv(10240)#接收的最大值
12 # if not cmd :break
13 print('接收的是:%s'%cmd.decode('utf-8'))
14 #处理过程
15 res=subprocess.Popen(cmd.decode('utf-8'),shell=True, #Popen是执行命令的方法
16 stdout=subprocess.PIPE,
17 stderr=subprocess.PIPE )
18 stdout=res.stdout.read()
19 stuerr=res.stderr.read()
20 conn.send(stdout+stuerr)
21 conn.close()
22 phone.close()
服务端
1 import socket
2
3 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
4 phone.connect(('192.168.20.44',8081))#绑定端口
5 while True:
6 cmd=input('>>请输入').strip()
7 if not cmd: continue
8 phone.send(cmd.encode('utf-8'))
9 data=phone.recv(10240)
10 print('返回的是%s'%data.decode('gbk'))
11 phone.close()
客户端
5、subprocess子进度模块
1 import subprocess
2 #Popen方法是用来执行系统命令的,直接把结果打印到终端了
3 res =subprocess.Popen(r'dir',shell=True,
4 #r'dsfsdfr',shell=True,
5 # stdin= #标准输入(不常用)
6 stdout=subprocess.PIPE,#stdout 标准输出
7 stderr=subprocess.PIPE) #stderr 标准错误
8 # 拿到的是‘gbk’编码的结果,
9 # 这个命令可能有正确结果,也可能有错误结果
10 print(res.stdout.read().decode('gbk'))
11 print('========')
12 print(res.stdout.read().decode('gbk')) #说明只能读一次
13 print(res.stderr.read().decode('gbk')) #如果是错误的就会提
subprocess模块
http://www.bkjia.com/Pythonjc/1223623.htmlwww.bkjia.comtruehttp://www.bkjia.com/Pythonjc/1223623.htmlTechArticlepython, 一、互联网协议 客户端/服务器架构1.硬件C/S架构(打字与印刷机)
二.软件C/S架构(互连网中随地是C/S架构):B/S框架结构也是C/S架构的1种,…
客户端/服务器架设
1.硬件C/S架构(打印机)
二.软件C/S框架结构(网络中四处是C/S框架结构):B/S架构也是C/S架构的一种,B/S是浏览器/服务器
C/S架构与socket的关系:大家用socket便是为了做到C/S架构的付出
osi七层
引子:
事项2个完整的Computer体系是由硬件、操作系统、应用程式三者结合,具有了那四个原则,一台Computer系列就足以协调跟自身玩了(打个单机游戏,玩个扫雷啥的)
设若您要跟别人一齐玩,那你就必要上网了,什么是网络?
互连网的基本就是由一批协议组成,协议就是明媒正娶,比如全球人通讯的科班是斯洛伐克语
只要把计算机比作人,互连网球组织议就是Computer界的丹麦语。全体的微处理器都学会了网络球协会议,那具备的处理器都就足以依据联合的规范去收发音讯之所以产生通讯了。
人们依据分工分裂把网络球组织议从逻辑上划分了层级,
详细互连网通信原理:http://www.cnblogs.com/linhaifeng/articles/5937962.html
缘何学习socket一定要先读书互连网球协会议?
首先C/S架构是基于互联网通讯的
然后互连网的宗旨即一群互联网协议,也等于切磋正式。假如你想付出1款基于网络通讯的软件,就务须遵守那么些标准
socke层
二、socket是什么?
socket是应用层与TCP/IP协议通讯的中间软件抽象层,它是1组接口。在设计方式中,Socket其实就是2个门面形式,它把复杂的TCP/IP协议族隐藏在Socket接口前面,对用户来讲,一组轻易的接口正是全部,让Socket去组织数据,以符合钦定的磋商。
故而,大家无需深刻精晓tcp/udp协议,socket已经为大家封装好了,大家只必要依据socket的规定去编制程序,写出的次第自然就是依照tcp/udp标准的。
三、基于TCP协议的socket
套接字的归类:
基于文件类型的套接字家族:AF_UNIX(在Unix系统上,1切皆文件,基于文件的套接字调用的便是底层的文件系统来取数据,三个套接字进度同时运维在同一机器,能够透过走访同1个文件系统直接完结通讯)
基于网络项指标套接字家族:AF_INET
(python辅助很两种地址家族,可是由于大家只关切互连网编程,所以大多数时候大家只行使AF_INET)
套接字的劳作流程:
上边大家举个打电话的小例子来说澳优下
设若你要给您的三个情侣打电话,先拨号,朋友听到电话铃声后聊到电话,那时你和您的心上人就确立起了连接,就能够说话了。等调换截至,挂断电话甘休此次交谈。 生活中的场景就表达了这工作规律。
(若是您去一家酒馆用餐,倘若哪儿的小业主便是服务端,而你协调正是客户端,当您去吃饭的时候,你早晚的精晓格外酒店,也正是服务端的地点吧,可是对于你自个儿的话,茶馆的小业主不须要驾驭您的地点吧)
套接字函数
1 import socket
2 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
3 # 1.服务端套接字函数
4 phone.bind('主机ip地址',端口号) #绑定到(主机,端口号)套接字
5 phone.listen() #开始TCP监听
6 phone.accept() #被动接受TCP客户的连接,等待连接的到来
服务端套接字函数
1 2.客户端套接字函数
2 import socket
3 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#买手机
4 phone.connect() #主动连接服务端的ip和端口
5 phone.connect_ex() #connect()函数的扩展版本,出错的时候返回错码,而不是抛出异常
客户端套接字函数
1 3.服务端和客户端的公共用途的嵌套字函数
2 phone.recv() #接受TCP数据
3 phone.send() #发送TCP数据
4 phone.recvfrom() #接受UDP数据
5 phone.sendto() #发送UDP数据
6 phone.getpeername() #接收到当前套接字远端的地址
7 phone.getsockname() #返回指定套接字的参数
8 phone.setsockopt() #设置指定套接字的参数
9 phone.close() #关闭套接字
服务端和客户端的共用用途的嵌套字函数
1 面向锁的套接字方法
2 phone.setblocking() #设置套接字的阻塞与非阻塞模式
3 phone.settimeout() #设置阻塞套接字操作的超时时间
4 phone.gettimeout() #得到阻塞套接字操作的超时时间
面向锁的套接字方法
1 面向文件的套接字函数
2 phone.fileno() # 套接字的文件描述符
3 phone.makefile() #创建一个与该套接字相关的文件
面向文件的套接字函数
TCP是基于链接的,必须先运营服务器,然后再开发银行客户端去链接服务端
服务端:
1 import socket
2 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#买手机
3 phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #可以多次启动
4 #执行多次的时候会报错,那么怎么办呢、?就在绑卡前面加上上面那句setsockopt方法就ok了
5 phone.bind(('192.168.20.44',8080))#绑定手机卡(ip,端口)
6 # 端口号在1024以前的是系统用的,1024以后的都是你自己写的程序去定义的端口
7
8 print('starting run......')
9 phone.listen(5) #开机 5代表的是最多挂起5个,也可以好多个
10 while True: #链接循环
11 coon,client_addr=phone.accept()#等待接电话,(coon是建立的链接,客户端的ip和端口号组成的元组)
12 print(coon,client_addr)
13
14 #收发消息
15 while True: #通信循环
16 try: #如果不加try...except ,就会报错,因为它不知道你什么时候断开链接的,服务器还以为你在运行
17 data = coon.recv(1024) #收了1024个字节的消息
18 print('client data 收到消息:%s'%data.decode('utf-8'))
19 coon.send(data.upper()) #发消息
20 except Exception: #因为你不知道客户端什么时候断开链接,
21 break
22 coon.close() #挂电话
23 phone.close() #关机
24
25
26 # 处理逻辑错误的两种方式:
27 # if 判断
28 # try...except 异常处理
29 # 异常处理
30 # 当你知道直接错误的条件时就用if判断了
31 # 当程序错误一定发生,但是你又预知不了它出错的条件是什么的时候,就用try...except
服务端
客户端:
1 import socket
2 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#买手机
3 phone.connect(('192.168.20.44',8080)) #直接连接服务端的ip和端口
4
5 # 发收消息
6 while True:
7 msg = input('>>:').strip() #用户输入
8 if not msg:continue #如果为空就继续输
9 phone.send(msg.encode('utf-8')) # 发送你输入的消息
10 # phone.send('hello'.encode('utf-8'))
11 data = phone.recv(1024) #在接收一下
12 print('server back res服务端返回结果:>>%s'%data.decode('utf-8'))
13
14 phone.close()
客户端
注意:
1旦你在重启服务端的时候大概遇见这么的难点:
这几个是由于您的服务端如故存在7次挥手的time_wait状态在挤占地址(假使不懂,请深切研究1.tcp一次握手,柒遍挥手
2.syn洪流攻击
3.服务器高并发景况下会有大气的time_wait状态的优化措施)。那么怎么化解吧?你也足以那样的
1 #加入一条socket配置,重用ip和端口
2
3 phone=socket(AF_INET,SOCK_STREAM)
4 phone.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #就是它,在bind前加
5 phone.bind(('127.0.0.1',8080))
四、基于TCP协议模拟ssh远程试行命令
1 import socket
2 import subprocess
3 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#买手机
4 phone.bind(('192.168.20.44',8081))#绑定手机卡
5 phone.listen(5)#阻塞的最大个数
6 print('starting....')
7 while True:
8 conn,addr=phone.accept()#等待连接
9 print(addr,conn)
10 while True:
11 cmd=conn.recv(10240)#接收的最大值
12 # if not cmd :break
13 print('接收的是:%s'%cmd.decode('utf-8'))
14 #处理过程
15 res=subprocess.Popen(cmd.decode('utf-8'),shell=True, #Popen是执行命令的方法
16 stdout=subprocess.PIPE,
17 stderr=subprocess.PIPE )
18 stdout=res.stdout.read()
19 stuerr=res.stderr.read()
20 conn.send(stdout+stuerr)
21 conn.close()
22 phone.close()
服务端
1 import socket
2
3 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
4 phone.connect(('192.168.20.44',8081))#绑定端口
5 while True:
6 cmd=input('>>请输入').strip()
7 if not cmd: continue
8 phone.send(cmd.encode('utf-8'))
9 data=phone.recv(10240)
10 print('返回的是%s'%data.decode('gbk'))
11 phone.close()
客户端
六、基于UDP协议的socket
1 from socket import *
2 udp_server = socket(AF_INET,SOCK_DGRAM)
3 udp_server.bind(('127.0.0.1',8080)) #绑定
4 while True:#通讯循环
5 msg,client_addr= udp_server.recvfrom(1024)
6 print('收到的消息是:%s'%msg.decode('utf-8'))
7 udp_server.sendto(msg.upper(),client_addr)
8 udp_server.close()
服务端
1 # udp 无链接,所以不需要连接
2 from socket import *
3 udp_client = socket(AF_INET,SOCK_DGRAM)
4
5 while True:
6 msg = input('>>:').strip()
7 udp_client.sendto(msg.encode('utf-8'),('127.0.0.1',8080))
8 res,sever_addr = udp_client.recvfrom(1024)
9 print('返回的结果是:%s'%res.decode('utf-8'))
10 udp_client.close()
客户端
基于UDP协议的socket的应用(模拟QQ聊天)
1 from socket import *
2 udp_server= socket(AF_INET,SOCK_DGRAM)
3 udp_server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
4 udp_server.bind(('127.0.0.1',8080))
5 print('start running...')
6
7 while True:
8 qq_msg,addr = udp_server.recvfrom(1024)
9 print('来自[%s:%s]的一条消息:\033[44m%s\033[0m'%(addr[0],addr[1],qq_msg.decode('utf-8')))
10 back_msg = input('回复消息:>>').strip()
11 udp_server.sendto(back_msg.encode('utf-8'),addr)
12 udp_server.close()
服务端
1 from socket import *
2 udp_client = socket(AF_INET,SOCK_DGRAM)
3 qq_name_dic = {
4 '房得成':('127.0.0.1',8080),
5 '陈凤琴':('127.0.0.1',8080),
6 '王雅玲':('127.0.0.1',8080),
7 '喜洋洋':('127.0.0.1',8080)
8 }
9 while True:
10 qq_name = input('请输入聊天对象:>>').strip()
11 if qq_name not in qq_name_dic: continue
12 while True:
13 msg = input('请输入消息,回车发送:').strip()
14 if msg=='quit':break
15 if not msg or not qq_name or qq_name not in qq_name_dic:continue
16 udp_client.sendto(msg.encode('utf-8'),qq_name_dic[qq_name])
17 back_msg,addr = udp_client.recvfrom(1024)
18 print('来自[%s:%s]的一条消息:\033[41m%s\033[0m'%(addr[0],addr[1],back_msg.decode('utf-8')))
19 udp_client.close()
客户端
运转结果截图
五、subprocess子进度模块
1 import subprocess
2 #Popen方法是用来执行系统命令的,直接把结果打印到终端了
3 res =subprocess.Popen(r'dir',shell=True,
4 #r'dsfsdfr',shell=True,
5 # stdin= #标准输入(不常用)
6 stdout=subprocess.PIPE,#stdout 标准输出
7 stderr=subprocess.PIPE) #stderr 标准错误
8 # 拿到的是‘gbk’编码的结果,
9 # 这个命令可能有正确结果,也可能有错误结果
10 print(res.stdout.read().decode('gbk'))
11 print('========')
12 print(res.stdout.read().decode('gbk')) #说明只能读一次
13 print(res.stderr.read().decode('gbk')) #如果是错误的就会提示
subprocess
六、struct模块
1 #该模块可以把一个类型,如数字,转成固定长度的bytes类型
2 import struct
3 # res = struct.pack('i',12345)
4 # print(res,len(res),type(res)) #长度是4
5
6 res2 = struct.pack('i',12345111)
7 print(res2,len(res2),type(res2)) #长度也是4
8
9 unpack_res =struct.unpack('i',res2)
10 print(unpack_res) #(12345111,)
11 # print(unpack_res[0]) #12345111
struct