一、实验环境
(1)Windows11
(2)Python:python3.7
(3)socket
(4)threading
(5)bs4
(6)tkinter
(5)开发工具:pycharm
二、实验目标
《分布式与并行计算》课程是专业选修课程,该课程目的在于让学生理解分布式与并行计算相关概念、原理,掌握相关编程技术及其应用,培养学生的软件架构思维。
任务一:网络聊天室项目:学生自行查找相关网络资源,并基于socket+多线程编程实现多人网络聊天室功能(可以是命令行界面的,有GUI图形界面的更佳)
任务二:网页爬虫项目:学生自行查找相关网络资源,并基于soup/xpath+requests+线程池技术实现对相关web数据的并发爬取
三、实验原理
Socket:生成套接字,socket是一个中间层工具,它存在于操作系统的内核。电脑上的进程为了真正通过socket来发送/接受数据,socket必须和一个能够进行数据传送的接口连接起来,再通过那个接口送出数据。这个接口就是端口,而这个连接的过程就叫做绑定。应用层就可以和传输层通过套接字接口(API),区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。
Bs4:Beautiful Soup 简称 BS4(其中 4 表示版本号)是一个 Python 第三方库,它可以从 HTML 或 XML 文档中快速地提取指定的数据。提供一些简单的、python 式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据。
Threading:在 Python 中,实现多线程的模块叫作 threading,是 Python 自带的模块。我们可以使用 Thread 类来创建一个线程,创建时需要指定 target 参数为运行的方法名称,如果被调用的方法需要传入额外的参数,则可以通过 Thread 的 args 参数来指定。
Tkinter:Tkinter 是使用 python 进行窗口视窗设计的模块。Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的接口。作为 python 特定的GUI界面,是一个图像的窗口,tkinter是python 自带的,可以编辑的GUI界面,我们可以用GUI 实现很多直观的功能,比如想开发一个计算器,如果只是一个程序输入,输出窗口的话,是没用用户体验的,对于稍有GUI编程经验的人来说,Python的Tkinter界面库是非常简单的。python的GUI库非常多,选择Tkinter,一是最为简单,二是自带库,不需下载安装,随时使用,三则是从需求出发,Python作为一种脚本语言,一种胶水语言,一般不会用它来开发复杂的桌面应用,它并不具备这方面的优势,使用Python,可以把它作为一个灵活的工具,而不是作为主要开发语言,那么在工作中,需要制作一个小工具,肯定是需要有界面的,不仅自己用,也能分享别人使用,在这种需求下,Tkinter是足够胜任的!
四、实验实操及截图
网络聊天室项目:
聊天室的设计思想是:在局域网下,利用socket进行连接通信,当服务器端启动的时候,利用Thread线程不停的等待客户端的链接;当有客户端开启连接的时候,服务器端通过IO流反馈“上线用户”信息给客户端,客户端也使用线程不停的接收服务器的信息,从而实现多人在线聊天功能,与此同时,我们还加入了Tkinter组件,来实现带有GUI界面的更佳聊天效果:
本次实验设计的聊天室可供多人同时聊天,接下来我们就使用 Python 来操作 socket ,实现一个聊天室的一些主要功能。首先我们来回想下,一般的聊天室都是怎样的,有多个用户可以同时在线,他们可以实时获取到消息,实时发送消息。
先给大家看看效果:
本次项目主要分成两个:server.py服务端 client.py客户端
1.首先给大家解析一下服务端的代码:
(1)首先导入所需库包:
(2)声明时间格式,用于后面记录系统时间,以及设置ip地址和端口号:
(3)创建列表,用于后面给每个套接字发送消息:
(4)聊天记录存储在当前目录下的serverlog.txt文件中:
(5)读取套接字,设置离开聊天室的系统通告:
(6)接收Client端的消息并声明格式发送:
(7)设置不接受新的套接字进来,实现“多人”:
(8)设置用户进入工作室的样式:
(9)要支持多个用户的信息收发,我们可以开启线程:
2.接下来是客户端的代码:
(1)首先还是老样子,导入库包:
(2)基于Tk设置聊天登录窗口,以及设置用户名长度限制,设置编码格式和连接ip:
(3)设置聊天窗口:
(4)接收服务器发来的消息并显示到聊天信息窗口上,与此同时监控用户列表更新
(5)要支持多个用户的信息收发,我们可以开启线程:
(6)聊天输入窗口的设置
(7)发送按钮的设置以及函数的调用:
(2)网页爬虫项目:
作为一个程序员,日常生活多多少少会遇到爬虫项目,当然作为一名程序员,要爬的数据的数据量当然是不少的啦,因此在使用 Python 的过程中,我们可能遇到这样一个场景,需要下载某一个网站上的多个资源:
例如:我们想下载豆瓣电影 Top 250 所有的宣传图片:
如果使用常规的方法来进行爬虫,我们进行了测试:
我们测试得出,下载 250 张电影宣传图片总共需要花费 20 秒钟 的时间。相对而言,这是非常缓慢的。这是因为,每一次下载都必须在上一次下载结束之后才能进行本次下载。这就相当于我们去银行柜台取钱,在一个窗口多个人同时取钱,就只能进行排队,相对而言就会比较慢。因此这就需要引入本次项目的一个重点内容,那就是多线程并行爬虫:
线程在程序中是独立的、并发的执行流。与分隔的进程相比,进程中线程之间的隔离程度要小,它们共享内存、文件句柄和其他进程应有的状态。
因为线程的划分尺度小于进程,使得多线程程序的并发性高。进程在执行过程之中拥有独立的内存单元,而多个线程共享内存,从而极大的提升了程序的运行效率。
线程比进程具有更高的性能,这是由于同一个进程中的线程都有共性,多个线程共享一个进程的虚拟空间。线程的共享环境包括进程代码段、进程的共有数据等,利用这些共享的数据,线程之间很容易实现通信。
操作系统在创建进程时,必须为进程分配独立的内存空间,并分配大量的相关资源,但创建线程则简单得多。因此,使用多线程来实现并发比使用多进程的性能高得要多。
我们可以看到的是在实际运行过程中,使用多线程的方式进行下载图片总共花费了 5 秒中的时间。和之前的普通方式下载相比,快了进 4 倍
下面附上代码截图以及解析:
(1)导入所需库
(2)指定要爬网址,并生成链接
(3)基于request请求得到网页响应和bs4获取图片的url
(4)通过设置表头伪装人为浏览:
(5)下载图片并制定下载路径:
(6)设置如果文件夹不存在就创建,如果文件存在就清空,防止报错:
(7)通过切片获取图片的名称:
(8)设置主函数调用函数:
(9)结果展示:爬到250张图片,只截了部分:
五、心得体会
本次的大作业到这里就已经接近了尾声,本次的大作业主要由两部分组成,首先是网络聊天室项目:学生自行查找相关网络资源,并基于socket+多线程编程实现多人网络聊天室功能(可以是命令行界面的,有GUI图形界面的更佳),然后就是网页爬虫项目:学生自行查找相关网络资源,并基于soup/xpath+requests+线程池技术实现对相关web数据的并发爬取,两个作业各有千秋,充分的应用了本学期学到的知识,多线程并发,大大节省了任务运行的时长,在这个大数据时代,数据量大杂,多线程的技术,让我们的工作效率可以得到大大的提升。
聊天室项目,在局域网下,利用socket进行连接通信,当服务器端启动的时候,利用Thread线程不停的等待客户端的链接;当有客户端开启连接的时候,服务器端通过IO流反馈“上线用户”信息给客户端,客户端也使用线程不停的接收服务器的信息,从而实现多人在线聊天功能,与此同时,我们还加入了Tkinter组件,来实现带有GUI界面的更佳聊天效果;以及线程池爬虫,线程在程序中是独立的、并发的执行流。与分隔的进程相比,进程中线程之间的隔离程度要小,它们共享内存、文件句柄和其他进程应有的状态。因为线程的划分尺度小于进程,使得多线程程序的并发性高。进程在执行过程之中拥有独立的内存单元,而多个线程共享内存,从而极大的提升了程序的运行效率。
通过本次的大作业,学习到了很多新的知识,也巩固了课上的知识,因此本次的作业还是十分的有意义,在将来的工作中也一定会有一定的应用,但是学无止境,所学的知识还远远不够,在这个科技技术日益发展的时代,还得一直保持一个学者的良好心态。