Python---多线程编程、基于Socket完成服务端程序开发、基于Socket完成客户端程序开发
1. 进程:
程序在操作系统内运行,即成为一个运行进程
线程:
进程内部可以有多个线程,程序的运行本质上就是由进程内部的线程在实际工作的。
并行执行:
多个进程同时在运行,即不同的程序同时运行,称之为:多任务并行执行
一个进程内的多个线程同时在运行,称之为:多线程并行执行
threading模块的使用:
thread_obj = threading.Thread(target=func) 创建线程对象
thread_obj.start() 启动线程执行
import time
import threading
def sing(msg):
print(msg)
time.sleep(1)
def dance(msg):
print(msg)
time.sleep(1)
if __name__ == '__main__':
# 创建一个唱歌的线程
sing_thread = threading.Thread(target=sing, args=("我要唱歌 哈哈哈", ))
# 创建一个跳舞的线程
dance_thread = threading.Thread(target=dance, kwargs={"msg": "我在跳舞哦 啦啦啦"})
# 让线程去干活吧
sing_thread.start()
dance_thread.start()
2. Socket:
socket (简称 套接字) 是进程之间通信一个工具。
下载网络调试助手作为客户端
https://github.com/nicedayzhu/netAssist/releases
3. Socket服务端编程步骤
①创建socket对象
② 绑定socket_server到指定IP和地址
③服务端开始监听端口
④接收客户端连接,获得连接对象
⑤客户端连接后,通过recv方法,接收客户端发送的消息
⑥通过conn(客户端当次连接对象),调用send方法可以回复消息
⑦conn(客户端当次连接对象)和socket_server对象调用close方法,关闭连接
import socket
# 创建Socket对象
socket_server = socket.socket()
# 绑定ip地址和端口
socket_server.bind(("localhost", 8888))
# 监听端口
socket_server.listen(1)
# listen方法内接受一个整数传参数,表示接受的链接数量
# 等待客户端链接
# result: tuple = socket_server.accept()
# conn = result[0] # 客户端和服务端的链接对象
# address = result[1] # 客户端的地址信息
conn, address = socket_server.accept()
# accept方法返回的是二元元组(链接对象, 客户端地址信息)
# 可以通过 变量1, 变量2 = socket_server.accept()的形式,直接接受二元元组内的两个元素
# accept()方法,是阻塞的方法,等待客户端的链接,如果没有链接,就卡在这一行不向下执行了
print(f"接收到了客户端的链接,客户端的信息是:{address}")
while True:
# 接受客户端信息,要使用客户端和服务端的本次链接对象,而非socket_server对象
data: str = conn.recv(1024).decode("UTF-8")
# recv接受的参数是缓冲区大小,一般给1024即可
# recv方法的返回值是一个字节数组也就是bytes对象,不是字符串,可以通过decode方法通过UTF-8编码,将字节数组转换为字符串对象
print(f"客户端发来的消息是:{data}")
# 发送回复消息
msg = input("请输入你要和客户端回复的消息:")
if msg == 'exit':
break
conn.send(msg.encode("UTF-8"))
# 关闭链接
conn.close()
socket_server.close()
4. 基于Socket完成客户端程序开发
主要分为如下几个步骤:
①创建socket对象
②连接到服务端
③发送消息
④接收返回消息
⑤关闭链接
import socket
# 创建socket对象
socket_client = socket.socket()
# 连接到服务端
socket_client.connect(("localhost", 8888))
while True:
# 发送消息
msg = input("请输入要给服务端发送的消息:")
if msg == 'exit':
break
socket_client.send(msg.encode("UTF-8"))
# 接收返回消息
recv_data = socket_client.recv(1024) # 1024是缓冲区的大小,一般1024即可。 同样recv方法是阻塞的
print(f"服务端回复的消息是:{recv_data.decode('UTF-8')}")
# 关闭链接
socket_client.close()
5. 实现服务端并结合客户端进行测试
(日常美图时间)