python之socket网络编程

引言

在互联网时代,网络编程已经成为开发人员必备的技能之一。无论是Web开发、实时通信还是分布式计算,都离不开网络编程支持Python提供的socket模块为我们提供了简洁而强大接口,可以轻松实现客户端服务器之间的通信

  • Socket编程网络编程重要部分,主要用于在不同计算机之间进行通信Python提供了一个非常强大socket库,使得网络编程变得简单和灵活。本篇博文将详细介绍Pythonsocket编程,包括基础概念、核心组件、常用功能,并附上一个综合的示例及其运行结果。

什么是socket

  • Socket是网络通信的端点,它允许不同的计算机之间进行数据交换。在 Python 中,socket是通过 socket模块来实现的。Socket通信过程主要包括创建 socket对象绑定地址监听连接发送和接收数据等步骤。

socket套接字类型

Python 中,socket类型主要有以下几种:

  • 流式套接字stream (SOCK_STREAM):提供面向连接的、可靠的字节流服务。常用于TCP协议。
  • 数据报套接字dgram (SOCK_DGRAM):提供无连接的、不可靠的数据报服务。常用于UDP协议。

TCPUDP

  • TCP (Transmission Control Protocol):面向连接的、可靠的协议,适用于需要保证数据准确传输的场景。
  • UDP (User Datagram Protocol):无连接的、不可靠的协议,适用于需要快速传输数据但不要求数据准确到达的场景。

socket服务端核心组件

1.创建socket对象

使用socket.socket()函数可以创建一个 socket对象。该函数的两个参数分别指定了地址族套接字类型

import socket#创建名为server的一个socket对象
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  • socket.AF_INET:表示使用IPv4地址。
  • socket.SOCK_STREAM:表示套接字类型流式套接字,即TCP

2.绑定地址端口

服务端需要绑定一个 IP地址端口号,使得客户端可以找到并连接到服务器

  • 使用对象名.bind()进行绑定,bind()括号中是一个元组类型
#绑定ip地址和服务的端口号
server.bind(("127.0.0.1", 10086))

3.监听连接

服务器端需要监听来自客户端连接请求

  • 使用对象名.listen()函数进行监听,listen()括号中是一个int类型,表示允许连接的最大连接数
#监听的最大连接数是3
server.listen(3)

4.接受连接

服务器端使用 对象名.accept() 函数接受客户端的连接请求

  • 该函数会发生阻塞,直到有客户端连接
  • 如果有客户端连接了,accept()返回2个值,第一个是client的socket对象,第二个是client的ip地址和端口
#通过接受到的客户端连接,来获取client的socket对象,从而获取client发送过来的消息
client_sock, client_address = server.accept()
  • client_sock是一个客户端socket对象
  • client_address是客户端的地址信息,是一个元组(ip地址, 端口号)

5.接受client端消息client_sock.revc(1024)

  • 使用返回的client_sock对象客户端进行数据交换。可以使用client_sock.recv()方法接收客户端发送的数据,
  • recv()能接受的最大字节数1024个字节,所以recv()括号中填写int类型数字表示字节数,如果接受的字节数大于1024会发生粘包
  • recv()方法在接受数据时会发生阻塞
  • recv()会返回一个编码后数据,所以我们在查看数据的时候,需要进行data.decode("utf-8")进行解码
data = client_sock.recv(1024)
print(data.decode("utf-8"))

6.发送响应client端

6.1client_sock.send()

  • 发送时,需要对数据进行编码,常使用encode("utf-8")对数据进行编码
  • send()可能会发送数据的全部部分。如果缓冲区已满网络状况不佳,它可能只会发送部分数据
  • send()方法返回一个整数,表示实际发送字节数
response = "收到了"
byte_number = client_sock.send(response.encode("utf-8"))
print(byte_number)  #此时byte_number值为9,因为一个汉字在utf-8中占3个字节

6.2client_sock.sendall()

  • 发送时,需要对数据进行编码,常使用encode("utf-8")对数据进行编码
  • 如果由于网络拥塞其他原因数据不能立即发送完毕sendall()继续尝试发送数据,直到所有数据发送完毕
client_sock.sendall("接受到了".encode("utf-8"))

7.关闭client端连接

使用close()函数可以关闭socket连接

client_sock.close()

8.关闭server端连接

使用close()函数可以关闭socket连接

server.close()

socket客户端核心组件

1.创建socket对象

使用socket.socket()函数可以创建一个 socket对象。该函数的两个参数分别指定了地址族套接字类型

import socket#创建名为client的一个socket对象
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  • socket.AF_INET:表示使用IPv4地址。
  • socket.SOCK_STREAM:表示套接字类型流式套接字,即TCP

2.连接server端

  • client端需要使用 client对象.connect()函数连接到服务端
  • connect()括号中是一个元组类型,第一个参数表示服务端ip,第二个参数表示服务端开发的端口
client.connect(("127.0.0.1", 10086))

3.发送请求server端

3.1client.send()

  • 发送时,需要对数据进行编码,常使用encode("utf-8")对数据进行编码
  • send()可能会发送数据的全部部分。如果缓冲区已满网络状况不佳,它可能只会发送部分数据
  • send()方法返回一个整数,表示实际发送字节数
request = "你好服务端"
byte_number = client.send(request.encode("utf-8"))
print(byte_number)  #此时byte_number值为15,因为一个汉字在utf-8中占3个字节

3.2client.sendall()

  • 发送时,需要对数据进行编码,常使用encode("utf-8")对数据进行编码
  • 如果由于网络拥塞其他原因数据不能立即发送完毕sendall()继续尝试发送数据,直到所有数据发送完毕
client.sendall("你好服务端".encode("utf-8"))

4.接受server端响应client.revc(1024)

  • 使用client对象,可以使用client.recv(1024)方法接收server端响应的数据,
  • recv()能接受的最大字节数1024个字节,所以recv()括号中填写int类型数字表示字节数,如果接受的字节数大于1024会发生粘包
  • recv()方法在接受数据时会发生阻塞
  • recv()会返回一个编码后数据,所以我们在查看数据的时候,需要进行data.decode("utf-8")进行解码
data = client.recv(1024)
print(data.decode("utf-8"))

5.关闭client端连接

使用close()函数可以关闭socket连接

client.close()

示例

server端

import socketclass TCPSERVER:def __init__(self, ip, port):self.ip = ipself.port = portself.number = 5  #设置服务端监听个数def serverTCP(self):server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  #tcpserver.bind((self.ip, self.port))server.listen(self.number)client_sock, client_address = server.accept()while True:try:   #tcp中不允许client先关机,如果先关机,服务端会报错,所以这里使用try异常捕获# 接受client消息data = client_sock.recv(1024)print(data.decode("utf-8"))# 响应clientclient_sock.sendall("响应:".encode("utf-8")+data)except ConnectionAbortedError:breakclient_sock.close()server.close()if __name__ == '__main__':s = TCPSERVER("127.0.0.1", 10080)s.serverTCP()

client端

import socketclass TCPCLIENT:def __init__(self, ip, port):self.server_ip = ipself.server_port = portdef clientTCP(self):client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #tcpclient.connect((self.server_ip, self.server_port))while True:msg = input(">>(quit退出):").strip()if not msg:  #tcp不能发送空白消息continueif msg == "quit":break# client端发送数据client.sendall(msg.encode("utf-8"))# client端接受响应data = client.recv(1024)print(data.decode("utf-8"))client.close()if __name__ == '__main__':c = TCPCLIENT("127.0.0.1", 10080)c.clientTCP()

测试

必须先启动server端,再启动client端

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

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

相关文章

WPF Telerik.Windows.Controls.Data.PropertyGrid 自定义属性编辑器

1.AI帮忙定义新用户控件 2.在属性上添加TelerikEditorAttribute特性 private ObservableCollection<string> _axisOrder;[Display(Description "点位", GroupName "通用", Name "轴&顺序", Order 1)][DataMember][TelerikEditorAt…

【超详细】别再看零散的教程了!一篇搞定Gitee从注册、配置到代码上传与管理(内含避坑指南最佳实践)

&#x1f525;个人主页&#xff1a;艾莉丝努力练剑 ❄专栏传送门&#xff1a;《C语言》、《数据结构与算法》、C语言刷题12天IO强训、LeetCode代码强化刷题、洛谷刷题、C/C基础知识知识强化补充、C/C干货分享&学习过程记录 &#x1f349;学习方向&#xff1a;C/C方向学习者…

43.shell脚本循环与函数

shell脚本循环与函数 for 循环 for 循环用于一次性读取多个信息&#xff0c;逐一对信息进行操作处理&#xff0c;特别适合处理有范围的数据 语法 for 变量名 in 取值列表 do命令序列 done批量创建用户 #!/bin/bashtouch /root/users.txt echo aka blues cloe dio foks > /ro…

模型部署:(四)安卓端部署Yolov8-v8.2.99实例分割项目全流程记录

模型部署&#xff1a;&#xff08;四&#xff09;安卓端部署Yolov8-v8.2.99实例分割项目全流程记录1、下载ncnn2、下载opencv-mobile3、文件拷贝4、andorid_studio相关配置5、文件内参数设置5、重构项目&#xff1a;6、打包apk7、部署自己训练的实例分割模型1、下载ncnn 地址&…

高并发、低延迟全球直播系统架构

一、 核心架构图 整个系统的数据流和工作流程如下图所示&#xff0c;它清晰地展示了从主播推流到观众观看的完整过程&#xff1a; #mermaid-svg-QzNpj0DWxd5FERPC {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-QzN…

AWS strands agents 当智能体作为独立服务/容器部署时,它们无法共享进程内状态

当智能体作为独立服务/容器部署时&#xff0c;它们无法共享进程内状态。 以下是针对分布式部署中动态内存库的生产就绪解决方案&#xff1a;1. 基于外部存储的内存库基于 DynamoDB 的共享内存import boto3 from strands import Agent, tool from typing import Dict, Any impor…

第五节 JavaScript——引用类型、DOM/BOM 与异步编程

JavaScript 的第五节课通常会深入探讨 ​​引用类型、DOM 操作、BOM 操作、事件处理以及异步编程​​ 等核心概念。这些知识能让你创建动态交互丰富的网页。下面我将详细讲解这些内容并提供示例。 🚀 JavaScript 第五节:引用类型、DOM/BOM 与异步编程 ⚡ 一、引用类型 引…

使用Pycharm进行远程ssh(以Featurize为例)

使用Pycharm进行远程ssh&#xff08;以Featurize为例&#xff09;文章目录介绍应用背景远程连接Python连接Jupyter介绍应用背景 在使用Pycharm 专业版的时候进行远程ssh连接服务器&#xff08;Featurize&#xff09;的Python解释器和Jupyter 远程连接Python 打开Pycharm点击…

深入研究:ClickHouse中arrayExists与hasAny在ORDER BY场景下的性能差异

最近公司大数据情况下ClickHouse查询性能极差&#xff0c;后来发现在大数据量ORDER BY场景下&#xff0c;arrayExists(x -> x in ...)比hasAny性能快10倍&#xff01;&#xff01;&#xff01;&#xff01; 一、问题重述与研究背景 在大数据量 ORDER BY场景下&#xff0c;…

Spring AI (二)结合Mysql做聊天信息存储

上文讲了&#xff0c;用Spring ai做简单的聊天功能&#xff0c;没看过的可以查看下 Spring AI结合豆包模型 这里简单结合下Jdbc做下聊天记录的存储和查询&#xff0c;让对话变的更智能。 首先是Pom的支持 <dependency><groupId>org.springframework.ai</grou…

【docker】data-root 数据迁移(防止无法加载镜像和容器问题)

操作系统&#xff1a;ubuntu 24.04 docker版本&#xff1a;docker-ce 28.1.1 目标&#xff1a;将/var/lib/docker 的数据迁移到/data/docker停止docker sudo systemctl stop docker.socket sudo systemctl stop docker这个步骤一定要做&#xff0c;否则容易导致数据不一致。 rs…

二、网页的“化妆师”:从零学习 CSS

一、CSS 是什么 1.1 CSS 的定义 CSS&#xff08;Cascading Style Sheets&#xff0c;层叠样式表&#xff09; 是一种用来给 HTML 页面 添加样式的语言。 简单来说&#xff1a; HTML 负责结构 —— 决定网页上有什么内容。 CSS 负责样式 —— 决定这些内容“长什么样”。 如果…

传统项目管理与敏捷的核心差异

在项目管理领域&#xff0c;传统方法与敏捷方法代表了两种不同的管理思维与实践路径。传统项目管理强调计划性、规范性和阶段性推进&#xff0c;而敏捷则注重灵活性、快速迭代和价值交付。 正如彼得德鲁克所说&#xff1a;“没有完美的计划&#xff0c;只有不断调整的行动。”理…

axios+ts封装

http.ts import axios from axios import type { AxiosInstance, AxiosRequestConfig, AxiosResponse } from axios import qs from qs/*** 扩展AxiosRequestConfig&#xff0c;增加一些自定义的属性* isAuth: 自定义的参数中&#xff0c;用来判断是否携带token 因为AxiosReq…

2026新选题:基于K-Means实现学生求职意向聚类推荐职位

作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参与学生毕业答辩指导&#xff0c;…

SpringCloud gateway配置predicates的匹配规则

需求 通过gateway的route规则&#xff0c;实现分组流量配置 资源 一个nacos&#xff0c;一个gateway &#xff0c;一个服务app&#xff08;部署双实例group-1&#xff0c;group-2&#xff09;&#xff0c;实现特定条件下往分组一和分组二流量切换。 方案 1 配置文件 nacos…

android14 硬键盘ESC改BACK按键返回无效问题

在之前的android版本中修改外接键盘ESC为BACK按键做返回键使用&#xff0c;直接修改如下代码即可&#xff1a;--- a/frameworks/base/data/keyboards/Generic.kcmb/frameworks/base/data/keyboards/Generic.kcm-499,7 499,7 key PLUS {### Non-printing keys ###key ESCAPE { …

【开题答辩全过程】以 asp高校外卖订单系统的设计与实现为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

UVa1063/LA3807 The Rotation Game

UVa1063/LA3807 The Rotation Game题目链接题意输入格式输出格式分析AC 代码IDA*分3次BFS题目链接 本题是2004年icpc亚洲区域赛上海赛区的H题 题意 如下图所示形状的棋盘上分别有8个1、2、3&#xff0c;要往A&#xff5e;H方向旋转棋盘&#xff0c;使中间8个方格数字相同。图&…

用pywin32连接autocad 写一个利用遗传算法从选择的闭合图形内进行最优利用率的排版 ai草稿

好的&#xff0c;我们来深入细说遗传算法&#xff08;Genetic Algorithm, GA&#xff09;在钣金自动排版中的应用。遗传算法 (GA) 在钣金排版中的详细解析遗传算法是一种受达尔文生物进化论启发的元启发式优化算法。它不追求一次性找到数学上的绝对最优解&#xff0c;而是通过模…