【Python Web开发】02-Socket网络编程02

文章目录

    • 1. 服务器端
      • 1.1 socket.socket()
      • 1.2 socket.bind()
      • 1.3 socket.listen()
      • 1.4 socket.accept()
      • 1.5 socket.recv()
      • 1.6 socket.send() 和 socket.sendall()
      • 1.7 socket.close()
    • 2. 客户端
      • 2.1 socket.socket()
      • 2.2 socket.connect()
      • 2.3 socket.send() 和 socket.sendall()
      • 2.4 socket.recv()
      • 2.5 socket.close()
      • 2.6 UDP 客户端方法的差异

这里主要是介绍一下Socket通讯中服务端和客户端需要使用的方法及其说明

1. 服务器端

在 Python 网络编程里,服务器端通常会使用 socket 模块中的多个方法来实现网络通信。

下面为你详细介绍服务器端常用的方法及其用法。

1.1 socket.socket()

  • 功能:创建一个套接字对象。套接字是网络编程的基础,它就像是一个通信的端点,通过它可以进行数的发送和接受

  • 语法

socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)
  • 参数说明
    • family:指定地址族,常用的有 socket.AF_INET(表示 IPv4 地址)和 socket.AF_INET6(表示 IPv6 地址)。
    • type:指定套接字类型,常用的有 socket.SOCK_STREAM(表示 TCP 套接字)和 socket.SOCK_DGRAM(表示 UDP 套接字)。
    • proto:通常取默认值 0。
    • fileno:通常取默认值 None。

示例

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

1.2 socket.bind()

  • 功能:将套接字绑定到指定的IP地址和端口号。这样客户端就可以通过这个地址和端口找到服务器。

  • 语法

socket.bind(address)
  • 参数说明

    • address:是一个元组,格式为 (host, port),其中 host 是 IP 地址,port 是端口号。

示例:

# 服务器地址和端口
server_address = ('localhost', 8888)
server_socket.bind(server_address)

1.3 socket.listen()

  • 功能:让套接字进入监听状态,开始等待客户端的连接请求
  • 语法
socket.listen(backlog)
  • 参数说明
    • backlog:指定允许排队等待处理的最大连接请求数量

示例

# 开始监听,允许最多5个连接请求排队等待
server_socket.listen(5)
print('服务器正在监听端口 8888...')

1.4 socket.accept()

  • 功能:接受客户端的请求,并返回一个新的套接字对象和客户端地址。新的套接字对象用于与客户端进行数据通信。
  • 语法
conn, addr = socket.accept()
  • 返回值说明
    • coon:是一个新的套接字对象,用于与客户端进行数据收发。
    • addr:是客户端的地址信息,通常是一个元组(host,port)

示例

while True:# 接受客户端连接connection, client_address = server_socket.accept()print(f'连接来自: {client_address}')

1.5 socket.recv()

  • 功能:从客户端接收数据
  • 语法
data = socket.recv(bufsize)
  • 参数说明
    • bufsize:指定一次最多接收的字节数

示例

# 接收客户端发送的数据
data = connection.recv(1024)
print(f'收到的数据: {data.decode()}')

1.6 socket.send() 和 socket.sendall()

  • 功能:向客户端发送数据。send方法尝试发送数据,但可能不会发送完所有的数据;sendall方法会确保所有数据都被发送出去

  • 语法

# send方法
sent = socket.send(data)
# sendall方法
socket.sendall(data)
  • 参数说明
    • data:要发送的数据,必须是字节类型

示例

# 发送响应给客户端
message = '你好,客户端!'
connection.sendall(message.encode())

1.7 socket.close()

  • 功能:关闭套接字,释放相关资源
  • 语法
socket.close()

示例

# 关闭连接
connection.close()

完整示例
以下是一个完整的 TCP 服务器端示例代码,展示了上述方法的综合使用:

import socket# 创建一个TCP/IPv4套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 服务器地址和端口
server_address = ('localhost', 8888)
server_socket.bind(server_address)# 开始监听,允许最多5个连接请求排队等待
server_socket.listen(5)
print('服务器正在监听端口 8888...')while True:# 接受客户端连接connection, client_address = server_socket.accept()try:print(f'连接来自: {client_address}')# 接收客户端发送的数据data = connection.recv(1024)print(f'收到的数据: {data.decode()}')# 发送响应给客户端message = '你好,客户端!'connection.sendall(message.encode())finally:# 关闭连接connection.close()

通过上述方法的使用,可以实现一个简单的 TCP 服务器端,处理客户端的连接请求和数据通信。

如果使用 UDP 协议,部分方法会有所不同,例如不需要 listen 和 accept 方法,而是直接使用 recvfrom 和 sendto 方法进行数据的收发。

2. 客户端

在 Python 网络编程里,客户端也会用到 socket 模块中的多个方法来和服务器进行通信。

下面详细介绍客户端常用的方法及其用法。

2.1 socket.socket()

  • 功能:创建一个套接字对象,这是网络通信的基础,客户端借助它来发送和接收数据。
  • 语法
socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)
  • 参数说明
    • family:指定地址族,常见的有 socket.AF_INET(代表 IPv4 地址)和 socket.AF_INET6(代表 IPv6 地址)。
    • type:指定套接字类型,常用的是 socket.SOCK_STREAM(表示 TCP 套接字)和 socket.SOCK_DGRAM(表示 UDP 套接字)。
    • proto:一般取默认值 0。
    • fileno:通常取默认值 None。

示例

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

2.2 socket.connect()

  • 功能:客户端使用此方法向服务器发起连接请求。若服务器接受请求,双方就会建立起连接。
  • 语法
socket.connect(address)
  • 参数说明
    • address:是一个元组,格式为 (host, port),host 是服务器的 IP 地址,port 是服务器监听的端口号

示例

# 服务器地址和端口
server_address = ('localhost', 8888)
client_socket.connect(server_address)

2.3 socket.send() 和 socket.sendall()

  • 功能:向服务器发送数据。send 方法尝试发送数据,但也许不会发送完所有数据;sendall 方法会保证所有数据都被发送出去。
  • 语法
# send方法
sent = socket.send(data)
# sendall方法
socket.sendall(data)
  • 参数说明
    • data:要发送的数据,必须是字节类型。

示例

# 发送数据给服务器
message = '你好,服务器!'
client_socket.sendall(message.encode())

2.4 socket.recv()

  • 功能:从服务器接收数据。
  • 语法
data = socket.recv(bufsize)
  • 参数说明
    • bufsize:指定一次最多接收的字节数。

示例

# 接收服务器的响应
data = client_socket.recv(1024)
print(f'收到服务器的响应: {data.decode()}')

2.5 socket.close()

  • 功能:关闭套接字,释放相关资源。
  • 语法
socket.close()

示例

# 关闭连接
client_socket.close()

完整示例代码
下面是一个完整的 TCP 客户端示例代码,展示了上述方法的综合运用:

import socket# 创建一个TCP/IPv4套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 服务器地址和端口
server_address = ('localhost', 8888)# 连接服务器
client_socket.connect(server_address)try:# 发送数据给服务器message = '你好,服务器!'client_socket.sendall(message.encode())# 接收服务器的响应data = client_socket.recv(1024)print(f'收到服务器的响应: {data.decode()}')
finally:# 关闭连接client_socket.close()

2.6 UDP 客户端方法的差异

若使用 UDP 协议,客户端不需要 connect 方法来建立连接,而是直接使用 sendto 和 recvfrom 方法进行数据的收发。下面是一个简单的 UDP 客户端示例:

import socket# 创建一个UDP/IPv4套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 服务器地址和端口
server_address = ('localhost', 9999)# 发送数据给服务器
message = '你好,服务器!'
client_socket.sendto(message.encode(), server_address)# 接收服务器的响应
data, server = client_socket.recvfrom(1024)
print(f'收到服务器的响应: {data.decode()}')# 关闭套接字
client_socket.close()

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

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

相关文章

Flutter 在全新 Platform 和 UI 线程合并后,出现了什么大坑和变化?

Flutter 在全新 Platform 和 UI 线程合并后,出现了什么大坑和变化? 在两个月前,我们就聊过 3.29 上《Platform 和 UI 线程合并》的具体原因和实现方式,而事实上 Platform 和 UI 线程合并,确实为后续原生语言和 Dart 的…

蓝桥杯 1. 四平方和

四平方和 原题目链接 题目描述 四平方和定理(又称拉格朗日定理)指出: 每个正整数都可以表示为 至多 4 个正整数的平方和。 如果将 0 包括进去,则每个正整数都可以恰好表示为 4 个非负整数的平方和。 例如: 5 0 …

开发并发布一个属于自己的包(npm)

一、CommonJS规范导入require 创建一个npm包涉及几个步骤,包括设置你的项目结构、编写代码、编写文档、测试你的代码,以及发布到npm仓库。以下是一个基本的指南,帮助你从头开始创建一个npm包。 步骤 1: 初始化npm项目 创建项目文件夹&#x…

CRTP(Curiously Recurring Template Pattern)

C 中的 CRTP(奇异递归模板模式) CRTP(Curiously Recurring Template Pattern)是一种利用模板继承实现 静态多态(Static Polymorphism) 的设计模式。通过基类模板以派生类作为模板参数,CRTP 允许…

小白工具视频转MPG, 功能丰富齐全,无需下载软件,在线使用,超实用

在视频格式转换需求日益多样的今天,小白工具网的在线视频转 MPG 功能https://www.xiaobaitool.net/videos/convert-to-mpg/ )脱颖而出,凭借其出色特性,成为众多用户处理视频格式转换的优质选择。 从格式兼容性来看,它支…

银河麒麟系统离线安装nodejs

本篇文章我们介绍如何通过nvm(node版本管理工具)来实现离线安装nodejs 第一步:下载nvm https://github.com/nvm-sh/nvm/releases/tag/v0.40.1 在页面找到【Source code(tar.gz)】下载 第二步:安装nvm 将下载好的tar.gz拷贝到银河麒麟系统文件夹下(加…

Go语言中包导入下划线的作用解析

在Go语言的代码中,有时会看到类似以下的导入语句: import _ "github.com/mattn/go-sqlite3"这种以下划线_开头的导入方式,显得有些特别,尤其是对于新手来说,可能会感到困惑,为什么要这样写&…

Winddows11官网下载安装VMware Workstation Pro17(图文详解)

Winddows11安装VMware17 1、官网下载2、安装3、总结 1、官网下载 官网地址 点击Products,滑到最下面,选择SEE DESKTOPP HYPERVISORS 选择 DOWNLOAD FUSION OR WORKSTATION 自动跳转到下面哪个服界面,注册 输入邮箱地址和图片下面的文字…

DeepSeek智能时空数据分析(二):3秒对话式搞定“等时圈”绘制

序言:时空数据分析很有用,但是GIS/时空数据库技术门槛太高 时空数据分析在优化业务运营中至关重要,然而,三大挑战仍制约其发展:技术门槛高,需融合GIS理论、SQL开发与时空数据库等多领域知识;空…

【Linux网络】应用层自定义协议与序列化及Socket模拟封装

📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…

基于大模型的结肠癌全病程预测与诊疗方案研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 二、结肠癌概述 2.1 流行病学特征 2.2 发病机制与危险因素 2.3 临床症状与诊断方法 三、大模型技术原理与应用现状 3.1 大模型的基本原理 3.2 在医疗领域的应用情况 3.3 在结肠癌预测中的潜力分析 四、术前…

【UML建模】starUML工具

一.概述 StarUML是一款UML工具,允许用户创建和管理UML(统一建模语言)模型,广泛应用于软件工程领域。它的主要功能包括创建各种UML图:如用例图、类图、序列图等,支持代码生成与反向工程,以及提供…

模板元编程(Template Metaprogramming, TMP)

C 模板元编程(Template Metaprogramming, TMP) 模板元编程是一种利用 C 模板系统在 编译期间 完成计算、类型操作和代码生成的编程范式。其核心优势在于通过 零运行时开销 实现高效、类型安全的代码。以下是模板元编程的详细分步解析。 1. 编译时计算 …

Android Build Variants(构建变体)详解

Android Build Variants(构建变体)是 Android 开发中用于生成不同版本应用程序的一种机制。它允许开发者根据不同的需求,如不同的应用市场、不同的功能模块、不同的环境配置等,从同一个代码库中生成多个不同的 APK。 组成部分 B…

26考研|数学分析:数项级数

数项级数这一章的开始,开启了新的关于“级数”这一新的概念体系的学习进程,此部分共包含四章的内容,分别为数项级数、函数项级数、幂级数以及傅里叶级数。这一章中,首先要掌握级数的相关概念与定义,重难点在于掌握判断…

拥抱健康生活,解锁养生之道

在生活节奏日益加快的当下,健康养生已成为人们关注的焦点。科学的养生方法,能帮助我们增强体质、预防疾病,以更饱满的精神状态拥抱生活。 合理饮食是养生的基石。《黄帝内经》中提到 “五谷为养,五果为助,五畜为益&…

房地产安装工程师简历模板

模板信息 简历范文名称:房地产安装工程师简历模板,所属行业:其他 | 职位,模板编号:XUCP9X 专业的个人简历模板,逻辑清晰,排版简洁美观,让你的个人简历显得更专业,找到好…

HTML5 详细学习笔记

1. HTML5 简介 HTML5 是最新的 HTML 标准&#xff0c;于 2014 年 10 月由 W3C 完成标准制定。它增加了许多新特性&#xff0c;包括语义化标签、多媒体支持、图形效果、离线存储等。 1.1 HTML5 文档基本结构 <!DOCTYPE html> <html lang"zh-CN"> <h…

【网络入侵检测】基于Suricata源码分析NFQ IPS模式实现

【作者主页】只道当时是寻常 【专栏介绍】Suricata入侵检测。专注网络、主机安全,欢迎关注与评论。 1. 概要 👋 本文聚焦于 Suricata 7.0.10 版本源码,深入剖析其 NFQ(Netfilter Queue)模式的实现原理。通过系统性拆解初始化阶段的配置流程、数据包监听机制的构建逻辑,以…

C语言结构体和union内存对齐

在C语言的世界里&#xff0c;结构体&#xff08;struct&#xff09;和联合体&#xff08;union&#xff09;的内存布局一直是困扰许多开发者的难题。当我们定义一个结构体时&#xff0c;编译器会按照特定的规则为每个成员分配内存空间&#xff0c;这些规则被称为内存对齐。看似…