zoukankan      html  css  js  c++  java
  • python学习第34天之udp的套接字、套接字的多线程socketserver模块的使用、操作系统理论

    一、udp的套接字

    Udp协议又叫数据报协议,

    特点:每次发送数据自带报头,即使发送为0也会自带报头,所以不会报错;一端发一次数据。另一端也只能收一次数据

    服务端:

    import socket
    
    server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    server.bind(('127.0.0.1',8082))
    
    while True:
        data,client_addr=server.recvfrom(1024)
        print(data)
        server.sendto(data.upper(),client_addr)
    
    server.close()

    客户端

    import socket
    
    client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    
    while True:
        msg=input('>>: ').strip()
        client.sendto(msg.encode('utf-8'),('127.0.0.1',8082))
        data,server_addr=client.recvfrom(1024)
        print(data)

    二、socketserver模块

    作用:实现并发

    基于tcp的套接字,关键就是两个循环,一个链接循环,一个通信循环

    socketserver模块中分两大类:server类(解决链接问题)和request类(解决通信问题)

    (1)server类:

    (2)request类

    (3)继承关系

    TCP协议的并发

    服务端

    import socketserver
    
    # 自定义类用来处理通信循环
    class MyTCPhanler(socketserver.BaseRequestHandler):
        def handle(self):
            while True:
                try:
                    data = self.request.recv(1024)
                    if len(data) == 0: break  # 针对linux系统
                    print('-->收到客户端的消息: ', data)
                    self.request.send(data.upper())
                except ConnectionResetError:
                    break
    
            self.request.close()
    
    
    if __name__ == '__main__':
        server=socketserver.ThreadingTCPServer(('127.0.0.1',8081),MyTCPhanler)
        server.serve_forever() # 链接循环

    客户端:

    from socket import *
    
    client = socket(AF_INET, SOCK_STREAM)
    client.connect(('127.0.0.1', 8081))
    
    # 通信循环
    while True:
        # msg=input('>>: ').strip() #msg=''
        # if len(msg) == 0:continue
        # client.send(msg.encode('utf-8')) #client.send(b'')
        client.send('hello'.encode('utf-8')) #client.send(b'')
        # print('has send')
        data=client.recv(1024)
        # print('has recv')
        print(data)
    
    client.close()

    UDP协议的并发

    服务端:

    import socketserver
    
    class MyUdphandler(socketserver.BaseRequestHandler):
        def handle(self):
            data,sock=self.request
            sock.sendto(data.upper(),self.client_address)
    
    if __name__ == '__main__':
        server=socketserver.ThreadingUDPServer(('127.0.0.1',8081),MyUdphandler)
        server.serve_forever()

    客户端:

    from socket import *
    
    client=socket(AF_INET,SOCK_DGRAM)
    
    while True:
        client.sendto(b'hello',('127.0.0.1',8081))
        data,server_addr=client.recvfrom(1024)
        print(data)

     三、操作系统理论

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

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

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

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

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

    多道技术:(复用=>共享/共用)
    1. 空间上的复用:多个任务复用内存空间
    2. 时间上的复用:多个任务复用cpu的时间
    1. 一个任务占用cpu时间过长会被操作系统强行剥夺走cpu的执行权限:比起串行执行反而会降低效率
    2. 一个任务遇到io操作也会被操作系统强行剥夺走cpu的执行权限:比起串行执行可以提升效率

  • 相关阅读:
    解决Qt5 Creator无法切换输入法(fcitx),不能录入汉字问题
    QProcess进程间双向通信
    DB2使用存储过程插入数据
    Qt自定义圆周动画(360 10.0 的模仿作者写的)
    经典重温:给微软上课的快乐车夫
    很劲爆!紫光赵伟国在北京微电子会议上12条惊人语录
    中芯国际董事长周子学:技术终有山顶,我们用时间换技术
    windows完全支持C++11的轻量级编译器(官网MinGW和非官方的MinGW-builds)
    VMwarevSphere 服务器虚拟化之二十九 桌面虚拟化之安装View副本服务器
    Qt判断和打开进程(windows端),运行,检测,中止
  • 原文地址:https://www.cnblogs.com/ye-hui/p/9917419.html
Copyright © 2011-2022 走看看