【Python】Python 网络编程 ( Socket 套接字简介 | Socket 套接字使用步骤 | Socket 套接字服务端与客户端开发 )

文章目录

  • 一、Socket 套接字简介
    • 1、Socket 套接字概念
    • 2、Socket 套接字类型
    • 3、Socket 套接字使用步骤
    • 4、Socket 套接字服务端与客户端
  • 二、Socket 服务端与客户端开发
    • 1、服务端
    • 2、客户端
    • 3、执行结果





一、Socket 套接字简介




1、Socket 套接字概念


Socket 套接字 是一种 进程之间的 通信机制 , 通过套接字可以在 不同的进程之间 进行数据交换 ;

在这里插入图片描述

在 网络编程 中 , Socket 套接字 主要用于 客户端 与 服务器 之间的 通信 , 大部分 网络相关的应用程序 , 都使用到了 Socket 套接字技术 ;


2、Socket 套接字类型


套接字有两种类型 :

  • 流套接字 : 提供了一个可靠的、面向连接的通信机制 , 可以 顺序地传输数据。
    • 在 TCP/IP 协议中,流套接字使用 TCP 协议进行数据传输。
  • 数据报套接字 : 提供了一种无连接、不可靠的通信机制 , 数据 以独立的数据包形式传输。
    • 在 TCP/IP 协议中,数据报套接字使用 UDP 协议进行数据传输。

3、Socket 套接字使用步骤


Socket 套接字使用步骤 :

  • 创建套接字 : 使用 套接字 API 创建一个套接字对象 , 一般由 编程语言 官方提供 标准 API ;
  • 绑定 IP 地址和端口号 : 将套接字与一个 IP 地址 和 端口号绑定 ;
  • 建立连接 :
    • 服务器端监听连接 : 对于流套接字,需要在服务器端监听客户端的连接请求 ;
    • 客户端建立连接 : 对于流套接字,客户端需要与服务器建立连接 ;
  • 发送和接收数据 : 使用 Socket 套接字 发送 或 接收 数据 ;
  • 关闭连接 : 数据传输完毕后,关闭 Socket 套接字连接 ;

4、Socket 套接字服务端与客户端


Socket 套接字 进行 数据通信时 , 需要有两个 Socket 套接字分别作为 客户端 和 服务器端 :

  • Socket 套接字 服务器端 : 需要 监听客户端的请求 , 可以 向 客户端 发送消息 , 可以接收来自客户端的消息 ;
  • Socket 套接字 客户端 : 需要主动连接 服务器端 , 可以 向 服务器端 发送消息 , 可以接收来自服务器端的消息 ;

一个 服务器端 可以 同时与 多个 客户端 进行 数据交互 ;





二、Socket 服务端与客户端开发




1、服务端


Socket 服务器端流程 :

  • 创建套接字 : 使用 套接字 API 创建一个套接字对象 , 一般由 编程语言 官方提供 标准 API ;
# 1. 创建 socket 实例对象
import time
  • 绑定 IP 地址和端口号 : 将套接字与一个 IP 地址 和 端口号绑定 ;
# 2. 为 socket 实例对象 绑定 IP 地址和端口号
# IP 地址是字符串类型, 端口号是 int 类型, 将这两个数据定义到元组中
socket_server.bind(("127.0.0.1", 8090))
  • 服务器端监听连接 : 对于流套接字,需要在服务器端监听客户端的连接请求 ;
    # 4. 阻塞等待连接 , 如果没有客户端连接 , 会一直阻塞在这里# accept 函数返回的是 二元元组 , 使用两个变量接收该元组# conn 是连接的 socket 对象# address 是连接的 地址client_socket, client_address = socket_server.accept()
  • 发送和接收数据 : 使用 Socket 套接字 发送 或 接收 数据 ;
    # 向客户端发送连接成功提示client_socket.send("你好, 客户端!".encode("UTF-8"))
  • 关闭连接 : 数据传输完毕后,关闭 Socket 套接字连接 ;
    # 关闭连接client_socket.close()

代码示例 :

"""
Socket 服务器 代码示例
"""# 导入 socket 模块
import socket# 1. 创建 socket 实例对象
import timesocket_server = socket.socket()# 2. 为 socket 实例对象 绑定 IP 地址和端口号
# IP 地址是字符串类型, 端口号是 int 类型, 将这两个数据定义到元组中
socket_server.bind(("127.0.0.1", 8090))# 3. 服务器端监听端口
# 传入的参数是一个整数 , 该参数表示允许连接的数量
# 如果连接已满后面的连接请求会等待
socket_server.listen(100)while True:# 4. 阻塞等待连接 , 如果没有客户端连接 , 会一直阻塞在这里# accept 函数返回的是 二元元组 , 使用两个变量接收该元组# conn 是连接的 socket 对象# address 是连接的 地址client_socket, client_address = socket_server.accept()# 向客户端发送连接成功提示client_socket.send("你好, 客户端!".encode("UTF-8"))print(f'客户端连接成功 {client_address}')# 5. 服务器端与客户端进行交互while True:# 循环接收客户端数据, 并使用 UTF-8 解码data = client_socket.recv(1024).decode("UTF-8")# 向客户端会送消息client_socket.send(f"服务端已收到: {data}".encode())print(f"客户端: {data}")if data == 'quit':break# 关闭连接client_socket.close()print(f'客户端连接关闭 {client_address}')

2、客户端


Socket 客户端流程 :

  • 创建套接字 : 使用 套接字 API 创建一个套接字对象 , 一般由 编程语言 官方提供 标准 API ;
# 1. 创建 socket 实例对象
client_socket = socket.socket()
  • 通过 IP 地址和端口号 连接服务器 :
# 2. 客户端连接服务器, IP 地址和端口号放在元组中
client_socket.connect(('127.0.0.1', 8090))
  • 发送和接收数据 : 使用 Socket 套接字 发送 或 接收 数据 ;
# 发送数据到服务器
client_socket.send('你好, 服务器!'.encode())
  • 关闭连接 : 数据传输完毕后,关闭 Socket 套接字连接 ;
# 4. 关闭连接
client_socket.close()

代码示例 :

import socket# 创建TCP socket对象
import time# 1. 创建 socket 实例对象
client_socket = socket.socket()# 2. 客户端连接服务器, IP 地址和端口号放在元组中
client_socket.connect(('127.0.0.1', 8090))# 3. 向服务器端发送消息和接收消息
# 发送数据到服务器
client_socket.send('你好, 服务器!'.encode())
print("客户端发送: 你好, 服务器!")time.sleep(1)
# 接收服务器数据
data = client_socket.recv(1024).decode("UTF-8")
print(f"服务端: {data}")# 获取命令行输入发送给客户端
while True:command = input("请输入: ")client_socket.send(command.encode())print(f"客户端发送: {command}")if command == 'quit':break# 接收服务器数据data = client_socket.recv(1024).decode("UTF-8")print(f"服务端: {data}")# 4. 关闭连接
client_socket.close()
print("客户端关闭")

3、执行结果


先启动服务器端 :

在这里插入图片描述

启动客户端 :
在这里插入图片描述
此时服务器端信息如下 :
在这里插入图片描述
客户端中断输入 1 :

在这里插入图片描述
服务器端效果 :
在这里插入图片描述

客户端继续输入信息 :
在这里插入图片描述
服务器端信息如下 :
在这里插入图片描述

客户端输入 quit 关闭连接 :

在这里插入图片描述

服务器端对应的数据 :

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/11455.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是 web3?

在百度搜索引擎输入 “Web3”、“大厂”。跳出来基本都是这样的标题. 以及如今的互联网行业 “哀鸿遍野”,不仅内卷,还裁员。然后掀起一阵风,猛吹 Web3 的好,数据回归用户……最后再 “威逼利诱” 一下,Web3 就是 20 年…

剑指 Offer 37. 序列化二叉树 / LeetCode297. 二叉树的序列化与反序列化(二叉树遍历(深度优先搜索))

题目: 链接:剑指 Offer 37. 序列化二叉树;LeetCode 297. 二叉树的序列化与反序列化 难度:困难 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中&#xff0…

LViT:语言与视觉Transformer在医学图像分割

论文链接:https://arxiv.org/abs/2206.14718 代码链接:GitHub - HUANGLIZI/LViT: This repo is the official implementation of "LViT: Language meets Vision Transformer in Medical Image Segmentation" (IEEE Transactions on Medical I…

MIPI D-PHY 2.1协议(学习笔记)

1~3 简介/术语/参考文档 这三章属于介绍性内容,包括缩略语等名词术语解释内容,不再赘述。 直接进入以下正文部分 4 D-PHY概述 D-PHY描述了一种Source同步、高速、低功耗、低成本的PHY,特别适用于移动应用。这个D-PHY规范主要是为了将相机…

Vue 中通用的 css 列表入场动画效果

css 代码 .gradientAnimation {animation-name: gradient;animation-duration: 0.85s;animation-fill-mode: forwards;opacity: 0; }/* 不带前缀的放到最后 */ keyframes gradient {0% {opacity: 0;transform: translate(-100px, 0px);}100% {opacity: 1;transform: translate…

Linux_CentOS_7.9部署Docker以及镜像加速配置等实操验证全过程手册

前言:实操之前大家应该熟悉一个新的名词DevOps 俗称开发即运维、新一代开发工程师(Development和Operations的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障&…

合并 K 个升序链表——力扣23

题目描述 法一 顺序合并 class Solution { public:ListNode* mergeTwoLists(ListNode* l1, ListNode* l2){ListNode* dummy new ListNode(-1); //创建一个新的头节点 ListNode *curdummy, *aPtr l1, *bPtr l2;while(aPtr && bPtr){if(aPtr->val < bPtr->…

版本适配好帮手 Android SDK Upgrade Assistant / Android Studio Giraffe新功能

首先是新版本一顿下载↓&#xff1a; Download Android Studio & App Tools - Android Developers 在Tools中找到Android SDK Upgrade Assistant 可以在此直接查看SDK升级相关信息&#xff0c;不用跑到WEB端去查看了。 例如看一下之前经常要对老项目维护的android 12蓝牙…

gitee中fork了其他仓库,如何在本地进行同步

GitHub 操作&#xff1a;同步 Fork 来的仓库&#xff08;上游仓库&#xff09;_sigmarising的博客-CSDN博客 1. 设置upstream 2. git pull --rebase 3. 然后再执行pull、push操作

神经数据库:用于使用 ChatGPT 构建专用 AI 代理的下一代上下文检索系统 — (第 2/3 部分)

书接上回理解构建LLM驱动的聊天机器人时的向量数据库检索的局限性 - &#xff08;第1/3部分&#xff09;_阿尔法旺旺的博客-CSDN博客 其中我们强调了&#xff08;1&#xff09;嵌入生成&#xff0c;然后&#xff08;2&#xff09;使用近似近邻&#xff08;ANN&#xff09;搜索…

Intellij IDEA有什么奇技淫巧?

IDEA全称 IntelliJIDEA&#xff0c;是java语言开发的集成环境&#xff0c;IntelliJ在业界被公认为最好的java开发工具之一&#xff0c;尤其在智能代码助手、代码自动提示、重构、J2EE支持、Ant、JUnit、CVS整合、代码审查、创新的GUI设计等方面的功能可以说是超常的。 idea下载…

index页面通过<script>引入根目录下的js文件后,vite打包项目后,项目中无js文件解决方法

解决方法&#xff1a; 根据打包报错提示&#xff0c;如图&#xff1a;即在<script>标签中加入&#xff1a;type&#xff0c;如图&#xff1a; 再打包 js文件就会被打包进去&#xff01;

水文监测软件 HYPACK 2023.2 Crack

HYPACK是由美国coastal海洋图像公司出品的一款世界知名的水文综合测量软件。它能够为勘测员提供了设计勘测、收集数据、处理数据、减少数据和生成最终产品所需的所有工具。从大地测量转换、测量设计、数据采集、数据后处理直到最终测量成图都实现了快速可靠&#xff0c;强大的绘…

六边形架构和分层架构的区别?

六边形架构和分层架构是什么&#xff1f; 六边形架构&#xff08;Hexagonal Architecture&#xff09;和分层架构&#xff08;Layered Architecture&#xff09;是两种常见的软件架构模式。六边形架构强调将核心业务逻辑与外部依赖解耦&#xff0c;通过接口与外部世界进行通信。…

一文让你彻底搞懂Mybatis之缓存机制

编译软件&#xff1a;IntelliJ IDEA 2019.2.4 x64 操作系统&#xff1a;win10 x64 位 家庭版 Maven版本&#xff1a;apache-maven-3.6.3 Mybatis版本&#xff1a;3.5.6 文章目录 一. 缓存是什么&#xff1f;二. 为什么要使用缓存&#xff1f;三. Mybatis中的缓存分哪几种&#…

MySql基本操作

在了解具体的MySql操作之前&#xff0c;我们需要了解一些基本的sql语句注意事项&#xff0c;如下所示&#xff1a; 每一条sql语句都需要以英文 ; 作为结尾&#xff1b;sql语句当中的关键字不区分大小写&#xff0c;不区分双引号和单引号&#xff1b;sql中库名称、表名称和字段…

Windows 不同方式打开的cmd/dos窗口属性配置不同

文章目录 1. 默认值&#xff08;控制台窗口&#xff09;属性2. "C:\Windows\System32\cmd.exe" 属性3. "命令提示符"属性4. 自定义某标题cmd窗口属性5. cmd快捷方式的属性总结 最近在写某个批处理脚本时&#xff0c;意外发现 Windows系统中&#xff0c;在不…

HBuilder 编辑器终端窗口无法输入,未响应的解决方案

HBuilder 编辑器终端窗口无法输入&#xff0c;未响应的解决方案 一、找到 HBuilder 安装目录 找到 main.js HBuilderX - plugins - builtincef3terminal - script - main.js 二、编辑 main.js 将 main.js 文件中的 powershell.exe 和 cmd.exe 路径都改为绝对路径 C:/Windows…

传染病模型

title: 传染病模型 date: 2023-7-24 10:55:00 updated: 2023-7-24 10:55:00 tags: 算法数学建模传染病模型matlab categories: 数学建模 传染病模型中的符号表示 SI模型&#xff08;艾滋传染模型&#xff09; %% 直接求微分方程的解析解 dsolve(Dx1 -0.1 * x1 * x2 / 1000, D…

SSIS对SQL Server向Mysql数据转发表数据 (三)

1、在控制流界面&#xff0c;在左侧的组件里&#xff0c;添加一个“序列容器组件”和一个“数据流任务组件” 2、双击数据流任务&#xff0c;进入到数据流界面&#xff0c;然后再在左面添加一个OLE DB 源组件、目标源组件 3、右键源组件&#xff0c;编辑&#xff0c;选择好相关…