公海赌船网址B/S架构也是C/S架构的一种,B/S框架结构也是C/S框架结构的1种

一、互联网协议

python,

1、网络协议

客户端/服务器架设

1.硬件C/S架构(打印机)

二.软件C/S架构(互连网中随处是C/S架构):B/S架构也是C/S架构的一种,B/S是浏览器/服务器

C/S框架结构与socket的涉嫌:大家用socket就是为着完结C/S架构的开垦

osi七层

引子:

事项贰个整机的微型Computer种类是由硬件、操作系统、APP三者结合,具备了那四个规格,1台计算机连串就足以自个儿跟自身玩了(打个单机游戏,玩个扫雷啥的)

假若你要跟人家伙同玩,那您就须要上网了,什么是网络?

网络的中坚便是由一批协议组成,协议便是标准,举例满世界人通讯的标准是克罗地亚共和国(Republic of Croatia)语

只要把计算机比作人,网络协议正是Computer界的波兰语。全体的Computer都学会了互连网球组织议,那拥有的Computer都就足以依据联合的正规去收发音讯之所以形成通讯了。

人人依据分工不相同把网络协议从逻辑上划分了层级,

详尽网络通信原理:http://www.cnblogs.com/linhaifeng/articles/5937962.html

干什么学习socket一定要先读书网络球协会议?

  首先C/S架构是依靠互联网通讯的

  然后网络的主导即一批网络协议,也正是说道正式。若是你想付出一款基于网络通讯的软件,就必须根据那么些标准

 公海赌船网址 1

socke层

公海赌船网址 2

二、socket是什么?

socket是应用层与TCP/IP协议通讯的中间软件抽象层,它是一组接口。在设计形式中,Socket其实正是三个外衣方式,它把纷纭的TCP/IP协议族隐藏在Socket接口前面,对用户来讲,一组大概的接口正是任何,让Socket去组织数量,以契合钦赐的合计。

因而,大家不供给深切精晓tcp/udp协议,socket已经为大家封装好了,大家只须要依据socket的规定去编制程序,写出的先后自然正是遵纪守法tcp/udp标准的。

三、基于TCP和UDP协议的socket

套接字的分类:

  基于文件类型的套接字家族:AF_UNIX(在Unix系统上,一切皆文件,基于文件的套接字调用的正是底层的文件系统来取数据,七个套接字进度同时运营在同一机器,能够透过拜访同3个文件系统间接达成通信)

  基于网络项指标套接字家族:AF_INET
 (python援助很种种地方家族,不过由于大家只关注互连网编制程序,所以大部分时候大家只利用AF_INET)

套接字的办事流程:

上面大家举个打电话的小例子来证美赞臣下

倘若你要给您的二个相恋的人打电话,先拨号,朋友听到电话铃声后提及电话,那时你和您的心上人就成立起了接二连三,就能够说话了。等调换甘休,挂断电话甘休此番交谈。 生活中的场景就分解了那工作规律。

(若是您去一家旅舍就餐,假使哪里的COO正是服务端,而你自个儿就是客户端,当您去用餐的时候,你一定的明亮特别客栈,相当于服务端的地址吧,不过对于你和谐的话,客栈的总经理无需知道您的地方吧)

公海赌船网址 3

套接字函数

公海赌船网址 4

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客户的连接,等待连接的到来

服务端套接字函数
公海赌船网址 5

1 2.客户端套接字函数
2 import socket
3 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#买手机
4 phone.connect()  #主动连接服务端的ip和端口
5 phone.connect_ex()  #connect()函数的扩展版本,出错的时候返回错码,而不是抛出异常

客户端套接字函数
公海赌船网址 6

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() #关闭套接字

服务端和客户端的共用用途的嵌套字函数
公海赌船网址 7

1 面向锁的套接字方法
2 phone.setblocking()  #设置套接字的阻塞与非阻塞模式
3 phone.settimeout()  #设置阻塞套接字操作的超时时间
4 phone.gettimeout()  #得到阻塞套接字操作的超时时间

面向锁的套接字方法
公海赌船网址 8

1 面向文件的套接字函数
2 phone.fileno()  # 套接字的文件描述符
3 phone.makefile() #创建一个与该套接字相关的文件

面向文件的套接字函数

TCP是基于链接的,必须先运营服务器,然后再开发银行客户端去链接服务端

服务端:

公海赌船网址 9

 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

服务端

客户端:

公海赌船网址 10

 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()

客户端

 

注意:

倘令你在重启服务端的时候只怕境遇这么的主题素材:

公海赌船网址 11

其一是由于你的服务端还是存在6次挥手的time_wait状态在挤占地址(要是不懂,请深远切磋一.tcp一次握手,六遍挥手
二.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))

4、基于TCP协议模拟ssh远程实行命令

公海赌船网址 12

 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()

服务端
公海赌船网址 13

 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()

客户端

 伍、subprocess子进程模块

公海赌船网址 14

 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, 一、互联网协议 客户端/服务器架构一.硬件C/S架构(打字与印刷机)
贰.软件C/S架构(网络中随处是C/S架构):B/S架构也是C/S架构的一种,…

客户端/服务器架设

1.硬件C/S架构(打印机)

贰.软件C/S架构(互连网中随处是C/S架构):B/S架构也是C/S架构的一种,B/S是浏览器/服务器

C/S架构与socket的涉及:大家用socket便是为了成功C/S架构的付出

osi七层

引子:

须知一个总体的微管理器类别是由硬件、操作系统、APP3者结合,具备了那八个规格,一台微型Computer体系就能够和谐跟自个儿玩了(打个单机游戏,玩个扫雷啥的)

一旦你要跟外人一同玩,那您就供给上网了,什么是互联网?

网络的主干正是由一批协议组成,协议便是正统,比方环球人通讯的正规是克罗地亚语

若是把Computer比作人,互连网球组织议就是Computer界的匈牙利语。全数的Computer都学会了互连网球组织议,那具备的Computer都就足以遵照联合的专门的学业去收发音信之所以变成通讯了。

大家依据分工分裂把网络球组织议从逻辑上划分了层级,

详见网络通讯原理:http://www.cnblogs.com/linhaifeng/articles/5937962.html

怎么学习socket一定要先读书互连网球组织议?

  首先C/S框架结构是依赖互联网通讯的

  然后互联网的为主即一批互联网协议,也正是说道正式。尽管你想付出1款基于网络通讯的软件,就必须服从那些标准

 公海赌船网址 15

socke层

公海赌船网址 16

二、socket是什么?

socket是应用层与TCP/IP协议通讯的中档软件抽象层,它是一组接口。在设计情势中,Socket其实就是一个外衣情势,它把纷纭的TCP/IP协议族隐藏在Socket接口前边,对用户来讲,1组简单的接口正是全数,让Socket去组织数据,以适合钦定的构和。

据此,我们无需深切精通tcp/udp协议,socket已经为大家封装好了,我们只须要根据socket的明确去编制程序,写出的次第自然就是遵照tcp/udp标准的。

三、基于TCP协议的socket

套接字的分类:

  基于文件类型的套接字家族:AF_UNIX(在Unix系统上,壹切皆文件,基于文件的套接字调用的便是底层的文件系统来取数据,四个套接字进度同时运营在同一机器,可以通过拜访同一个文件系统间接完结通讯)

  基于互联网项目标套接字家族:AF_INET
 (python支持很各种位置家族,但是由于我们只关怀互连网编制程序,所以大部分时候大家只使用AF_INET)

套接字的专门的学业流程:

下边大家举个打电话的小例子来验证一下

假定您要给您的三个有恋人打电话,先拨号,朋友听到电话铃声后聊到电话,这时你和您的相恋的人就创制起了两次三番,即可说话了。等交换截至,挂断电话甘休本次交谈。 生活中的场景就解释了那职业规律。

(借令你去一家饭馆用餐,假诺何地的总裁娘就是服务端,而你和谐正是客户端,当你去吃饭的时候,你肯定的敞亮这个茶楼,也正是服务端的地址吧,然则对于你本身来讲,茶楼的首席营业官娘没有供给领会你的地方吧)

公海赌船网址 17

套接字函数

公海赌船网址 18公海赌船网址 19

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客户的连接,等待连接的到来

服务端套接字函数

公海赌船网址 20公海赌船网址 21

1 2.客户端套接字函数
2 import socket
3 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#买手机
4 phone.connect()  #主动连接服务端的ip和端口
5 phone.connect_ex()  #connect()函数的扩展版本,出错的时候返回错码,而不是抛出异常

客户端套接字函数

公海赌船网址 22公海赌船网址 23

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() #关闭套接字

服务端和客户端的集体用途的嵌套字函数

公海赌船网址 24公海赌船网址 25

1 面向锁的套接字方法
2 phone.setblocking()  #设置套接字的阻塞与非阻塞模式
3 phone.settimeout()  #设置阻塞套接字操作的超时时间
4 phone.gettimeout()  #得到阻塞套接字操作的超时时间

面向锁的套接字方法

公海赌船网址 26公海赌船网址 27

1 面向文件的套接字函数
2 phone.fileno()  # 套接字的文件描述符
3 phone.makefile() #创建一个与该套接字相关的文件

面向文件的套接字函数

TCP是依附链接的,必须先运转服务器,然后再开发银行客户端去链接服务端

服务端:

公海赌船网址 28公海赌船网址 29

 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

服务端

客户端:

公海赌船网址 30公海赌船网址 31

 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()

客户端

 

注意:

假定您在重启服务端的时候或许遇见那样的主题素材:

公海赌船网址 32

这些是由于你的服务端依旧存在五次挥手的time_wait状态在挤占地址(倘若不懂,请深切研商壹.tcp一次握手,四遍挥手
二.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远程推行命令

公海赌船网址 33公海赌船网址 34

 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()

服务端

公海赌船网址 35公海赌船网址 36

 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

公海赌船网址 37公海赌船网址 38

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()

服务端

公海赌船网址 39公海赌船网址 40

 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聊天)

公海赌船网址 41公海赌船网址 42

 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()

服务端

公海赌船网址 43公海赌船网址 44

 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()

客户端

运作结果截图

公海赌船网址 45

公海赌船网址 46

伍、subprocess子进度模块

公海赌船网址 47公海赌船网址 48

 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模块

公海赌船网址 49公海赌船网址 50

 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

 

相关文章