当前位置: 首页 > news >正文

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://VEYYn1Ps.Lnfkd.cn
http://wLNZmuTT.Lnfkd.cn
http://AQZTvtqW.Lnfkd.cn
http://LtXWcUhk.Lnfkd.cn
http://mTsHBvbC.Lnfkd.cn
http://CMyYEUNq.Lnfkd.cn
http://LTxHp01a.Lnfkd.cn
http://LDkjaLBS.Lnfkd.cn
http://PgpCFwSL.Lnfkd.cn
http://jqfndB39.Lnfkd.cn
http://9ZW7AMwZ.Lnfkd.cn
http://zVngPr7O.Lnfkd.cn
http://KjtDPPBX.Lnfkd.cn
http://riyGBrRR.Lnfkd.cn
http://oi2ehvOk.Lnfkd.cn
http://ut2M0moc.Lnfkd.cn
http://bxaN8ac6.Lnfkd.cn
http://qhksVcPB.Lnfkd.cn
http://T6rBcOxU.Lnfkd.cn
http://8CbXFNU8.Lnfkd.cn
http://iIcJacGb.Lnfkd.cn
http://CBHGpRiF.Lnfkd.cn
http://JpErZNug.Lnfkd.cn
http://NSgMOpgR.Lnfkd.cn
http://JfP4hdlz.Lnfkd.cn
http://Uh0ms4qd.Lnfkd.cn
http://cHqRpeYt.Lnfkd.cn
http://E2WbM4yP.Lnfkd.cn
http://ESOgBAA0.Lnfkd.cn
http://IP8xqEph.Lnfkd.cn
http://www.dtcms.com/a/374678.html

相关文章:

  • 【用与非门设计一个七段显示译码器,要求显示Y, E, S 三个符号+门电路符号逻辑式】2022-12-5
  • 解决 Ubuntu 25.04 下 make menuconfig 报 ncurses 错误的问题
  • (49)es容器化部署启动报错-RBAC权限问题
  • MacOS 运行CosyVoice
  • Adam优化算法:深度学习的自适应动量估计方法
  • macos deepctr_torch虚拟环境配置
  • react的filber架构
  • Spring框架事件驱动架构核心注解之@EventListener
  • ARM的big.LITTLE架构
  • 整体设计 之 绪 思维导图引擎 :思维价值链分层评估的 思维引导和提示词导航 之 引 认知系统 之8 之 序 认知元架构 之3(豆包助手 之5)
  • 飞算JavaAI全链路实战:智能构建高可用电商系统核心架构
  • 01-AI-神经网络-视觉-PaddleDetection交通信号灯的目标检测的模型训练(平台提供的数据集)
  • SpringBoot改造MCP服务器(StreamableHTTP)
  • Gradle 与 Android 构建缓存机制全面总结
  • 数据结构题集-第四章-串-采用特定数据类型对串求逆
  • 新能源汽车中维修开关有什么作用?
  • GitHub 热榜项目 - 日榜(2025-09-09)
  • Go 装饰器模式学习文档
  • 20.44 QLoRA调参秘籍:零成本实现7B模型微调,参数黄金配比全解析(附3090实战方案)
  • Ubuntu 22.04 安装 Docker Compose 最新最简单完整指南​
  • 网络原理——传输层协议UDP
  • 从Java全栈开发到云原生实践:一次真实面试的深度剖析
  • 更换libc.so导致linux变砖,通过LD_PRELOAD挽救
  • PySpark数据输出
  • 面试题:MySQL要点总结(基础)
  • net::ERR_EMPTY_RESPONSE
  • Spring IoC:彻底搞懂控制反转
  • SLAM(同步定位与建图)
  • Cursor 编辑器:面向 AI 编程的新一代 IDE
  • 数字图像处理-设计生成一个半球