• Day33、基于udp的套接字、socketserver模块、关于进程的简单介绍


    一、基于UDP的套接字

    UDP协议:

      UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。UDP在IP报文的协议号是17。UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议

    UDP套接字示例:

    服务端:

    import socket
    
    server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # SOCK_DGRAM基于UDP协议
    server.bind(('127.0.0.1', 8765))
    while True:
        data, client_addr = server.recvfrom(1024)
        print(data.decode('utf-8'))
        server.sendto(data.upper(), client_addr)
    
    server.close()

    客户端:

    import socket
    client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)#SOCK_DGRAM基于UDP协议
    
    while True:
        msg = input(">>:").strip()
        client.sendto(msg.encode('utf-8'),('127.0.0.1',8765))
        data,server_addr = client.recvfrom(1024)
        print(data.decode('utf-8'))

    二、socketserver模块

    socketserver模块简化了编写网络服务程序的任务,是python标准库中很多服务器框架的基础。

    socketserver中包含了两种类,一种为服务类(server class),一种为请求处理类(request handle class),前者主要做的是建立链接的过程,后者注重用户数据的处理

    要实现一项服务,还必须派生一个handler class请求处理类,并重写父类的handle()方法。handle方法就是用来专门是处理请求的。该模块是通过服务类和请求处理类组合来处理请求的。SocketServer模块提供的请求处理类有BaseRequestHandler。

    1、基于tcp协议通信:

    服务端:

    import socketserver
    
    IP = '127.0.0.1'
    PORT = 8082
    ADDRESS = (IP, PORT)
    BUFSIZE = 1024
    
    
    class MyTcphandle(socketserver.BaseRequestHandler):
        def handle(self):
            while True:#通信循环
                try:
                    data=self.request.recv(BUFSIZE)
                    if not data:
                        print('客户端断开。。。')
                        break
                    print('>>',data.decode('utf-8'))
                    self.request.send(data.upper())
                except ConnectionResetError:
                    break
            self.request.close()
    
    if __name__ == '__main__':
        server=socketserver.ThreadingTCPServer(ADDRESS,MyTcphandle)
        server.serve_forever()#链接循环
    View Code

    客户端:

    import socket
    
    IP = '127.0.0.1'
    PORT = 8082
    ADDRESS = (IP, PORT)
    BUFSIZE = 1024
    
    client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    client.connect(ADDRESS)
    
    while True:
        msg=input('>>>').strip()
        if len(msg)==0:continue
        client.send(msg.encode('utf-8'))
        data=client.recv(BUFSIZE)
        print(data.decode('utf-8'))
    client.close()
    View Code

    2、基于udp协议通信:

    服务端:

    import socketserver
    
    IP = '127.0.0.1'
    PORT = 8082
    ADDRESS = (IP, PORT)
    
    
    class MyUdphandle(socketserver.BaseRequestHandler):
        def handle(self):
            data,sock=self.request
            sock.sendto(data.upper(),self.client_address)
    
    
    if __name__ == '__main__':
        server=socketserver.ThreadingUDPServer(ADDRESS,MyUdphandle)
        server.serve_forever()#由于UDP不需要链接,只有通信循环
    View Code

    客户端:

    import socket
    
    IP = '127.0.0.1'
    PORT = 8082
    ADDRESS = (IP, PORT)
    BUFSIZE = 1024
    
    client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    
    while True:
        msg=input('>>>').strip()
        if len(msg)==0:continue
        client.sendto(msg.encode('utf-8'),ADDRESS)
        data,addr=client.recvfrom(BUFSIZE)
        print(data)
    
    client.close()
    View Code

    三、关于进程的简单介绍

    什么是进程:

      进程指的是一个正在进行/运行的程序,进程是用来描述程序执行过程的虚拟概念

      进程vs程序
      程序:一堆代码
      进程:程序的执行的过程

      进程的概念起源于操作系统,进程是操作系统最核心的概念,操作系统其它所有的概念都是围绕进程来

    操作系统理论:
        1. 操作系统是什么?
          操作系统是一个协调管理控制计算机硬件资源与应用软件资源的一段控制程序
          有两大功能:
          1. 将复杂的硬件操作封装成简单的接口给应用程序或者用户去使用
          2. 将多个进程对硬件的竞争变得有序

        2.操作系统发展史

          串行:一个任务完完整整地运行完毕,才能运行下一个任务
          并发: 多个任务看起来是同时运行的
          

          多道技术:(复用=>共享/共用)
            1. 空间上的复用:多个任务复用内存空间
            2. 时间上的复用:多个任务复用cpu的时间

            注:两种情况下,一个进程会被操作系统剥夺cpu的执行权限
              1. 一个任务占用cpu时间过长:比起串行执行反而会降低效率

              2. 一个任务遇到io操作:比起串行执行可以提升效率

  • 相关阅读:
    从菜鸟腾飞至专家(我的心得)
    SQL 绕圈算法???
    asp access 时间段
    SQL 绕圈算法2???
    月薪三万的一道面试题
    Java方法参数是引用调用还是值调用?——值调用
    简述一个大型交易网站的发展旅程
    Java分布式应用学习笔记04JDK的并发包的集合总结
    ORACLE 执行计划中cost cardinality bytes cpu_cost io_cost解释
    剖析float型的内存存储和精度丢失问题
  • 原文地址:https://www.cnblogs.com/Mister-JH/p/9588295.html
Copyright © 2020-2023  润新知