网络编程(基于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时间过长也切(降低效率)

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

 

 

 


原文地址:https://www.cnblogs.com/zhaijihai/p/9584896.html