Python的网络编程

  • 网络协议:计算机网络中互相通信的对等实体之间交换信息时所必须遵守的规则的集合

  • 网络模型:

    • 七层模型-七层

      • 物理层

        • 实际最终信号的传输是通过物理层实现的。通过物理介质传输比特流。规定了电平、速度和电缆针脚。常用设备有(各种物理设备)集线器、中继器、调制解调器、网线、双绞线、同轴电缆。这些都是物理层的传输介质。
      • 数据联络层

        • 将比特组合成字节,再将字节组合成帧,使用链路层地址 (以太网使用MAC地址)来访问介质,并进行差错检测。

          数据链路层又分为2个子层:逻辑链路控制子层(LLC)和媒体访问控制子层(MAC)。

          ​ MAC子层处理CSMA/CD算法、数据出错校验、成帧等;LLC子层定义了一些字段使上次协议能共享数据链路层。 在实际使用中,LLC子层并非必需的。

      • 网络层

        • 本层通过IP寻址来建立两个节点之间的连接,为源端的运输层送来的分组,选择合适的路由和交换节点,正确无误地按照地址传送给目的端的运输层。就是通常说的IP层。这一层就是我们经常说的IP协议层。IP协议是Internet的基础。
      • 传输层

        • 传输层建立了主机端到端的链接,传输层的作用是为上层协议提供端到端的可靠和透明的数据传输服务,包括处理差错控制和流量控制等问题。该层向高层屏蔽了下层数据通信的细节,使高层用户看到的只是在两个传输实体间的一条主机到主机的、可由用户控制和设定的、可靠的数据通路。我们通常说的,TCP UDP就是在这一层。端口号既是这里的“端”。
      • 会话层

        • 会话层就是负责建立、管理和终止表示层实体之间的通信会话。该层的通信由不同设备中的应用程序之间的服务请求和响应组成。
      • 表示层

        • 表示层提供各种用于应用层数据的编码和转换功能,确保一个系统的应用层发送的数据能被另一个系统的应用层识别。如果必要,该层可提供一种标准表示形式,用于将计算机内部的多种数据格式转换成通信中采用的标准表示形式。数据压缩和加密也是表示层可提供的转换功能之一。
      • 应用层

        • OSI参考模型中最靠近用户的一层,是为计算机用户提供应用接口,也为用户直接提供各种网络服务。我们常见应用层的网络服务协议有:HTTP,HTTPS,FTP,POP3、SMTP等。

    • 四层模型-实际应用

      • 链路层
      • 网络层
      • 传输层
      • 应用层

    • 每一层都有相应的协议负责交换信息或者协同工作

    • TCP/IP协议族

      • 是一个四层协议系统,自底而上分别是数据链路层、网络层、传输层和应用层。每一层完成不同的功能,

        且通过若干协议来实现,上层协议使用下层协议提供的服务。

    • IP地址
      • 负责在网络上唯一定位的一个机器,相当于互联网的门派号,根据IP地址查找到你的位置
      • IP地址分为ABCDE类
        • 国际上做出规定,正常使用ABC类,D、E类用作科研或者其他不开放使用,客户级一般在局域网中相互间通信,一般采用自己配置IP地址,与局域网内其他客户机通信
      • 是由四个数字段组成,每个数字段的取值是0-255
      • 192.168.xxx.xxx:局域网IP
      • 127.0.0.1:本机
      • IPv4,IPv6
    • 端口

      • 范围:0-65535
        • 知名端口:0-1023
        • 非知名端口:1024-
    • TCP/IP协议

      • UDP:非安全的不面向链接的传输

        • 安全性差
        • 大小限制64kb
        • 没有限制
        • 速度快
      • TCP

        • 基于链接的通信
        • 无差错,不丢失
        • 用于传输大量数据(流模式)
        • 速度慢,建立连接需要开销较多(时间,系统资源)
      • SOCKET编程

        • socket(套接字):是一个网络通信的断电,能实现不同主机的进程通信
        • 通过IP+端口定位对方并发送消息的通信机制
        • 分为TCP/UDP
        • 客户端Client:因特定请求而联系服务器,并发送必要的数据,然后等待服务器的回应,最后完成请求或给出故障的原因
        • 服务器端Server:为一个或者多个客户端提供所需的服务,他存在唯一的目的就是等待客户端的请求,并响应提供服务服务,然后等待更多请求
      • UDP编程

        • Server端流程

          • 建立socket,socket是负责具体通信的一个实例
          • 绑定,为创建的socket指派固定的端口和IP地址
          • 接受对方发送内容
          • 给对方发送反馈,此步骤非必须步骤
        • Client端流程

          • 建立通信的socket
          • 发送内容到指定服务器
          • 接受服务器给定的反馈内容
        • 服务器案例

          import socket
          
          # 创建一个服务器端函数
          def Serverfunc():
          
              # 第一步:建立socket
              # socket.AF_INET:使用ipv4协议族
              # socket.SOCK_DGRM:使用UDP通信
              sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
          
              # 第二步:绑定ip和port(端口)
              # 127.0.0.1在这里指的是机器本身,在使用中是服务器的ip地址
              # 9527:是随手指定的端口号
              # 地址是一个tuple类型,包含ip和port
              addr = ("127.0.0.1", 7056)
              sock.bind(addr)
          
          
              # 第三步,接受对方的消息
              # 等待的方式为死等,没有其他可能性,因为服务器是一直运行的
              # recvfrom接受的返回值是一个tuple,前一项标识接收的数据,后一项标识地址
              # recvfrom里面的参数表示缓冲区大小
              data, addr = sock.recvfrom(1024)
          
              # 将接收到的数据进行解码
              # 发送过来的格式是字节码格式,通过decode方法可以解码为str格式
              # decode的默认格式是utf-8
              text = data.decode("UTF-8")
          
              # 给对方发送的消息是
              rsp = "hello,client"
          
              # 发送的消息要是字节码格式,所以要将返回给客户端的消息进行编码
              data = rsp.encode("UTF-8")
          
              #利用sendto进行发送
              sock.sendto(data,addr)
          
          
          if __name__ == "__main__":
              print("server starting.......")
              Serverfunc()
              print("server ending........")
          
          
        • 客户端案例

          import socket
          
          
          
          # 创建一个客户端函数
          def clientFunc():
              # 第一步:建立socket
              # socket.AF_INET:使用ipv4协议族
              # socket.SOCK_DGRM:使用UDP通信
              sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
          
              # 第二步,将制定内容发送到服务器
              text = "Hello,Server"  # 创建发送的内容
              data = text.encode("UTF-8")  # 将发送的内容进行编码,encode()方法默认格式为utf-8
              sock.sendto(data,("127.0.0.1",7056))
          
              #第三步 接受服务器给定的反馈内容
              data,addr = sock.recvfrom(1024)
              #将接受的内容进行解码
              data = data.decode("UTF-8")
              #将接受的内容进行打印
              print(data)
          
          if __name__ == "__main__":
              print("client strating........")
              clientFunc()
              print("client ending........")
          
          
        • 服务器要求永远运行,一般运用死循环处理

        • 改造服务器代码

          if __name__ == "__main__":
              print("server starting.......")
              #添加死循环
              while True:
                #添加try
                try:
                  Serverfunc()
                except Exception as e:
                    print(e)
              print("server ending........")
          
          
      • TCP编程:

        • 面向链接的传输,即每次传输之前需要先建立一个连接

        • 客户端和服务器端两个程序需要编写

        • Server端的编写流程

          • 建立socket负责具体通信,这个socket其实只负责接受对方的请求,真正通信是链接后的通道
          • 绑定端口和地址
          • 监听介入访问socket
          • 接受访问的socket,可以理解接受访问即建立了一个通讯的链接通路
          • 接受对方的发送内容,利用接受到socket接受内容
          • 如果有必要,给对方发送反馈信息
          • 关闭链接通路
          • 服务器端案例
          #导入socket模块
          import socket
          #导入时间模块
          from time import ctime
          
          #创建服务器端函数
          def serverFunc():
              #第一步 建立socket具体负责通信
              #AF_INET:含义同UDP一致
              #SOCK_STREAM:表明使用的是TCP通信
              soc = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
          
              #第二步 绑定端口地址
              addr = ("127.0.0.1", 54659) #此地址信息是一个元组类型,字符创表示的是ip,第二部分表示的是端口
              soc.bind(addr)            #利用bind方法将端口和地址绑定到socket上
          
              #第三步 监听介入访问的socket
              soc.listen()  #里面的参数表示连接被转接或者拒绝钱,传入连接请求最大值
          
              #创建while循环,保证服务器永久运行
              while True:
                  try:
                      #第四步 接受访问的socke
                      print("等待连接....")
                      cil,addr = soc.accept() #接受访问的连接
                      print("访问from:", addr)
          
                      #第五步  接受TCP客户端的消息
                      data = soc.recv(1024)
                      #将消息进行解码,转换成str格式
                      data = data.decode("UTF-8")
                      #打印接受到的消息
                      print(data)
          
                      #第六步  给对方发送反馈消息
                      rst = "msg:[%s],time:[%s]" % ("Hello Server..",ctime())
                      cil.send(rst.encode("UTF-8"))
          
                      #第七步 关闭链接通道
                      cil.close()
                      print("Ending Server....")
          
                  except Exception as e:
                      print(e)
          
          
          if __name__ == "__main__":
              print("Starting Server...")
              serverFunc()
          
          
        • Client端编写流程

          • 建立通信socket
          • 链接对方,请求跟对方建立通路
          • 发送内容到对方服务器
          • 接受对方的反馈
          • 关闭链接通路
          • 客户端案例
          import socket
          from time import ctime
          
          #创建客户端函数
          def clientFunc():
              #1.建立通信socket
              soc = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
              host = "127.0.0.1"
              post = 54659
              addr = (host,post)
              #2.链接对方,请求跟对方建立通路
              print(addr)
              soc.connect(addr)
          
              #3.大宋内容到对方服务器
              msg = "msg:[%s],time:[%s]" % ("Hello Server..",ctime())
              #进行编码,并发送
              soc.sendall(msg.encode("UTF-8"))
          
              #4.接受对方反馈
              rst =soc.recv(1024)
              print(rst.decode("UTF-8"))
          
              #5.关闭链接
              soc.close()
              print("Ending client")
          
          if __name__ == "__main__":
              print("Strating client.....")
              clientFunc()
          
          

你可能感兴趣的:(Python进阶)