【个人总结系列-27】Python网络编程与多线程编程-学习总结

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Python网络编程与多线程编程-学习总结

3.1.1 Python网络编程

Python网络编程主要基于socket实现,socket在本质上与文件句柄、文件描述符、管道描述符等都是一个概念,都可以对其进行I/O处理。主要将介绍TCP方式和UDP方式的Python网络编程。

(1)TCP方式

无论是TCP方式还是UDP方式,都有一个server端和client端,server 端负责监听client端的连接请求并处理。

⏹server端

server端绑定一个IP和端口号后便对绑定的地址进行监听,server端的socket建立过程一般为:

1.建立一个socket(可以选择socket类型INET、UNIX等,以及连接方式

TCP/UDP)

2.使用bind公开一个端口,使得client可以方便连接

3.设置一个listen队列的大小

4.进入一个无限循环,在此无限循环中,使用accept函数来等待客户连接,

此函数返回一个新的socket和列表形式的地址(包括client端的IP

地址和端口号),返回的socket对应于客户端的socket,这就相当于

server端和client端拿到了同一个文件句柄,从而建立了通信连接。

对socket的处理一般放在外部单独的函数中,并且通常开一个新线程来

处理这个任务

5.通过send()/recv()来对socket进行读写操作

⏹client端

client端的作用是建立一个新的TCP socket用来与server进行交互,client端的socket建立过程一般为:

1.建立一个新的socket

2.使用connect函数与远程主机获得连接

3.对socket进行读写操作

(2)UDP方式

UDP与TCP相比,没有三次握手、错误重传等机制,不保证顺序和是否接收到,但是速度比TCP高很多。在对数据帧要求不是很高的地方有很强的优势,比如网络上的视频传输、音频传输等。

⏹server端

UDP方式的server端与TCP方式差不多,在socket选择时要选择数据包形式(socket.SOCK_DGRAM)。server端的socket建立过程一般为:

1.建立数据报形式的socket

2.公开一个端口,一边客户端连接

3.开始接收数据

一个Python实现的简单UDP server端的程序如下所示:

server中address元组中的引号表示可以接受任何地址来的数据报,TCP例子中的则表示可以接受任意地址发起的连接。

⏹client端

UDP方式的client端建立过程为:

1.新建一个数据报socket

2.收发数据

一个简单的示例程序如下所示

3.1.2 Python多线程编程

Python中使用线程有两种方式:

(1)使用相应的函数创建线程

(2)继承相应的类包装线程对象

(1)函数式

使用函数式实现线程的方法是通过调用thread模块中的start_new_thread()函数来产生新线程。其函数原型是thread.start_new_thread(function, args[, kwargs]),其中第一个参数是线程执行函数(如下面例子中的timer方法),第二个参数是传递给线程函数的参数,它必须是tuple类型(列表),kwargs是可选参数。线程的结束可以等待线程自然结束,也可以在线程函数中调用thread.exit()或thread.exit_thread()方法。简单的例子如下所示:

(2)继承threading.Thread类实现

除了通过调用thread.start_new_thread函数实现多线程外,还可以通过创建threading.Thread的子类来包装一个线程对象来实现多线程(通过继承

threading.Thread类实现),新线程的执行内容为run方法的内容,因此继承后只需要重写run方法即可,然后通过创建对象来调用。此外threading.Thread 类还包括一些其他的方法,比如:

•在自己的线程类的__init__里调用threading.Thread.__init__(self, name = threadname),Threadname为线程的名字

•run(),通常需要重写,编写代码实现做需要的功能

•getName(),获得线程对象名称

•setName(),设置线程对象名称

•start(),启动线程

•jion([timeout]),等待另一线程结束后再运行

•setDaemon(bool),设置子线程是否随主线程一起结束,必须在start()之前调用。默认为False

•isDaemon(),判断线程是否随主线程一起结束

•isAlive(),检查线程是否在运行中

相关文档
最新文档