24.Python 网络编程之socket编程

目录

    • 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:continueif cmd=='y' or cmd=='Y': # 退出交流breakc.send(cmd.encode()) # 发送信息cmd_res=c.recv(1024) # 接收信息print(cmd_res.decode()) # 打印信息
c.close() # 关闭

在这里插入图片描述

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

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

相关文章

DevOps|研发提效-敏捷开发之每日站立会

对于研发效能团队建设和组织,本文不再赘述,可以参考之前的文章,已经讲得很透彻了。本文重点讲我们日常是怎么开站立会,怎么让团队跑起来,高效能产出的。每日站立会,15分钟到30分钟,看似非常短的…

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

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

数字信号处理_第4个编程实例(信号的采样与重建)

配套的讲解视频详见数字信号处理14-1_模拟信号转换至数字信号的过程_哔哩哔哩_bilibili,数字信号处理14-2_冲激串的傅里叶变换及采样过程的时频域表示_哔哩哔哩_bilibili,数字信号处理14-3_信号重建与采样定理及Matlab编程实例_哔哩哔哩_bilibili %% //…

Linux常用命令——atq命令

在线Linux命令查询工具 atq 列出当前用户的at任务列表 补充说明 atq命令显示系统中待执行的任务列表,也就是列出当前用户的at任务列表。 语法 atq(选项)选项 -V:显示版本号; -q:查询指定队列的任务。实例 at now 10 minu…

一个完整的手工构建的cuda动态链接库工程 03记

1&#xff0c; 源代码 仅仅是加入了模板函数和对应的 .cuh文件&#xff0c;当前的目录结构如下&#xff1a; icmm/gpu/add.cu #include <stdio.h> #include <cuda_runtime.h>#include "inc/add.cuh"// different name in this level for different type…

pygame时序模块time

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

LeetCode二分查找:寻找比目标字母大的最小字母

LeetCode二分查找&#xff1a;寻找比目标字母大的最小字母 题目描述 给你一个字符数组 letters&#xff0c;该数组按非递减顺序排序&#xff0c;以及一个字符 target。letters 里至少有两个不同的字符。 返回 letters 中大于 target 的最小的字符。如果不存在这样的字符&…

Failed to connect to gitee.com port 443: Time out 连接超时提示【Bug已完美解决-鸿蒙开发】

文章目录 项目场景:问题描述原因分析:解决方案:解决方案1解决方案2:解决方案3:此Bug解决方案总结解决方案总结**心得体会:解决连接超时问题的三种方案**项目场景: 导入Sample时遇到导入失败的情况,并提示“Failed to connect to gitee.com port 443: Time out”连接超…

YouTube Premium 会员白嫖教程

前言 YouTube是美国Alphabet旗下的视频分享网站&#xff0c;也是目前全球最大的视频搜索和分享平台&#xff0c;同时允许用户上传、观看、分享及评论视频 1、点击自己的头像&#xff0c;点击购买内容与会员 2、点击免费试订 3、这里选择个人 4、点击开始试用一个月 5、添加一…

Git 配置文件(.gitignore)

前言 在使用 Git 分布式版本控制系统的时候&#xff0c;有些文件如&#xff1a;数据库的一些配置文件&#xff0c;我们不想让这类文件在远程仓库让 Git 来管理&#xff0c;不想让别人看到&#xff0c;此时就可以自己在 Git 仓库目录下创建 / 在远程仓库创建的时候就配置好 .git…

计算机网络扫盲(3)——网络核心

一、概述 在之前的文章中&#xff0c;我们已经介绍了计算机网络的边缘&#xff0c;本文我们将继续介绍网络核心部分&#xff0c;即由互联因特网系统的分组交换机和链路构成的网状网络。 二、分组交换 在各种网络应用中&#xff0c;端系统彼此交换报文&#xff08;message)。报…

Java内存缓存神器:Caffeine(咖啡因)

文章目录 一、Caffeine简介二、缓存加载1、手动加载2、自动加载3、手动异步加载&#xff08;需要额外的包&#xff09;4、自动异步加载 三、缓存清理1、基于容量2、基于时间3、基于引用 四、缓存移出1、手动移出2、移出监听器 五、刷新缓存 一、Caffeine简介 官网&#xff1a;…

PCL 点云加权均值收缩

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 受到之前Matlab 加权均值质心计算(WMN)的启发,我们在计算每个点的加权质心时可以很容易的发现,他们这些点会受到周围邻近点密度的影响,最后会收缩到某一个区域,那么这个区域也必定是我们比较感兴趣的一些点,…

conda使用——(待完善)

conda删除虚拟环境 conda env remove --name your_env_name Python Anaconda导出(export)环境到environment.yml文件conda create --prefix 命令安装虚拟环境到指定路径报错conda环境打包迁移及部署conda使用yaml创建虚拟环境conda创建新环境Linux查看当前Cuda&#xff08;CUDA…

《系统架构设计师教程(第2版)》第2章-计算机系统基础知识-02-计算软件

文章目录 1. 概述2. 操作系统2.1 操作系统的组成2.2 操作系统的作用2.3 操作系统的特征2.4 操作系统的分类2.4.1 批处理操作系统2.4.2 分时操作系统2.4.3 实时操作系统2.4.4 网络操作系统2.4.5 分布式操作系统2.4.6 微型计算机操作系统2.4.7 嵌入式操作系统3. 数据库3.1 关系型…

2023.12.4

race\牛客\多校\广西师范大学训练赛\雾锁山头山锁雾.cpp #include<bits/stdc.h> #include<iostream> #include<algorithm> #include<map> #include<set> #include<queue> #include<cstring> #include<math.h> #include<ma…

uniapp中进行地图定位

目录 一、创建map 二、data中声明变量 三、获取当前位置信息&#xff0c;进行定位 四、在methods中写移动图标获取地名地址的方法 五、最终展示效果 一、创建map <!-- 地图展示 --><view class"mymap"><!-- <view class"mymap__map"…

LangChain(0.0.340)官方文档五:Model

LangChain官网、LangChain官方文档 、langchain Github、langchain API文档、llm-universe 文章目录 一、Chat models1.1 Chat models简介1.2 Chat models的调用方式1.2.1 环境配置1.2.2 使用LCEL方式调用Chat models1.2.3 使用内置Chain调用Chat models 1.3 缓存1.3.1 内存缓存…

如何调用 API | 学习笔记

开发者学堂课程【阿里云 API 网关使用教程:如何调用 API】学习笔记&#xff0c;与课程紧密联系&#xff0c;让用户快速学习知识。 课程地址&#xff1a;阿里云登录 - 欢迎登录阿里云&#xff0c;安全稳定的云计算服务平台 如何调用 API 调用 API 的三要素 要调用 API 需要三…

Oracle的回收站

Oracle的回收站 一、什么是oracle的回收站二、oracle的回收站相关操作1、设置Oracle回收站的状态2、回收站功能的使用3、查看回收站的状态和内容4、回收站具体应用案例&#xff1a; 一、什么是oracle的回收站 Oracle的回收站是一种功能&#xff0c;它允许用户在删除表中的数据…