当前位置: 首页 > news >正文

Python网络编程

网络编程 Socket(套接字)

socket 位于 网络协议中的 数据传输层、 该层 主要 可以通过 UDP 或者 TCP协议 实现 数据的传输

TCP 协议 VS UDP协议

  • tcp : 是一个 可靠的 ,面向 连接的协议。 数据在网络传输中 是安全的,不易丢失的。 TCP连接 在建立的时候,需要 经过 3次握手才能成功、 在断开连接的时候,需要经过 4次挥手 才能断开。
  • udp : 是一个 不可靠的连接 、在 数据传输中 可以会出现数据丢失的问题 。传输速度比 TCP 快。

TCP 的三次握手 四次挥手


TCP 服务端代码编写

编写服务端代码的步骤

a) 创建一个 套接字对象

b) 绑定 主机(IP地址) 和 端口, 端口号的取值范围是 0 ~ 65535 ,不建议自己使用 四位数一下的端口

c) 监听 客户端的 连接 和 端口

d) 如果有客户端和服务器建立 链接、 则监听 客户端发送的消息。

f) 服务端 向 客户端 发送 消息 、

g) 断开与客户端的连接。

import socketif __name__ == '__main__':# 1. 创建一个套接字对象#   family :  采用那种模式连接服务器, 推荐使用 AF_INET (采用端口号)#   type :  采用 什么协议 SOCK_STREAM (TCP协议), SOCK_DGRAM (UDP协议)socket_server = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)# 2. 绑定主机和端口号, 主机是一个字符串,端口号必须是一个数字#  主机: a) 可以使用电脑IP地址, b) 可以使用 localhost 或者 127.0.0.1, c) 0.0.0.0 (开放本机IP地址)socket_server.bind(("192.168.17.22", 8888))# 3. 设置 服务器监听 客户端的 连接数socket_server.listen(5)# 4. 监听客户端while True:# 被动等待客户端的连接, accept 会阻塞程序的执行。# 返回 和 客户端的 conn连接通道, addr 是 客户端的IP地址和连接的端口号conn, addr = socket_server.accept()# 5. 接收客户端发送的数据 (字符串流)、需要传递一个参数,指定接收的字节数msg = conn.recv(1024).decode()# 打印消息print(f"{addr}客户端发送的消息是{msg}")# 6. 向客户端发送消息conn.send("hello 客户端".encode())# 7. 断开连接conn.close()

TCP 客户端代码编写

import socket# 1. 创建一个  套接字 对象
sc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 2. 连接 TCP 服务器
sc.connect(("192.168.17.22", 8888))# 3. 发送消息给 服务器
sc.send("Hello World".encode())# 4. 接收 服务器 给的消息
data = sc.recv(1024).decode()print("服务器发送的消息是", data)# 5. 断开连接
sc.close()

客户端与客户端聊天

  • 服务端代码
import socket
import threading
import re
import jsondef forward_message(conn: socket.socket,  client_mapping: dict):"""转发消息"""while True:# 获取消息message = conn.recv(1024 * 8).decode('utf-8')# 如果这个消息是一个纯数字,说明是客户端第一次向服务器表明身份if re.fullmatch(r"\d+", message):# 将身份信息 和 通道 写入到 字典中client_mapping[message] = connprint(f"客户端{message}上线了...")else:# 如果服务器传入的不是数字、那么一定是一个字典格式的字符串dct = json.loads(message)  # {to:1111, text:'xxx', from:  2222}# 从 client_mapping 中 查找 键为 dct["to"] 的 通道sc: socket.socket = client_mapping.get(dct["to"])# 如果 找不到 sc , 说明 好友没上线if sc is None:# 给 发消息的人 返回 一个 好友不在线的 提醒conn.send("404".encode("utf-8"))else:# 使用 sc 通道、将 message 转发给 好友,这行代码有可能会报错sc.send(message.encode("utf-8"))if __name__ == '__main__':# 创建一个聊天服务器socket_server = socket.socket()# 绑定 主机和端口socket_server.bind(("0.0.0.0", 9999))# 监听客户端连接数量socket_server.listen(5)# 定义一个字典 ,用来 存储所有的客户端信息client_mapping = {}# 编写一个 while 死循环、被动等待所有客户端的连接while True:# 获取 客户端的连接conn, addr = socket_server.accept()# 每来一个客户端,开启一个线程,负责转发该客户端的消息threading.Thread(target=forward_message, args=(conn, client_mapping)).start()
  • 客户端 聊天类 编写
import socket
import threading
import jsonclass QQChat:def __init__(self, account):"""初始化 QQ账号"""self.__qq = account# 初始化 socket客户端socket_client = socket.socket()# 连接 QQ服务器socket_client.connect(("192.168.17.22", 9999))# 将 socket_client 作为 对象的属性self.__socket_client = socket_client# 向服务器发送消息、表明当前是哪一个客户端登录了self.__socket_client.send(account.encode("utf-8"))def chat(self, friend):"""给指定的好友进行聊天"""# 定义一个线程 负责 接收 消息threading.Thread(target=self.__read_message, args=(friend,)).start()# 定义一个线程 负责 发送 消息threading.Thread(target=self.__send_message, args=(friend,)).start()def __read_message(self, friend):"""负责 读取消息"""while True:message = self.__socket_client.recv(1024 * 8).decode("utf-8")# 直接对消息做反序列化data = json.loads(message)if data == 404:print(f"好友{friend}不在线")else:# 一定是一个字典、且字典中包含 谁发的消息# if data["from"] == friend:# 获取好友发送的消息print(f"{friend}:{data['text']}")# else:#     # 如果不是当前聊天的好友#     print("您有一条其他好友发送的消息、已被忽略")def __send_message(self, friend):"""负责发送消息"""while True:# 尝试从键盘获取数据message = input()# 发送消息给 好友data = {"text": message, "to": friend, "from": self.__qq}# 将数据进行 JSON序列化message = json.dumps(data)self.__socket_client.send(message.encode("utf-8"))if __name__ == '__main__':account = input("请输入您的仿QQ账号")# 登录 仿QQ服务器qq_client = client.QQChat(account)friend = input("请输入聊天用户的仿QQ账号")# 选择好友聊天qq_client.chat(friend)

相关文章:

Python网络编程

网络编程 Socket(套接字) socket 位于 网络协议中的 数据传输层、 该层 主要 可以通过 UDP 或者 TCP协议 实现 数据的传输 TCP 协议 VS UDP协议 tcp : 是一个 可靠的 ,面向 连接的协议。 数据在网络传输中 是安全的,不易丢失的。 TCP连接 在建立的时候&…...

openssl生成ca证书

常见CA文件夹 1、生成CA钥匙 openssl genrsa -out ./private/cakey.pem 2、生成CA自签名 openssl req -new -x509 -key ./private/cakey.pem -out ./cacert.crt -days 3650 3、生成http服务器私钥 openssl genrsa -out ./data/frontt.project.com.key 2048 4、CA给http服务器…...

Oracle RAC 环境下数据文件误建在本地目录的处理过程

问题描述 在 Oracle RAC 环境中,有时会误将数据文件创建在本地目录,导致其他节点无法访问该数据文件,从而报出 ORA-01157 和 ORA-01110 错误。 问题分析 错误日志 Mon Nov 16 19:02:38 2021 Errors in file /u01/app/oracle/diag/rdbms/orc…...

新质驱动·科东软件受邀出席2024智能网联+低空经济暨第二届湾区汽车T9+N闭门会议

为推进广东省加快发展新质生产力,贯彻落实“百县千镇万村高质量发展工程”,推动韶关市新丰县智能网联新能源汽车、低空经济与数字技术的创新与发展,充分发挥湾区汽车产业链头部企业的带动作用。韶关市指导、珠三角湾区智能网联新能源汽车产业…...

windows11 使用体验记录

好的地方: UI上字体风格貌似更好看了,文件夹增加了多个标签,类似于浏览器既可以打开多个窗口,也可以在同一个窗口中打开多个标签页 不好的地方: 桌面右下角点击日期时间,显示日期,时间呢&…...

202页MES项目需求方案深入解读,学习MES系统设计规划

202页MES项目需求方案深入解读,学习MES系统设计规划 MES项目需求方案旨在实现制造执行、效率提升、精细化管理等多个方面的功能。整体结构分为七大部分,包括制造执行、效率、精细化、品质在线、设备、用户思想和数据互联。制造执行部分关注订单、品质数据…...

前端css实例

前端css实例 一、带条纹的表格 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>条纹样式的表格<…...

YOLO的框架及版本迭代

YOLO&#xff08;You Only Look Once&#xff09;是一种非常流行的实时目标检测算法&#xff0c;其特点是将目标检测任务转换为一个回归问题&#xff0c;通过一次前向传播就可以同时完成目标的分类和定位。以下是YOLO框架的整体架构和工作原理&#xff1a; 一、YOLO的基本框架…...

PotPlayer 最新版本支持使用 Whisper 自动识别语音生成字幕

PotPlayer 最新版本支持使用 Whisper 自动识别语音生成字幕 设置使用下载地址 设置 使用 下载地址 https://www.videohelp.com/software/PotPlayer...

JavaScript零基础入门速通(中)

目录 1. 函数 1.1 函数声明 1.2 返回值 1.3 匿名函数 1.4 箭头函数 2. 对象 2.1 创建对象 2.2 访问和修改对象的属性 2.3 对象方法 3. 数组 3.1 创建数组 3.2 数组方法 3.3 遍历数组 4. 作用域 4.1 全局作用域 4.2 局部作用域 4.3 块级作用域 5. 事件处理 5…...

【Yarn Bug】 yarn 安装依赖出现的网络连接问题

最近&#xff0c;在初始化 Ant Design Pro 前端脚手架过程中&#xff0c;使用 yarn 安装依赖时遇到了网络连接问题&#xff0c;具体错误信息提示为 info There appears to be trouble with your network connection. Retrying...。通过百度查询&#xff0c;得知出现这种问题的原…...

字节青训Marscode_5:寻找最大葫芦——最新题解

步骤1&#xff1a;问题定义与分析 输入条件&#xff1a; 整数n&#xff1a;牌的数量整数max&#xff1a;葫芦牌面值之和的上限数组array&#xff1a;n张牌的牌面值 输出条件&#xff1a; 两个整数组成的数组[a,b]&#xff1a; a表示三张相同牌的牌面值b表示两张相同牌的牌面值如…...

MySQL —— MySQL 程序

目录 前言 一、MySQL 程序简介 二、mysqld -- MySQL 服务器 三、mysql -- MySQL 客户端 1. mysql 客户端简介 2. mysql 客户端选项 &#xff08;1&#xff09;指定选项的方式 &#xff08;2&#xff09;mysql 客户端命令常用选项 &#xff08;3&#xff09;在命令行中使…...

LLamafactory API部署与使用异步方式 API 调用优化大模型推理效率

文章目录 背景介绍第三方大模型API 介绍LLamafactory 部署API大模型 API 调用工具类项目开源 背景介绍 第三方大模型API 目前&#xff0c;市面上有许多第三方大模型 API 服务提供商&#xff0c;通过 API 接口向用户提供多样化的服务。这些平台不仅能提供更多类别和类型的模型…...

不玩PS抠图了,改玩Python抠图

网上找了两个苏轼的印章图片&#xff1a; 把这两个印章抠出来的话&#xff0c;对于不少PS高手来说是相当容易&#xff0c;但是要去掉其中的水印&#xff0c;可能要用仿制图章慢慢描绘&#xff0c;图章的边缘也要慢慢勾画或者用通道抠图之类来处理&#xff0c;而且印章的红色也不…...

三维渲染中顺序无关的半透明混合(OIT)(一Depth Peeling)

>本文收集关于透明对象渲染技术中关于OIT技术的资料&#xff0c;尝试用简单的逻辑对这些内容进行整理。 1、透明对象的特殊对待 不要小瞧png图片和jpg图片的差异&#xff01;在一般的三维平台&#xff0c;png代表的是带透明通道的纹理&#xff0c;而jpg代表的是不带透明的…...

Linux零基础入门--Makefile和make--纯干货无废话!!

目录 Makefile的概念与使用 Makefile的编写 多个源文件的Makefile编写 Makefile的概念与使用 Makefile其实是linux中的一种包含构建指令的文件&#xff0c;用于自动化构建 一个工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;makefi…...

vim编辑器的一些配置和快捷键

记录vim编辑器的一些配置和快捷键&#xff0c;边学边用&#xff1a; yy 复制dd 删除p&#xff1a;粘贴ctrly 取消撤销u&#xff1a;撤销:w 写入:q 退出a/i 插入O: 上方插入一个空行o&#xff1a;下方插入一个空行:e 打开文件编辑 其他配置&#xff1a; 上移一行和下移一行&a…...

电子应用设计方案-31:智能AI音响系统方案设计

智能 AI 音响系统方案设计 一、引言 智能 AI 音响作为一种新兴的智能家居设备&#xff0c;通过融合语音识别、自然语言处理、音频播放等技术&#xff0c;为用户提供便捷的语音交互服务和高品质的音乐体验。本方案旨在设计一款功能强大、性能稳定、用户体验良好的智能 AI 音响系…...

【设计模式】【结构型模式(Structural Patterns)】之装饰模式(Decorator Pattern)

1. 设计模式原理说明 装饰模式&#xff08;Decorator Pattern&#xff09; 是一种结构型设计模式&#xff0c;它允许在不改变对象接口的前提下&#xff0c;动态地给对象增加额外的责任或功能。这种模式创建了一个装饰类&#xff0c;用于包装原有的类&#xff0c;并在保持类方法…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...