python多线程和网络编程

一、多线程

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()

这样就实现了服务端和客户端的循环交流

如何确定是客户端还是服务端,主要看第二步,绑定地址的是服务端,连接地址的是客户端,客户端是先发送在接收,服务端是先接收在回复。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值