【个人总结系列-27】Python网络编程与多线程编程-学习总结
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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(),检查线程是否在运行中