首页 > 编程语言 >python多线程和网络编程

python多线程和网络编程

时间:2024-11-15 09:48:25浏览次数:3  
标签:socket python 编程 server msg 多线程 recv 服务端 客户端

一、多线程

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

相关文章

  • 软件测试笔记|Python自动化测试|python中的数值运算有何特点?
    一、类型方面特点1.类型丰富:支持整数(int)、浮点数(float)、复数(complex)等多种数值类型。2.动态类型:声明变量时无需指定类型,运行时确定类型。二、精度相关特点1.整数精度:整数类型不会溢出,可处理任意大小整数,受机器内存限制。2.浮点数精度:通常用双精度浮点数表示,符合IEEE7......
  • 软件测试笔记|Python自动化测试|isinstance与type有什么区别,分别有什么特点?
    一、区别isinstance和type都可用于判断对象的类型,但它们有明显区别:1.判断方式•type:直接返回对象的类型,是通过比较对象的类型是否完全相同来判断,更关注对象确切的类型本身。•isinstance:判断一个对象是否是指定类型(或其派生类型)的实例,考虑了继承关系,更灵活些。2.对继......
  • [oeasy]python0041_输出ASCII码表_英文字符编码_键盘字符_ISO_646
    输出ASCII码表_英文字符编码_键盘字符_ISO_646回忆上次内容上次输出了从0到122序号对应的所有字符 fornuminrange(123):print(num,chr(num),sep=":")字符类型包括数字大小写字母符号   添加图片注释,不超过14......
  • xshell7上实现MapReduce初级编程实践:对给定的表格进行信息挖掘
      实验环境:操作系统:Linux(Centos7);  Xsell7Hadoop版本:3.4.0(这里的版本根据自己的修改,可能小部分版本的Hadoop不适用于本文实验)下面给出一个child-parent的表格,要求挖掘其中的父子辈关系,给出祖孙辈关系的表格。输入文件内容如下:(保证之间空格为1,否则可能输出会出错)chi......
  • GPU编程
    来源:https://worktile.com/kb/p/2155928 gpu编程有什么用? 图形处理单元(GPU)编程具有多种用途,主要包括:1、加速大规模计算任务、2、图形和视频渲染、3、深度学习和机器学习。GPU编程在深度学习和机器学习领域尤为重要。它允许数据科学家和研究人......
  • 【JavaEE初阶 — 多线程】生产消费模型 & 阻塞队列
         1.阻塞队列     (1)阻塞队列   1.概念   阻塞队列是一种特殊的队列,也遵守"先进先出"的原则;阻塞队列能是一种线程安全的数据结构,主要用来阻塞队列的插入和获取操作:当队列满了的时候,插入操作会被阻塞,直到队列有空位。当队列为空的时......
  • 基于 Python 的机器学习的新闻文本分类系统,附源码
    博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w+、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌......
  • 基于 Python Django 的二手房间可视化系统分析
    博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w+、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌......
  • 2024年09月CCF-GESP编程能力等级认证Python编程二级真题解析
    本文收录于专栏《Python等级认证CCF-GESP真题解析》,专栏总目录:点这里,订阅后可阅读专栏内所有文章。一、单选题(每题2分,共30分)第1题据有关资料,山东大学于1972年研制成功DJL-1计算机,并于1973年投入运行,其综合性能居当时全国第三位。DJL-1计算机运算控制部分所使用的......
  • 编程之路,从0开始:知识补充篇
            Hello大家好,很高兴我们又见面了!    给生活添点passion,开始今天的编程之路!        这一篇我们来补充一下在之前篇目没讲到的知识,并结合一些码友的私信提问和我在编程中遇到的问题,做一些易错点或易混点的讲解。1、储存期        在......