首页 > 编程语言 >Python学习从0到1 day28 Python 高阶技巧 ⑥ Socket服务端开发

Python学习从0到1 day28 Python 高阶技巧 ⑥ Socket服务端开发

时间:2024-11-17 17:49:54浏览次数:3  
标签:day28 Python accept server socket conn 服务端 客户端

我们终将上岸,阳光万里

                        —— 24.11.13

一、Socket

socket(简称 套接字)是进程之间通信一个工具,好比现实生活中的插座,所有的家用电器要想工作都是基于插座进行。进程之间想要进行网络通信需要socket。

Socket负责进程之间的网络数据传输,好比数据的搬运工。


二、客户端和服务端

2个进程之间通过Socket进行相互通讯,就必须有服务端和客户端

什么是客户端和服务端

Socket服务端:被动等待其它进程的连接、可接受发来的消息、可以回复消息

Socket客户端:主动连接服务端、可以发送消息、可以接收回复

示意图


三、Socket服务端编程

导包

import socket

1.创建socket对象

# 创建Socket对象
socket_server = socket.socket()

2.绑定socker_server到指定IP和地址

socket对象.bind(指定IP,指定端口)

# 绑定Ip地址和端口 要将主机地址和端口号组成一个元组作为参数传入
socket_server.bind(("localhost",8080))

3.服务端开始监听端口

listen(端口)        

# 监听端口  listen方法内接受一个整数传参数,表示接受的链接数量
socket_server.listen(1)

4.等待接收客户端连接,获得链接对象

accept方法是阻塞方法,如果没有连接,会卡在当前这一行不向下执行代码

accept返回的是一个二元元组,可以使用上述形式,用两个变量接收二元元组的2个元素

# 等待客户端链接 accept方法返回的是二元元组(链接对象,客户端地址信息)    accept是阻塞方法
result = socket_server.accept()
conn = result[0]    # 客户端和服务端的连接信息
address = result[1]     # 客户端的地址信息
'''
也可以写为:
conn,address = socket_server.accept()
'''

5.客户端连接后,通过recv方法,接收客户端发送的消息

可以通过 while True 无限循环来持续和客户端进行数据交互

可以通过判定客户端发来的特殊标记,如exit,来退出无限循环

    # 接收客户端信息 要是有客户端和服务端的本次连接对象
    data = conn.recv(1024).decode("utf-8")

6.通过conn(客户端当次链接对象),调用send方法可以回复消息

    conn.send(msg.encode("utf-8"))

7. conn(客户端当此连接对象)和socket_server对象调用close方法,关闭连接

# 关闭链按
conn.close()
socket_server.close()

8.下载网络调试助手

https://github.com/nicedayzhu/netAssist/releases

9.一次通话聊天

'''
演示socket服务端开发
'''
import socket

# 创建Socket对象
socket_server = socket.socket()

# 绑定Ip地址和端口 要将主机地址和端口号组成一个元组作为参数传入
socket_server.bind(("localhost",8080))

# 监听端口  listen方法内接受一个整数传参数,表示接受的链接数量
socket_server.listen(1)

# 等待客户端链接 accept方法返回的是二元元组(链接对象,客户端地址信息)    accept是阻塞方法
result = socket_server.accept()
conn = result[0]    # 客户端和服务端的连接信息
address = result[1]     # 客户端的地址信息
'''
也可以写为:
conn,address = socket_server.accept()
'''
print(f"接受了客户端的连接,客户端的信息是{address}")

# 接收客户端信息 要是有客户端和服务端的本次连接对象
data = conn.recv(1024).decode("utf-8")
# recv接受的参数是缓冲区大小,一般给1024即可
# recv方法的返回值是一个字节数组也就是bytes对象,不是字符串,可以通过decode方法通过UTF-8编码,将字节数组转换为字符串对象
print(f"客户端发送的信息是:{data}")

# 发送回复消息
msg = input("请输入您要回复的信息:")
# encode可以将字符串编码转换为字节数组
conn.send(msg.encode("utf-8"))

# 关闭链按
conn.close()
socket_server.close()

10.循环通话

将建立链接后的对话部分放进循环中,循环条件为True,无限循环下去,直到服务端说了exit则断开连接,退出通话

'''
演示socket服务端开发
'''
import socket

# 创建Socket对象
socket_server = socket.socket()

# 绑定Ip地址和端口 要将主机地址和端口号组成一个元组作为参数传入
socket_server.bind(("localhost",8080))

# 监听端口  listen方法内接受一个整数传参数,表示接受的链接数量
socket_server.listen(1)

# 等待客户端链接 accept方法返回的是二元元组(链接对象,客户端地址信息)    accept是阻塞方法
result = socket_server.accept()
conn = result[0]    # 客户端和服务端的连接信息
address = result[1]     # 客户端的地址信息
'''
也可以写为:
conn,address = socket_server.accept()
'''
print(f"接受了客户端的连接,客户端的信息是{address}")

while True:
    # 接收客户端信息 要是有客户端和服务端的本次连接对象
    data = conn.recv(1024).decode("utf-8")
    # recv接受的参数是缓冲区大小,一般给1024即可
    # recv方法的返回值是一个字节数组也就是bytes对象,不是字符串,可以通过decode方法通过UTF-8编码,将字节数组转换为字符串对象
    print(f"客户端发送的信息是:{data}")

    # 发送回复消息
    msg = input("请输入您要回复的信息:")
    # encode可以将字符串编码转换为字节数组
    conn.send(msg.encode("utf-8"))

# 关闭链按
conn.close()
socket_server.close()


四、Socket客户端编程

导包

import socket

1.创建Socket对象

# 创建socket对象
socket_client = socket.socket()

2.连接到服务端

# 连接到服务器 参数传元组:主机名,端口号
socket_client.connect(("localhost",8080))

3.发送消息(字节数组)

    # 发送消息
    socket_client.send(msg.encode("UTF-8"))

4.接收返回消息

    # 接收返回消息 1024:缓冲区大小 recv方法同样是阻塞的
    recv_data = socket_client.recv(1024)

5.关闭链接

# 关闭链接
socket_client.close()

先开启服务端,再有客户端链接


客户端服务端综合演示

注:

1.客户端先发送才能接收

2.服务端先接收才能回复

3.客户端只有一个socket对象

4.服务端对每个客户端进行单独的连接对象conn

标签:day28,Python,accept,server,socket,conn,服务端,客户端
From: https://blog.csdn.net/m0_73983707/article/details/143690592

相关文章

  • Python 潮流周刊#77:Python 依赖管理就像垃圾场火灾?(摘要)
    本周刊由Python猫出品,精心筛选国内外的250+信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进Python技术,并增长职业和副业的收入。分享了12篇文章,12个开源项目,2则热门讨论,全文2200字。以下是本期摘要:......
  • 【Python图解】跟着图片,带你入门Python
    【图解Python】跟着图片流程,带你入门PythonPython安装及基本语法Python是一种上手简单、功能丰富的编程语言,广泛用于数据科学领域。它允许用户快速解决问题,而不必深陷复杂的语法和编程细节。在全球数据科学家和研究人员享受Python带来的便利的同时,也有人在开发强大的数据......
  • 【视频讲解】Python深度神经网络DNNs-K-Means(K-均值)聚类方法在MNIST等数据可视化对比
    全文链接:https://tecdat.cn/?p=38289原文出处:拓端数据部落公众号分析师:CucuSun近年来,由于诸如自动编码器等深度神经网络(DNN)的高表示能力,深度聚类方法发展迅速。其核心思想是表示学习和聚类可以相互促进:好的表示会带来好的聚类效果,而好的聚类为表示学习提供良好的监督信号。关......
  • 【华为OD技术面试手撕真题】84、前 K 个高频元素 | 手撕真题+思路参考+代码解析(C & C+
    文章目录一、题目......
  • python学习笔记1
    *args:不定长参数,特点:可以接受[0.+无穷大)的实参print(*values,sep='',end='\n',file=sys.stdout,flush=False)values:会将实参转换成字符串,再输出sep:输出多个对象时用什么间隔,默认为一个空格字符,若要改变其他方式间隔,则需要关键词参数。end:用什么结尾,默认为换行‘\n’......
  • Python+Flask实现搜索引擎,万能搜索框
    万能框指同时支持股票、基金、新闻搜索和命令查询等。下面按新闻、股票、基金检索顺序介绍。一、新闻搜索引擎主要技术当你用Python+Selenium下载新闻之后,如何下载参考上篇博文,就会面临新闻搜索的问题。自己做一个搜索引擎的优点很明显,没有广告,节省时间,如图的比较:搜索......
  • python岭迹图绘制函数
    一.岭迹图是什么?    岭迹图(RidgeTracePlot)是一种可视化工具,用于展示岭回归中正则化参数($\alpha$)对回归系数的影响。它能帮助我们理解特征的稳定性和正则化在控制模型复杂度中的作用。二.什么时候需要看岭迹图?存在共线性特征时当特征间高度相关,普通最小二乘法(OLS)......
  • python爬虫爬取网页中文乱码问题的解决
    一:遇到的问题1.代码点击查看代码importrequestsifname=='main':#指定URLurl='https://xxxxxx'#发送请求1.page_text=requests.get(url,headers=headers).text#打印print(page_text)2.返回的网页内容点击查看代码#省略的代码第ä¸å·宴æ¡......
  • Excel 与 Python 的强强联合:开启数据分析与处理的新大门 
     在数据处理和分析的世界里,Excel一直是大家耳熟能详、应用广泛的工具,凭借其直观的界面和丰富的函数,能够轻松应对许多基础的数据操作。而Python呢,作为一门功能强大、灵活多变的编程语言,在数据科学领域更是有着无可替代的地位。当Excel遇上Python,它们就如同默契的搭档,能......
  • python基于深度学习的音乐推荐方法研究系统
    需求设计一款好的音乐推荐系统其目的是为用户进行合理的音乐推荐,普通的用户在登录到系统之后,能够通过搜索的方式获取与输入内容相关的音乐推荐,而以管理员登录到系统之后,则可以进行徐昂管的数据管理等内容操作。此次的需求主要有以下的一些方面:(1)用户的登录过程实现,要实现为......