python成长技能之网络编程

文章目录

  • 一、初识Socket
    • 1.1 什么是 Socket?
    • 1.2 socket的基本操作
    • 1.3 socket常用函数
  • 二、基于UDP实现客户端与服务端通信
  • 三、基于TCP实现客户端与服务端通信
  • 四、使用requests模块发送http请求


一、初识Socket

1.1 什么是 Socket?

Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/ad9a4f9959e24caf83ba0b2e84883459.png
一个生活中的场景。你要打电话给一个朋友,先拨号,朋友听到电话铃声后提起电话,这时你和你的朋友就建立起了连接,就可以讲话了。等交流结束,挂断电话结束此次交谈。 生活中的场景就解释了这工作原理,也许TCP/IP协议族就是诞生于生活中,这也不一定

  • 在python里面,提供了两个级别访问的网络服务

    • 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方法
    • 高级别的网络服务模块 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发
  • 通信协议可分为TCP、UDP

    • TCP(Transmission Control Protocol传输控制协议)是一种面向连接的,可靠的,基于字节流的传输通信协议
    • UDP(User Data Protocol,用户数据报协议)是无连接的,即发送数据之前不需要建立连接,UDP尽最大努力交付,即不保证可靠交付(类似于发短信,我只管发,能不能接受到跟我关系不大)

1.2 socket的基本操作

socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。我的理解就是Socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)

1.3 socket常用函数

  1. 创建套接字

    • socket.socket(family, type):
      • family: 地址族,常用的有 socket.AF_INET(IPv4)和 socket.AF_INET6(IPv6)
      • type: 套接字类型,常用的有 socket.SOCK_STREAM(TCP)和 socket.SOCK_DGRAM(UDP)
  2. 绑定地址

    • socket.bind(address):
      • address: 一个包含 IP 地址和端口号的元组,用于绑定套接字到指定的地址和端口
  3. 监听连接

    • socket.listen(backlog):
      • backlog: 指定可以排队的最大连接数
  4. 接受连接

    • socket.accept():
      • 返回一个新的套接字对象和客户端的地址。这个新的套接字用于与客户端进行通信
  5. 发送和接收数据

    • socket.sendall(data):
      • data: 要发送的字节数据。确保数据是字节类型(使用 b’…’ 或 str.encode())
    • socket.recv(bufsize):
      • bufsize: 指定接收数据的最大缓冲区大小。返回接收到的字节数据
  6. 关闭套接字

    • socket.close():
      • 关闭套接字,释放资源
  7. 连接到服务器

    • socket.connect(address):
      • address: 一个包含服务器 IP 地址和端口号的元组,用于连接到服务器

二、基于UDP实现客户端与服务端通信

使用socket开发的基本格式

  • socket.socket(family,type,proto)
  • family: 套接字家族可以使AF_UNIX或者AF_INET
  • type: 套接字类型可以根据是面向连接(TCP)的还是非连接分(UDP)为 SOCK_STREAM 或 SOCK_DGRAM
  • protocol: 一般不填默认为0
  • AF_INET需经过多个协议层的编解码,消耗系统cpu,并且数据传输需要经过网卡,受到网卡带宽的限制。AF_UNIX数据到达内核缓冲区后,由内核根据指定路径名找到接收方socket对应的内核缓冲区,直接将数据拷贝过去,不经过协议层编解码,节省系统cpu,并且不经过网卡,因此不受网卡带宽的限制
  • AF_UNIX的传输速率远远大于AF_INET
  • AF_INET不仅可以用作本机的跨进程通信,同样的可以用于不同机器之间的通信,其就是为了在不同机器之间进行网络互联传递数据而生。而AF_UNIX则只能用于本机内进程之间的通信

基于UDP开发服务端
UDP 服务器

import socket

# 创建一个 UDP 套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 绑定套接字到地址和端口
server_address = ('localhost', 10001)
server_socket.bind(server_address)

print('Server is listening on port 10001...')

while True:
    # 接收数据
    data, client_address = server_socket.recvfrom(1024)
    print(f'Received from {client_address}: {data.decode()}')
    
    # 发送响应
    server_socket.sendto(b'Echo: ' + data, client_address)

基于UDP开发客户端

import socket

# 创建一个 UDP 套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 服务器地址和端口
server_address = ('localhost', 10001)

try:
    # 发送数据
    message = b'Hello, Server!'
    client_socket.sendto(message, server_address)

    # 接收响应
    response, server_address = client_socket.recvfrom(1024)
    print(f'Received: {response.decode()}')
finally:
    # 关闭连接
    client_socket.close()

三、基于TCP实现客户端与服务端通信

服务端实现

import socket

# 创建一个 TCP/IP 套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定套接字到地址和端口
server_address = ('localhost', 10000)
server_socket.bind(server_address)

# 监听传入连接
server_socket.listen(5)

print('Server is listening on port 10000...')

while True:
    # 等待连接
    client_socket, client_address = server_socket.accept()
    print(f'Connection from {client_address}')

    try:
        while True:
            # 接收数据
            data = client_socket.recv(1024)
            if not data:
                break
            print(f'Received: {data.decode()}')
            # 发送响应
            client_socket.sendall(b'Echo: ' + data)
    finally:
        # 关闭连接
        client_socket.close()

客户端实现

import socket

# 创建一个 TCP/IP 套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 连接到服务器
server_address = ('localhost', 10000)
client_socket.connect(server_address)

try:
    # 发送数据
    message = b'Hello, Server!'
    client_socket.sendall(message)

    # 接收响应
    response = client_socket.recv(1024)
    print(f'Received: {response.decode()}')
finally:
    # 关闭连接
    client_socket.close()

四、使用requests模块发送http请求

  • 安装requests模块
  • 使用requests模块发送get请求
import requests

result = requests.get("https://assets.msn.cn/service/news/feed/pages/channel?InterestIds=Y_ffca5126-f1eb-4232-a09d-0cc253506007&activityId=03B2D6CE-715C-4B69-8691-C0D960DBE69F&apikey=0QfOX3Vn51YCzitbLaRkTTBadtWpgTN8NZLW0C1SEM&cm=zh-cn&it=edgeid&memory=8&ocid=social-peregrine&scn=APP_ANON&timeOut=2000&user=m-20E3F1E5D0826EBF0ABEE2B4D1506FA8")
print(result.content.decode("utf-8"))


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ROM修改进阶教程------安卓14 安卓15去除app签名验证的几种操作步骤 详细图文解析

在安卓14 安卓15的固件中。如果修改了系统级别的app。那么就会触发安卓14 15的应用签名验证。要么会导致修改的固件会进不去系统,或者进入系统有bug。博文将从几方面来解析去除安卓14 15应用签名验证的几种方法。 💝💝💝通过博文了解: 1💝💝💝-----安卓14去除…

[Docker#6] 镜像 | 常用命令 | 迁移镜像 | 压缩与共享

目录 Docker 镜像是什么 生活案例 为什么需要镜像 镜像命令详解 实验 1.一些操作 1. 遍历查看镜像 2. 查看镜像仓库在本地的存储信息 进入镜像存储目录 查看 repositories.json 文件 3. 镜像过滤 4. 下载镜像时的分层 实战一:离线迁移镜像 实战二&…

「QT」几何数据类 之 QVector3d 三维向量类

✨博客主页何曾参静谧的博客📌文章专栏「QT」QT5程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid…

人工智能(AI)对于电商行业的变革和意义

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/402a907e12694df5a34f8f266385f3d2.png#pic_center> 🎓作者简介:全栈领域优质创作者 🌐个人主页:百锦再新空间代码工作室 📞工作室:新空间代…

物联网设备研究——分配推理负载的联合学习方法

概述 物联网(IoT)的最新发展导致人工智能模型被嵌入到传感器和智能手机等终端设备中。这些模型是根据每个设备的存储容量和计算能力定制的,但重点是在终端侧进行本地推理,以降低通信成本和延迟。 然而,与部署在边缘服…

CentOS Stream 9设置静态IP

CentOS Stream 9设置静态IP CentOS Stream 9作为CentOS Stream发行版的下一个主要版本,已经发布有一段时间,但与目前广泛使用的CentOS7有较大区别。安装试用Stream 9的过程中,就发现设置静态IP的方式和CentOS7/8差别较大,在此记录…

【嵌入式】ESP32开发(一)ESP-IDF概述

文章目录 1 前言2 IDF环境配置3 在VS Code中使用IDF3.1 使用ESP-IDF例程3.2 底部按钮的作用【重要!】3.3 高级用法4 ESP-IDF框架分析5 从零开始创建一个项目5.1 组件(component)6 主要参考资料7 遇到的一些问题与解决办法8 对于ESP-IDF开发的一些感受1 前言 对于ESP32的开发…

基于Multisim水箱水位控制系统仿真电路(含仿真和报告)

【全套资料.zip】水箱水位控制系统仿真电路Multisim仿真设计数字电子技术 文章目录 功能一、Multisim仿真源文件二、原理文档报告资料下载【Multisim仿真报告讲解视频.zip】 功能 1.在水箱内的不同高度安装3根金属棒,以感知水位变化情况, 液位分1&…

解读Nature:Larger and more instructable language models become less reliable

目录 Larger and more instructable language models become less reliable 核心描述 核心原理 创新点 举例说明 大模型训练,微调建议 Larger and more instructable language models become less reliable 这篇论文的核心在于对大型语言模型(LLMs)的可靠性进行了深入…

zabbix监控端界面时间与服务器时间不对应

1. 修改系统时间 # tzselect Please select a continent, ocean, "coord", or "TZ".1) Africa2) Americas3) Antarctica4) Asia5) Atlantic Ocean6) Australia7) Europe8) Indian Ocean9) Pacific Ocean 10) coord - I want to use geographical coordina…

ubuntu20.04安装FLIR灰点相机BFS-PGE-16S2C-CS的ROS驱动

一、Spinnaker 安装 1.1Spinnaker 下载 下载地址为: https://www.teledynevisionsolutions.com/support/support-center/software-firmware-downloads/iis/spinnaker-sdk-download/spinnaker-sdk–download-files/?pnSpinnakerSDK&vnSpinnakerSDK 在上述地址中…

Windows配置JDK

1、解压 下载以后解压,放在一个没有中文路径和没有空格的目录,如下图: 2、配置Java环境 1)、点击左下角windows图标,输入huanjing(或者path),打开环境变量配置 如图: …

Unity教程(十八)战斗系统 攻击逻辑

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程(零)Unity和VS的使用相关内容 Unity教程(一)开始学习状态机 Unity教程(二)角色移动的实现 Unity教程(三)角色跳跃的实现 Unity教程&…

HCIP-HarmonyOS Application Developer 习题(二十三)

1、(多选)端云一体化已经集成以下哪些服务SDK。 A、云函数 B、云数据库 C、云存储 D、云托管 答案:AB 分析:云开发即为应用开发云侧工程,目前包含云函数与云数据库工程。 2、(多选)Entry下的m…

图数据库 | 5、图数据库三大组件之一 之 图计算 (下)

书接上文:图数据库 | 4、图数据库三大组件之一 ——图计算 (上)-CSDN博客 结合计算效率来评估与设计图计算所需的数据结构。 存储低效性或许是相邻矩阵或关联矩阵等数据结构的最大缺点,尽管它有着O(1)的访问时间复杂度。例如通过…

Android OpenGL ES详解——纹理:纹理过滤GL_NEAREST和GL_LINEAR的区别

目录 一、概念 1、纹理过滤 2、邻近过滤 3、线性过滤 二、邻近过滤和线性过滤的区别 三、源码下载 一、概念 1、纹理过滤 当纹理被应用到三维物体上时,随着物体表面的形状和相机视角的变化,会导致纹理在渲染过程中出现一些问题,如锯齿…

【java】java通过s3访问ceph报错

1.报错信息、背景 工作中起了几个访问ceph的服务pod节点,一段时间后1个节点一直报错Unable to execute HTTP request: Timeout waiting for connection from pool,详细i信息如下图片,有且仅有1个节点报错,其他节点访问正常。看日志…

对于目标文件太大无法拉入u盘事件的解决方法

问题: 解决方法: 1.按住win r 键打开运行,输入cmd,点击确定。 2.输入convert 盘符(你自己的u盘的盘符): /fs:ntfs并单击回车

React Hooks在现代前端开发中的应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 React Hooks在现代前端开发中的应用 React Hooks在现代前端开发中的应用 React Hooks在现代前端开发中的应用 引言 React Hooks …

Linux(CentOS)yum update -y 事故

CentOS版本:CentOS 7 事情经过: 1、安装好CentOS 7,系统自带JDK8,版本为:1.8.0_181 2、安装好JDK17,版本为:17.0.13 3、为了安装MySQL执行了 yum update -y(这个时候不知道该命令的…