《第9章网络编程和多线程.ppt》由会员分享,可在线阅读,更多相关《第9章网络编程和多线程.ppt(17页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第9章章 网络编程和多线程网络编程和多线程主讲主讲 夏敏捷夏敏捷计算机学院副教授计算机学院副教授9.1 网络编程基础9.1.1 9.1.1 互联网互联网TCP/IPTCP/IP协议协议IP协议负责把数据从一台计算机通过网络发送到另一台计算机。数据被分割成一小块一小块,然后通过IP包发送出去。由于互联网链路复杂,两台计算机之间经常有多条线路,因此,路由器就负责决定如何把一个IP包转发出去。IP包的特点是按块发送,途径多个路由,但不保证能到达,也不保证顺序到达。IP地址实际上是一个32位整数(称为IPv4),以字符串表示的IP地址如192.168.0.1实际上是把32位整数按8位分组后的数字表示
2、,目的是便于阅读。9.1.2 IP协议TCP协议则是建立在IP协议之上的。TCP协议负责在两台计算机之间建立可靠连接,保证数据包按顺序到达。TCP协议会通过握手建立连接,然后,对每个IP包编号,确保对方按顺序收到,如果包丢掉了,就自动重发。许多常用的更高级的协议都是建立在TCP协议基础上的,比如用于浏览器的HTTP协议、发送邮件的SMTP协议等。UDP协议,同样是建立在IP协议之上,但是UDP协议面向无连接的通信协议,不保证数据包的顺利到达,不可靠传输。所以效率比TCP要高。9.1.3 TCP和UDP协议网络上两个计算机之间的数据通信,归根到底就是不同主机的进程交互,而每个主机的进程都对应着某
3、个端口。也就是说,单独靠IP地址的无法完成通信的,必须要有IP和端口。9.1.4 端口Socket是网络编程的一个抽象概念。Socket是套接字的英文名称,主要是用于网络通信编程。80年代初,美国政府的高级研究工程机构(ARPA)给加利福尼亚大学Berkeley分校提供了资金,让他们在UNIX操作系统下实现TCP/IP协议。在这个项目中,研究人员为TCP/IP网络通信开发了一个API(应用程序接口)。这个API称为Socket(套接字)。Socket是TCP/IP网络最为通用的API。任何网络通讯都是通过Socket来完成的。9.1.5 Socket例如创建TCP Socket:s=socke
4、t.socket(socket.AF_INET,socket.SOCK_STREAM)创建UDP Socket:s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)日常生活中大多数连接都是可靠的TCP连接。创建TCP连接时,主动发起连接的叫客户端,被动响应连接的叫服务器。9.2.1 TCP9.2.1 TCP客户端编程客户端编程【例9-1】访问新浪的TCP客户端程序。9.2 TCP编程9.2.2 TCP服务器端编程服务器端和客户端编程相比,服务器编程就要复杂一些。服务器端进程首先要绑定一个端口并监听来自其他客户端的连接。如果某个客户端连接过来了,服务
5、器就与该客户端建立Socket连接,随后的通信就靠这个Socket连接了。【例9-2】编写一个简单的TCP服务器程序,它接收客户端连接,把客户端发过来的字符串加上Hello再发回去。图图9-4 9-4 服务器程序服务器程序效果效果 图图9-5 9-5 客户端程序效果客户端程序效果9.3 UDP编程【例9-3】编写一个简单的UDP演示下棋程序。服务器端把UDP客户端发来的下棋x,y坐标信息显示出来,并把x,y坐标加1后(模拟服务器端下棋),再发给UDP客户端。9.4 多线程编程线程是操作系统可以调度的最小执行单位,够执行并发处理。通常是将程序拆分成2个或多个并发运行的线程,即同时执行多个操作。例
6、如,使用线程同时监视用户并发输入,并执行后台任务等。1 1概念概念进程是操作系统中正在执行的应用程序的一个实例,操作系统把不同的进程(即不同程序)分离开来。每个进程至少包含一个线程,它从程序开始执行,直到退出程序,主线程结束,该进程也被从内存中卸载。主线程在运行过程中还可以创建新的线程,实现多线程的功能。9.4.1 进程和线程9.4.1 进程和线程2 2多线程优点多线程优点多线程类似于同时执行多个不同程序,多线程运行有如下优点:(1)使用线程可以把占据长时间的程序中的任务放到后台去处理。(2)用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的
7、进度(3)程序的运行速度可能加快(4)在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。9.4.2 创建线程Python中使用线程有两种方式:函数或者用类来创建线程对象。1 1start_new_thread()start_new_thread()函数创建线程函数创建线程调用_thread模块中的start_new_thread()函数来产生新线程。格式如下:_thread.start_new_thread(function,args,kwargs)【例9-4】使用thread模块中的start_new_thre
8、ad()函数来创建线程。2 2ThreadThread类创建线程类创建线程threading线程模块封装了_thread模块,并提供更多功能,虽然可以使_thread模块中start_new_thread()函数创建线程,但建议使用threading模块。threading模块提供了Thread类来创建和处理线程,格式如下:线程对象=threading.Thread(target=线程函数,args=(参数列表),name=线程名,group=线程组)线程名和线程组都可以省略。【例9-5】使用threading.Thread类来创建线程例子。9.4.3 线程同步如果多个线程共同对某个数据修改,
9、则可能出现不可预料的结果,为了保证数据的正确性,需要对多个线程进行同步。使用Threading的Lock(指令锁)和Rlock(可重入锁)对象可以实现简单的线程同步。【例9-7】使用指令锁实行多个线程同步。9.4.4 定时器Timer定时器(Timer)是Thread的派生类,用于在指定时间后调用一个函数,具体方法如下:timer=threading.Timer(指定时间t,函数f)timer.start()执行timer.start()后,程序会在指定时间t后启动线程执行函数f。【例9-8】使用定时器Timer的例子。import threadingimport timedef func():print(time.ctime()#打印出当前时间print(time.ctime()timer=threading.Timer(5,func)timer.start()该程序可实现延迟5秒后调用func方法的功能。9.5 网络编程案例Python在线聊天程序采用TCP连接用实现的一个在线聊天程序,主要功能是实现客户端与服务器端的双向通信。运行效果如图9-8所示。在线聊天服务器端在线聊天的客户端在线聊天的客户端