一、多线程
1.进程、线程和并行执行
学习目标:了解什么是进程、线程,了解什么是并行执行
进程比作公司,线程比作员工,多线程并行执行就比作公司的不同员工在同一时间去做不同的事。
总结
2.多线程编程
学习目标:掌握使用threading模块完成多线程编程
当你想实现唱歌和跳舞一起出现时,但是你发现唱歌一直在循环,没有执行跳舞,这个就是单线程。
import time import threading def sing(): while True: print("我在唱歌,啦啦啦啦。。。") time.sleep(1) def dance(): while True: print("我在跳舞,呱呱呱呱。。。") time.sleep(1) if __name__ == '__main__': # 线程名其实就是员工工号,可以不用写,会自动分配 # 创建一个唱歌的线程 sing_thread = threading.Thread(target=sing) # 创建一个跳舞的线程 dance_thread = threading.Thread(target=dance) # 让线程去干活吧 sing_thread.start() dance_thread.start()
元组记得带逗号,就算是只有一个参数也要带逗号。使用kwargs传参注意key要和函数的参数名一致,字典就输出value。
import time import threading def sing(msg): while True: print(msg) time.sleep(1) def dance(msg): while True: 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()
总结
二、网络编程
1.服务端开发
学习目标:了解什么是Socket网络编程,基于Socket完成服务端程序开发
进程之间是有内存隔离的,可以通过socket来传输数据。
服务端就是被动的去接收客户端传来信息。一个服务端可以接收好几个客户端传来信息。
""" 演示Socket服务端开发 """ import socket # 创建Socket对象 socket_server = socket.socket() # 绑定ip地址和端口 socket_server.bind(("localhost",8888)) # 二元元组,第一个元素是你的ip地址或者说主机名,localhost表示本机,第二个元素是你要绑定的端口。 # 监听端口 socket_server.listen(1) # listen方法内接收一个整数参数,表示允许我们连接的数量 # 等待客户端链接 result:tuple = socket_server.accept() # 返回一个二元元组,第一个元素是链接对象,第二个元素是地址信息 conn = result[0] # 客户端和服务端的链接对象 address = result[1] # 客户端的地址信息 # accept方法是一个阻塞方法,阻塞的意思就是指如果没有客户端连接,那么他就会卡在这一行,不会向下执行 print(f"接收到了客户端的链接,客户端的信息是:{address}") # 接受客户端信息,要使用客户端和服务端的本次链接对象,而非socket_server对象 data: str = conn.recv(1024).decode("UTF-8") # recv接受的参数是缓冲区大小,一般给1024即可 # recv方法的返回值是一个字节数组也就是bytes对象,不是字符串,可以通过decode方法通过UTF-8编码,将字节数组转换为字符串对象 print(f"客户端发来的信息是:{data}") # 发送回复信息 msg = input("请输入你要和客户端回复的信息:").encode("UTF-8") # encode可以将字符串编码为字节数组对象 conn.send(msg) # 关闭链接 conn.close() socket_server.close()
我们只需要打开下载好的文件,就相当于我们有了一个socket的客户端了,回到pycharm中,右键运行
可以看到现在卡在了这里,让他接收重新试试
输入相关设置点击开始连接
连接成功
客户端发送信息
服务端收到信息
服务端回复信息,客户端收到回复信息
修改一下,想让他可以一直进行下去
""" 演示Socket服务端开发 """ import socket # 创建Socket对象 socket_server = socket.socket() # 绑定ip地址和端口 socket_server.bind(("localhost",8888)) # 二元元组,第一个元素是你的ip地址或者说主机名,localhost表示本机,第二个元素是你要绑定的端口。 # 监听端口 socket_server.listen(1) # listen方法内接收一个整数参数,表示允许我们连接的数量 # 等待客户端链接 result:tuple = socket_server.accept() # 返回一个二元元组,第一个元素是链接对象,第二个元素是地址信息 conn = result[0] # 客户端和服务端的链接对象 address = result[1] # 客户端的地址信息 # 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 # encode可以将字符串编码为字节数组对象 conn.send(msg.encode("UTF-8")) # 关闭链接 conn.close() socket_server.close()
使用while循环,使得客户端与服务端之间可以一直发送信息
总结
2.客户端开发
学习目标:基于Socket完成客户端程序开发
""" 演示Socket客户端开发 """ import socket # 创建socket对象 socket_client = socket.socket() # 连接到服务器 socket_client.connect(("localhost",8888)) # 发送信息 socket_client.send("你好啊".encode("UTF-8")) # 接收返回信息 recv_data = socket_client.recv(1024) # 1024是缓冲区的大小,一般1024即可,同样recv方法是阻塞的 print(f"服务器回复的信息是:{recv_data.decode('UTF-8')}") # 关闭链接 socket_client.close()
同时启动客户端和服务端
服务端回复
客户端收到回复信息后,关闭进程
使用while循环稍微修改修改,让它也可以无限循环
""" 演示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()
这样就实现了服务端和客户端的循环交流
如何确定是客户端还是服务端,主要看第二步,绑定地址的是服务端,连接地址的是客户端,客户端是先发送在接收,服务端是先接收在回复。
标签:socket,python,编程,server,msg,多线程,recv,服务端,客户端 From: https://blog.csdn.net/2401_87332612/article/details/143721789