24.Python 网络编程之socket编程

news2025/1/12 16:08:52

目录

    • 1.认识TCP/IP
    • 2.socket编程
      • 2.1 使用socket
      • 2.2 使用socketserver

1.认识TCP/IP

计算机网络就是把各个计算机连接在一起,在网络中的计算机可以互相通信。

网络编程是如何在程序中实现两台计算机的通信。

网络通信是两台计算机上的两个进程之间的通信。

为了把全世界的所有不同类型的计算机都连接起来,就必须规定一套全球通用的协议,互联网协议包含了上百种,但最重要的有TCP和IP协议。

TCP/IP 协议被分为4层:应用层、传输层、网络层、接口层:

  • 应用层协议有HTTP、FTP、SMTP等,用来接收来自传输层的数据或按不同应用要求及方式将数据传输至传输层。
  • 传输层协议有UDP、TCP,实现数据传输与数据共享。
  • 网络层协议有ICMP、IP、IGMP,主要负责网络中的数据包的传送等。
  • 接口层协议有ARP、RARP,主要提供链路管理、错误检测、对不同通信媒介有关信息细节问题进行有效处理等。

通信双方必须知道对方的标识,互联网每个计算 机的唯一标识就是IP地址。如果一台计算机同时接入两个或更多的网络,如路由器,就要有两个或多个IP地址。所以,IP地址对应的实际上是计算机的网络接口,通常是网卡。

TCP协议是建立IP协议之上的,负责在两台计算机之间建立可靠连接,保证数据包按顺序到达。TCP协议会通过握手建立连接,然后对每个IP包编号,确保对方按顺序收到,如果包丢掉了,就自动重发。

2.socket编程

socket 是应用层与传输层、网络层之间进行通信的中间软件抽象层,是一组接口,把复杂的TCP/IP协议隐藏在socket接口后面,对用户来说,一组简单的接口就是全部,调用socket接口函数去组织数据,以符合指定的协议,这样网络间的通信业就简单了许多。

Python 提供了两个基本的socket处理模块。

  • socket:提供了标准的BSD Sockets API,可以访问底层操作系统socket接口的全部方法。
  • socketsever:提供了服务器中心类,可以简化网络服务器的开发。

2.1 使用socket

服务器

服务器端进程需要申请套接字,然后绑定套接字进行监听。当有客户端发送请求,则接收数据并进行处理,处理完后对客户端进行响应。

  1. 创建套接字
import socket
# socket模块的socket()函数能创建socket对象
socket.socket([family[,type[,proto]]])
'''
family:设置套接字种族,包括AF_UNIX和AF_INET,常用AF_INET选项。
type:设置套接字类型。
proto:协议类型,默认为0,一般不填。
'''
s1 = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 网络通信,协议类型
  1. 绑定套接字
s1.bind(address) # address 地址必须是一个元组:(host,port)
s1.bind((host,port))
  1. 监听套接字
s1.listen(backlog) # backlog指定最多允许多少个客户端连接服务器
  1. 等待接受连接
connection,address = s1.accept() # 阻塞状态
  1. 处理阶段
# 数据以字节串格式返回,bufsize指定最多可以接受的数量。
connection.recv(bufsize[,flag]) 
# 发送给连接的客户端套接字
connection.send(string[,flag])
  1. 关闭连接
s1.close()

客户端

客户端只需要申请一个套接字,然后通过套接字连接到服务器端,建立连接之后就可以通信。

  1. 创建套接字socket对象。
import socket # 导入socket模块
s2 = socket.socket()  # 实例化socket 对象
  1. 连接到服务器端。
s2.connect(address) # address 地址必须是一个元组:(host,port)
  1. 处理阶段。
# 数据以字节串格式返回,bufsize指定最多可以接受的数量。
s2.recv(bufsize[,flag])  
# 将参数string包含的字节串发送到服务器端
s2.send(string[,flag]) 
  1. 关闭连接。
s2.close()

示例:使用socket模块构建一个网络通信服务。

# 新建server.py,输入以下命令,作为服务器端响应文件
import socket
# 创建服务端服务
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(('localhost',6999)) # 绑定要监听的端口,本地计算机6999
s.listen(5) # 开始监听,使用5个连接排队
while True:
    conn,addr = s.accept()
    print(conn,addr) # 输出连接信息
    try:
        data = conn.recv(1024) # 接收数据
        print('recive:',data.decode()) # 解码
        conn.send(data.upper()) # 发送数据
        conn.close() # 关闭连接
    except:
        print('出现异常')
        break
# 新建client.py,输入以下命令,作为客户端请求文件
import socket
c = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
c.connect(('localhost',6999)) #
msg = '欢迎新同学!'
c.send(msg.encode('utf-8')) # 发送一条信息,将字符串转换为字节流
data = c.recv(1024) # 接收信息,大小为1024字节
print('recv:',data.decode()) # 输出接收信息
c.close() # 关闭

在这里插入图片描述

2.2 使用socketserver

socketserver模块封装了socket模块和select模块,使用多线程处理多个客户端的连接,使用select模块处理高并发访问。

  • 服务类:提供了建立连接的过程,如绑定、监听、运行等。
  • 请求处理类:专注于如何处理用户发送的数据

服务类

服务类包含5种类型:

  • BaseServer:不直接对外服务。
  • TCPServer:针对TCP套接字流。
  • UDPServer:针对UDP数据报套接字。
  • UnixStreamServer和UnixDatagramServer:针对Unix域套接字,不常用。

请求处理类

socketserver 模块提供请求处理类BaseRequestHandler, 以及派生类StreamRequestHandler(处理流式套接字)和DatagramRequestHandler(处理数据报套接字)。请求处理类有3种方法:

  • setup():在handle()之前被调用,执行处理请求前的初始化操作,默认不做任何事情。
  • handle():执行与处理请求相关的工作。
  • finish():在handle()之后调用,执行处理完请求后的清理操作,默认不做任何事情。

使用socketserver创建一个服务,具体步骤如下:

  1. 创建一个请求处理类,选择StreamRequestHandler或DatagramRequestHandler作为父类,也可以选择BaseRequestHandler作为父类,并重写handle()方法。
  2. 实例化一个服务类对象,并将服务的地址和第1步创建的请求处理类传递给它。
  3. 调用服务类对象的handle_request()或server_forever()方法开始处理请求。

示例:使用socketserver模块构建一个网络通信服务。

# 新建server1.py,输入以下命令,作为服务器端响应文件
import socketserver
class MyTCPHandler(socketserver.BaseRequestHandler): # 自定义请求处理类
    def handle(self): # 重写handle()方法
        try:
            while True:
                self.data = self.request.recv(1024) # 接收数据
                print(self.client_address,self.data)  # 打印数据
                if not self.data: # 如果没有接收到数据
                    print('连接丢失')
                    break # 结束轮询
                self.request.sendall(self.data.upper()) # 向客户端响应数据
        except Exception as e:
            print(self.client_address,'连接断开')
        finally:
            self.request.close() # 关闭
    def setup(selfself): # 重写setup()方法
        print('setup被执行')
    def finish(self): # 重写finish()方法
        print('finish被执行')
if __name__ == "__main__":
    s = socketserver.TCPServer(('localhost',9999),MyTCPHandler)
    s.serve_forever()
# 新建client1.py,输入以下命令,作为客户端请求文件
import socket
c = socket.socket()
c.connect(('localhost',9999)) # 连接到服务器
while True:
    cmd = input('是否退出(y/n)').strip() # 是否退出
    if len(cmd)==0:
        continue
    if cmd=='y' or cmd=='Y': # 退出交流
        break
    c.send(cmd.encode()) # 发送信息
    cmd_res=c.recv(1024) # 接收信息
    print(cmd_res.decode()) # 打印信息
c.close() # 关闭

在这里插入图片描述

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

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

相关文章

第十一节HarmonyOS 常用容器组件3-Tabs

一、Tabs 1、概述 我们经常使用时,会出现试图切换的场景,比如底部有多个菜单,“首页”、 “我的”等。 两个内容容器的切换: ArkUI开发框架提供了一种页签容器组件Tabs,开发者通过Tabs组件可以很容易的实现内容视图…

目标检测算法改进系列之添加变核卷积AKConv模块

AKConv变核卷积 KConv的主要思想:AKConv(可变核卷积)主要提供一种灵活的卷积机制,允许卷积核具有任意数量的参数和采样形状。这种方法突破了传统卷积局限于固定局部窗口和固定采样形状的限制,从而使得卷积操作能够更加…

C# OpenVINO 直接读取百度Paddle模型实现物体检测( yolov3_darknet)

目录 效果 项目 代码 下载 C# OpenVINO 直接读取百度Paddle模型实现物体检测( yolov3_darknet) 效果 项目 代码 using OpenCvSharp; using Sdcb.OpenVINO; using Sdcb.OpenVINO.Natives; using System; using System.Collections.Generic; using System.Diagnostics; usi…

Micropython for QNX编译过程

Micropython for QNX编译过程 执行步骤 1. https://github.com/micropython/micropython select tag 1.20.0 git clone micropython 2. make -C mpy-cross 3. 修改py/mkenv.mk CROSS_COMPILE ntoaarch64- 注意如果这步必须在make -C mpy-cross 之后执行,如果需要重…

什么?居然可以免费使用Jetbrains?!

JetBrains是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄罗斯的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是Java编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA。 如下是jetbrains旗下的产…

Ps:使用 Emoji 字符

Emoji 字符是一种在数字通讯中广泛使用的小图像或表情符号,用于表达情感、活动、物体、地点、天气情况等。 Emoji 源自日本,但现已成为全球数字沟通的一部分。这些字符通常是彩色的,并且能够在不同的设备和平台上保持一致性。 通常&#xff0…

以用户为中心的前端性能

1. 简介 前端性能跟用户体验息息相关。举个栗子,当你打开乘车码扫码进站,网页白屏了很久才加载出来,延误了乘车时间;当你在微信抢红包时,点击按钮后延迟了一会才开始转圈圈,最终没抢到红包。当出现这样的情…

python自学之《艾伯特用Python做科学计算》(1)——(待完善)

好吧,刚开始就打了一波而广告 啄木鸟社区的Python图书概览: http://wiki.woodpecker.org.cn/moin/PyBooks (22/388)

pytorch 模型量化quantization

pytorch 模型量化quantization 1.workflow1.1 PTQ1.2 QAT 2. demo2.1 构建resnet101_quantization模型2.2 PTQ2.3 QAT 参考文献 pytorch框架提供了三种量化方法,包括: Dynamic QuantizationPost-Training Static Quantization(PTQ&#xff0…

基于Logistic回归实现二分类

目录 Logistic回归公式推导: Sigmoid函数: Logistic回归如何实现分类: 优化的方法: 代码: 1.创建一个随机数据集,分类直线为y2x: 为什么用np.hstack()增加一列1? 为什么返回…

协同过滤算法:个性化推荐的艺术与科学

目录 引言: 一、协同过滤算法的基本原理 二、协同过滤算法的应用领域 三、协同过滤算法的优缺点 四、协同过滤算法的未来发展方向 五、结论 引言: 在当今数字化时代,信息过载成为了一个普遍的问题。为了帮助人们更好地发现符合个性化需…

Linux驱动开发学习笔记2《LED驱动开发试验》

目录 一、Linux下LED灯驱动原理 1.地址映射 二、硬件原理图分析 三、实验程序编写 1.LED 灯驱动程序编写 2.编写测试APP 四、运行测试 1.编译驱动程序和测试APP (1)编译驱动程序 (2)编译测试APP 2.运行测试 一、Linux下…

分享81个节日PPT,总有一款适合您

分享81个节日PPT,总有一款适合您 81个节日PPT下载链接:https://pan.baidu.com/s/1V0feg5pZ8C1Szycy40CrUw?pwd6666 提取码:6666 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气,收集整理更不易…

Android CardView基础使用

目录 一、CardView 1.1 导入material库 1.2 属性 二、使用(效果) 2.1 圆角卡片效果 2.2 阴影卡片效果 2.3 背景 2.3.1 设置卡片背景(app:cardBackgroundColor) 2.3.2 内嵌布局,给布局设置背景色 2.4 进阶版 2.4.1 带透明度 2.4.2 无透明度 一、CardView 顾名…

【编码魔法师系列_构建型1.3 】抽象工厂模式(Abstract Factory)

学会设计模式,你就可以像拥有魔法一样,在开发过程中解决一些复杂的问题。设计模式是由经验丰富的开发者们(GoF)凝聚出来的最佳实践,可以提高代码的可读性、可维护性和可重用性,从而让我们的开发效率更高。通…

vs 安装 qt qt扩展 改迅雷下载qt

Qt5.14.2安装教程和VS2019中的qt环境配置-CSDN博客 1 安装qt 社区版 免费 Download Qt OSS: Get Qt Online Installer 2 vs安装 qt vs tools 3 vs添加 qt添加 bin/cmake.exe 路径 3.1 扩展 -> qt versions 3.2 4 新版要源码安装 需要自己安装 安装独立安装的旧版 官网…

pygame时序模块time

文章目录 简介时钟对象平抛运动 pygame系列:初步💎加载图像💎图像变换💎直线绘制 简介 之前在更新图形的时候,为了调控死循环的响应时间,用到了time.sleep。而实际上,我们并不需要额外导入其他…

最强Node js 后端框架学习看这一篇文章就够

距离上次认真花时间写作,似乎已经过了许久许久,前端讲了一个新框架 ,叫 Nest.js 下方是课件,有过一定开发经验可跟随视频学习 B站 地址 : https://www.bilibili.com/video/BV1Lg4y197u1/?vd_sourcead427ffaf8a5c8344…

【计算机网络笔记】物理层——数据通信基础

系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 计算机网络性能(2)…

【1】基于多设计模式下的同步异步日志系统-项目介绍

1. 项目介绍 本项⽬主要实现⼀个日志系统, 其主要支持以下功能: • 支持多级别日志消息 • 支持同步日志和异步日志 • 支持可靠写⼊日志到控制台、文件以及滚动文件中 • 支持多线程程序并发写日志 • 支持扩展不同的日志落地⽬标地 2. 开发环境 • CentOS 7 • vs…