博客整理day26

python day26

软件开发架构

开发软件,要有一套客户端和一套服务端

​ 服务端:24小时不间断提供服务

​ 客户端:需要访问时,向服务端发起访问

软件开发架构:

C/S架构

Client:客户端

Server:服务端

优点:

​ 软件的使用稳定.并且可以节省网络资源

缺点:

​ 1.若用户想在同一个设备上使用多个软件,必须下载多个客户端

​ 2.软件的每一次更新,客户端也必须跟着更新

B/S架构

Browser: 浏览器(客户端)

Server: 服务端

优点:

​ 以浏览器充当客户端,无需用户下载多个软件,也无需用户下载更新

​ 直接在浏览器上访问软件

缺点:

​ 消耗网络资源过大,当网络不稳定时,软件的使用也会不稳定

互联网协议

互联网协议又称为网络七层协议,OSI七层协议

OSI七层协议:

应用层

表示层

会话层

传输层

传输层:帮助区分子网,以太网的Mac帮我们找到主机

传输层的功能:建立端口到端口的通信

​ 端口号:标识电脑上的某一个软件

​ 端口号范围: 0-65535

开发中常用软件的默认端口号:

​ mysql : 3306

​ mongodb : 27017

​ Django : 8000

​ Tomcat : 8080

​ Flack : 5000

​ Redis : 6379

若想服务端与客户端进行通信,必须要建立连接,产生双向通道

​ 一条是客户端通往服务端发送消息的

​ 另一条是服务端通往客户端发送消息的

TCP工作原理

三次握手

第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SENT状态,等待服务器确认

第二次握手:服务器收到syn包,必须确认客户端的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),此时服务器进入SYN_RECV状态

第三次握手:客户端收到服务器的SYN+ACK包,并向服务器发送ACK确认包,此包发送完毕,客户端和服务器都进入 ESTABLISHED 状态(TCP连接成功)

四次挥手

  1. 客户端进程发送连接释放报文,并且停止发送数据.释放数据报文首部,FIN=1,此时客户端进入FIN-WAIT-1状态
  2. 服务器收到连接释放报文,发送确认报文,ACK=1,ack=u+1,并且带上自己的序列号,此时服务端进入CLOSE-WAIT(关闭等待)状态.客户端收到服务器的确认请求之后,此时,客户端就进入FIN-WAIT-2状态,等待服务器发送连接释放报文(在这之前还需要接收服务器发送的最后数据)
  3. 服务器将所有的数据发送完毕之后,就像客户端发送连接释放报文,FIN=1,ack=u+1.此时服务器进入LAST-ACK(最后确认)状态,等待客户确认
  4. 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,此时客户端就进入了TIME-WAIT(时间等待)状态.(此时TCP连接还没有释放,需经过2MSL的时间后,才进入CLOSED状态).服务器只要收到了客户端发出的确认请求,就立刻进入CLOSED状态

网络层

IP协议:规定网络地址的协议叫IP协议

​ IP地址,用于表示唯一的一台进算计(局域网)的地址

​ IP地址分为:网络部分(标识子网),主机部分(标识主机)

IP:点分十进制

​ 最小值 0,0,0,04

​ 最大值 255,255,255,255

ARP协议功能:广播的方式发送数据包,获取目标主机的Mac地址

协议工作方式:每台主机IP都是已知的

数据链路/层

​ 数据链路层的功能: 定义了电信号的分组(识别电信号)

以太网协议
  1. 规定好电信号数据的分组方式

  2. 每一台连接网线的电脑都必须要由一块'网卡'

    每块网卡都会有一个独一无二的12位编号(mac地址)

    ​ 前六位:厂商号

    ​ 后六位:流水号

交换机:

​ 可以让多台电脑连接到一起

基于以太网协议发送数据:

​ 特点:

​ 广播,单播

​ 弊端:

​ 广播风暴,不能跨局域网通信

互联网:

​ 让局域网之间进行通信

物理连接层

物理层功能:主要是基于电器特性发送高低电压(二进制数据)

Socket

什么是Socket

socket是一个模块,可以用于编写C/S架构的套接字

为什么要是用Socket

socket套接字会封装好各层协议的工作

优点:

​ 可以节省开发成本

Socket的使用

​ 基于TCP开发一款远程CMD程序
客户端连接服务器后,可以向服务器发送命令
服务器收到命令后执行,无论执行是否成功,无论执行几遍,都将执行结果返回给客户端

#客户端
import socket

client = socket.socket()
client.connect(('192.168.13.161',8888))
while True:
    cmd_msg = input('请输入CMD命令:')
    client.send(cmd_msg.encode('utf-8'))

    if cmd_msg == 'q':
        break

    data = client.recv(1024).decode('utf-8')

    print(data)
client.close()
#服务端
import socket
import subprocess

server = socket.socket()
server.bind(('192.168.13.161',8888))
server.listen(3)
conn,addr = server.accept()
while True:
    data = conn.recv(1024).decode('utf8')

    if data == 'q':
        break

    retcode, output = subprocess.getstatusoutput(data)
    print(retcode, output)
    output = output.encode('utf8')

    conn.send(output)

conn.close()
posted @ 2019-10-17 19:08  simple123  阅读(96)  评论(0编辑  收藏  举报