好的,还是习惯性的问候大家一句,大家好呀!今天我们带来一个小项目的讲解,说是项目但也不完全算是,我们知道我们平时上网都是在不断向服务器发送各种请求,那么大家有没有想过我们自己也可以搭建一个小小的服务器呢,今天就带大家搭建一个简单的多任务版的服务器
下面我给出我的代码和详细注释:
服务端的搭建
import threading #大家知道多线程可以让我们访问以及效率得到质的提升,所以我们这里的多任务借用了多线程高效率的思想进行多任务开发。
import socket #Socket模块的主要目的就是帮助在网络上的两个程序之间建立信息通道,这个模块也是我们用python搭建服务器的必备模块
def handle(new_client,ip_port): #就是套接字和ip地址等通信必备数据
while True:
new_recv = new_client.recv(1024) #设置接受客户端的最大数据为1024也就是1G
if new_recv:#判断是否有客户端数据传入
new_recv_content = new_recv.decode("gbk")
print("接收到的客户端信息为:",ip_port)
send_date = "客户端你的请求我已经收到了,正在处理."
new_client.send(send_date.encode("gbk"))
else: #如果没有数据传入就else
print("客户端已经下线")
break
new_client.close() #关闭当前套接字,与客户端结束通信,服务端进入等待模式
def main(): #定义一个main函数
#第一步创建我们的服务端套接字,关于套接字是什么大家可以在网上找一下,这里不进行详细的解释,
#一句话就是我们只要涉及到网络通信什么的都要用到套接字,套接字相当于是一个基础,给其他任务的进行提供平台这样一个角色。
tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#套接字创建好了,我们需要让我们服务器的端口号可以不断的复用,而不是当一个任务占用后就一直占用,导致端口始终处于忙碌状态。
tcp_server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)#True代表确认端口复用,默认为False
tcp_server_socket.bind(("",9090)) # 绑定端口号,注意是两个括号,不要少写了,“”空字串是接受客户端的ip地址等信息进行连接用
tcp_server_socket.listen(128) #监听,就是这个服务器同时可以关注128个客户端发送请求,这里我随便设置的是128,当然129、154等都都可以。
while True: # 注意注意!!!这里很重要,while True表示服务当一直循环,而不是进行了一次通信后就自动关闭,保证了多任务的进行!!!
new_client,ip_port = tcp_server_socket.accept() #接受客户端请求,这里我在网上找了一个关于accept的解释,我觉得讲的还挺好,在这里会有一个套接字的转变,大家可能会犯错!!!
#accept默认会阻塞进程,直到有一个客户连接建立后返回,它返回的是一个新可用的套接字,这个套接字是连接套接字。此时我们需要区分两种套接字,一种套接字正如accept的参数sockfd,它是监听套接字,在调用listen函数之后,一个套接字会从主动连接的套接字变身为一个监听套接字;
#而accept返回是一个连接套接字,它代表着一个网络已经存在的点点连接。自然要问的是:为什么要有两种套接字?原因很简单,如果使用一个描述字的话,那么它的功能太多,使得使用很不直观,同时在内核确实产生了一个这样的新的描述字。
new_thread = threading.Thread(target=handle,args=(new_client,ip_port)) # 创建子线程,并且调用handle函数对客户端请求进行处理
new_thread.setDaemon(True) #守护主线程
new_thread.start() #开启子线程
if __name__ == '__main__':
main() #调用main函数
客户端的搭建
相比于服务端,客户端搭建要简答容易的多,步骤也少的多,下面大家跟着我来搭建一下
import socket #同样导入模块
#第一步创建套接字
tcp_client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#第二步请求连接,这里的“”不再是空而是我们本地网络的ip地址,大家不知道在哪找的话,我在文章末尾会给大家说,这里先跳过,9090是我们刚才搭建的服务端的端口号
tcp_client_socket.connect(("10.37.127.216",9090))
#发送数据,编码为gbk格式
tcp_client_socket.send("你好".encode("gbk"))
#接受服务端发送回来的数据
recv_date = tcp_client_socket.recv(1024)
#对服务端发来的数据进行解码
recv_content = recv_date.decode("gbk")
print(recv_content)
#关闭与服务端的连接,结束通信
tcp_client_socket.close()
怎么找本地网络ip呢?
第一步:win+r 输入cmd 回车
第二步:
如果是linux系统就输入ifconfig 然后回车
大家找到自己的ipv4地址,这个就是本地网络ip,我这里连的是无线网,大家看自己是什么。
结果截图展示
客户端的界面:
服务端的界面:
客户端多次运行请求偶的服务端:
总结:
服务端搭建大致步骤:
1.创建服务端套截止 2.端口复用并绑定端口号 3.服务端监听 4.接受客户端请求 5.创建子线程并调用handle函数处理客户端请求 6.写handle函数,要注意写在main函数前面因为main函数在后main才调用 7.设置接受数据大小 8.对接受到的数据进行解码 9.返回给客户端数据,并编码 10.关闭与客户端的套接字
客户端搭建大致步骤:
1.创建套接字 2.请求与服务端连接 3.发送数据到服务端 4.接受服务端发来的数据,并解码 5.关闭与服务端的套接字
我们的服务端和客户端的搭建也就这样草草结束了hhh,大家可以在自己的pycharm中进行搭建一下,对了,客户端和服务端是两个.py文件,大家要多动手试试,我觉得搭建成功还挺有成就感的哈哈哈哈哈
大家有什么好的意见或者不懂得地方都可以在评论区打出来,谢谢大家的耐心观看