zoukankan      html  css  js  c++  java
  • 网络编程(基于udp协议的套接字/socketserver模块/进程简介)

    一、基于UDP协议的套接字

    TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据。相对TCPUDP则是面向无连接的协议。

    使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发数据包。但是,能不能到达就不知道了。

    虽然用UDP传输数据不可靠,但它的优点是和TCP比,速度快,对于不要求可靠到达的数据,就可以使用UDP协议。

    我们来看看如何通过UDP协议传输数据。和TCP类似,使用UDP的通信双方也分为客户端和服务器。服务器首先需要绑定端口:

    1. TCP与UDP的比较:

    TCP(流式协议):可靠性高。会因为网络原因丢包,但只有在一端收到另一端发来的ack确认信息才会将信息在内存中删除,如果发现丢包(一段时间内没有回复)会将信息再发一份。TCP会存在粘包问题,收与发可以不是对应的。必须先启动服务端,否则报错。

    UDP(数据包协议):可靠性低。信息一旦发出即在内存中删除,如果发生丢包,信息即丢失。UDP效率高速度快的主要原因,一是因为不建连接,二是因为接受后不会确认。 UDP没有粘包问题,收与发一一对应。 如果发hello,但收一个字符,在windows系统中会报错;在linunx系统中不报错,只接收h

    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    # 绑定端口:

    s.bind(('127.0.0.1', 9999))

    创建Socket时,SOCK_DGRAM指定了这个Socket的类型是UDP。绑定端口和TCP一样,但是不需要调用listen()方法,而是直接接收来自任何客户端的数据:

    print('Bind UDP on 9999...')

    while True:

       

     # 接收数据:

        data, addr = s.recvfrom(1024)

        print('Received from %s:%s.' % addr)

    s.sendto(b'Hello, %s!' % data, addr)

    recvfrom()方法返回数据和客户端的地址与端口,这样,服务器收到数据后,直接调用sendto()就可以把数据用UDP发给客户端。

    注意这里省掉了多线程,因为这个例子很简单。

    客户端使用UDP时,首先仍然创建基于UDPSocket,然后,不需要调用connect(),直接通过sendto()给服务器发数据:

    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    for data in [b'Michael', b'Tracy', b'Sarah']:

        # 发送数据:

        s.sendto(data, ('127.0.0.1', 9999))

        # 接收数据:

        print(s.recv(1024).decode('utf-8'))

    s.close()

    从服务器接收数据仍然调用recv()方法。

    仍然用两个命令行分别启动服务器和客户端测试,结果如下:

     

    小结:

    UDP的使用与TCP类似,但是不需要建立连接。此外,服务器绑定UDP端口和TCP端口互不冲突,也就是说,UDP9999端口与TCP9999端口可以各自绑定。

    2. socketserver实现并发

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

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

     

    server类:

     

     

    request类:

     

     

     

     

    继承关系:

     

     

    二、python并发编程之多进程

    1、什么是程序?什么是进程?

        程序说白了就是一堆文件

        进程就是一个正在执行的过程/程序,所以说进程是一个抽象的概念。这个概念起源操作系统

     

    2、什么是操作系统

        定义:操作系统是位于计算机硬件与应用软件之间,用于协调、管理、控制计算机硬件与软件的资源的一种控制程序

     

    3、操作系统的两大作用:

        1、把复杂丑陋的硬件操作都封装成美丽的接口,提供给应用程序使用

        2、把进程对硬件的竞争变的有序

     

    4、多道技术(单个CPU在多个程序中切换以实现并发)

        多道的产生背景是想要在单个cpu的情况下实现多个进程并发执行的效果

        a、空间上的复用 (多道程序复用内存的空间)

        b、时间上的复用  (多道程序复用CPU时间)

        

        cpu遇到IO操作要切换(提升效率)

        一个进程占用cpu时间过长也切(降低效率)

    进程与进程之间的内存空间是互相隔离的。

     

     

     


  • 相关阅读:
    38. Count and Say(C++)
    35. Search Insert Position(C++)
    29. Divide Two Integers(C++)
    c++读取utf-8格式中英文混合string
    一种局部二值化算法:Sauvola算法
    Ubuntu 1804 本地显示远程服务器文件
    caffe 预训练 或者Fine-Tuning 操作
    caffe/blob.hpp:9:34: fatal error: caffe/proto/caffe.pb.h: 没有那个文件或目录
    转载---LIBRARY_PATH和LD_LIBRARY_PATH环境变量的区别
    [leetcode-921-Minimum Add to Make Parentheses Valid]
  • 原文地址:https://www.cnblogs.com/zhaijihai/p/9584896.html
Copyright © 2011-2022 走看看