基于数据流的局域网点歌台
摘要:本文将介绍如何使用Python的socket库和多线程技术实现一个内网点歌台程序的后端。此外,还将介绍如何使用爬虫获取歌曲信息以及如何进行客户端和服务端的通信。
一、前言
关于我为什么要写这个。
在课间,老师为了活跃氛围,会叫班长让同学们进行点歌,但是很多人因为害羞或者有别的事情要忙,都不太愿意主动去说。
那么我今天分享的,就是一种可以让用户在局域网内进行歌曲点播的程序。通过该程序,同学可以方便地在局域网内向服务器提交想要听的歌曲,从而避免尴尬,提高了点歌的效率。
本文将大致介绍后端如何使用Python实现该功能,至于前端就不分享了,大家可以自行尝试。
本项目的思路还算明朗,总体就分为两个部分,服务器端和客户端。
在项目背景下,服务器端基本上就布置在教师电脑上即可,客户端分发给各位同学。
服务器端主要任务就是让各个客户端接入进来,等待各个客户端发送想听的歌曲,再通过selenium进行自动化操作(关于selenium本文暂不会介绍,感兴趣的朋友可以自行搜索。)服务器需要解决的问题有两个:①多用户接入②线程并发问题
客户端任务就简单多了,主要就是负责发送各位同学的听歌消息。为了缓解服务器的压力,本项目将一部分的爬虫内容放在客户端上,这样能有效降低服务器的带宽压力。
二、服务器端实现
服务器在整个项目中,是偏复杂的。主要分为两大要点:端口监听 和 多线程
①端口监听:是服务器实现数据传输的一个基础操作。数据监听,形象一点就是一个正在认真写作业的人,只有他愿意去听别人说话,他才会有反应,不然他还是在做自己的事情。
②多线程:通过创建多个线程,让本程序的服务器能够同时与多个客户端进行通信,而不是一个接一个地处理。当客户端请求到达时,服务器可以立即创建一个新的线程来处理该请求,而不是等待当前线程完成。
(零)导入包
目前服务器要实现功能,只需要四个包就够了。
socket:socket
包是网络编程的基础,它提供了一种标准的方法来编写跨平台的网络应用程序。在Python中,socket
库是内建的,可以直接使用,无需额外安装。
threading:多线程允许服务器在处理一个客户端请求的同时,继续监听新的连接请求。这避免了资源(如网络套接字)的闲置,提高了整体的资源利用率。
webbrowser:当本程序的服务器接收到客户端请求播放特定歌曲id时,便使用webbrowser
包来打开歌曲的链接,这样用户就可以在浏览器中听到或看到这首歌曲。
queue:在程序中,queue
包提供了一个线程安全的队列,同时可以有以下用处:①共享数据结构:多个线程可以安全地访问这个队列,将其用作共享的数据结构。 ②顺序处理:由于queue
默认实现的是先进先出(FIFO)的数据结构,可以通过这个队列来保证按照客户端请求的顺序来播放歌曲。 ③ 解耦线程:通过使用队列,可以将多个线程解耦,使它们可以独立地工作,同时保持数据的一致性和顺序。
(一)端口监听
其实纵观所有的服务器端,他的主要任务就是接收客户端的连接请求,并与客户端进行通信。仅此而已。
那么从这一点出发,我们便可以简单的写出一个大概。
首先,我们需要使用socket库创建一个socket对象,并将其绑定在8888端口上。
# 设置服务器地址和端口
HOST = '0.0.0.0'
PORT = 8888
# 创建socket对象
socket_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定地址和端口
socket_server.bind((HOST, PORT))
端口号随意,只要别用到常用的就行了。
我本人是比较喜欢8888,因为http默认的是8080。
然后,使用listen方法监听端口,等待客户端的连接。
# 设置最大连接数
socket_server.listen(5) # 这里的5是backlog的值,建议不要设置过大
这里的 “ 5” 意味着服务器最多可以挂起5个未处理的连接请求。如果队列满了,新的连接请求可能会被拒绝。
通常情况下,这