Python之Socket编程: 轻松连接你的应用程序

news2025/1/13 15:50:38

前言

什么是Socket?

Python 的 Socket 模块提供了一个标准的接口,可以让你使用网络连接来通信。

Socket 是一种网络通信技术,它提供了一个通用的接口来连接不同类型的网络,例如互联网、局域网和本地环回地址。你可以使用 Python 的 Socket 模块来创建客户端和服务器程序,以便在它们之间进行通信


什么是套接字?

套接字是用于在两台计算机之间进行网络通信的抽象层。它可以被看作是一个端口,可以用来连接不同计算机上的程序

套接字可以用于两台计算机之间的网络通信,也可以用于在同一台计算机上的程序之间进行通信。它们由两个部分组成:一个是地址,另一个是端口号。地址用来标识主机的网络位置,端口号用来标识运行在主机上的特定服务

常见的网络协议,如 TCP 和 UDP,都使用套接字来进行通信。套接字可以使用不同的协议来进行通信,比如 TCP 套接字和 UDP 套接字

套接字在多种编程语言中都有支持,例如 C,C++,Java 和 Python


Socket的类型

Socket 可以分为两种类型:流式 Socket 和数据报式 Socket。

  • 流式 Socket 是为了传输字节流而设计的,适用于传输大量数据,例如文件传输。
  • 数据报式 Socket 是为了传输数据包而设计的,适用于传输少量数据,例如 DNS 查询

Socket的通讯流程

Socket 通信包括服务端和客户端两个角色。

服务端通过调用 socket 函数创建 Socket,并调用 bindlistenaccept 函数监听连接请求。客户端通过调用 socket 函数创建 Socket,并调用 connect 函数连接服务端

当连接建立后,服务端和客户端就可以通过 sendrecv 函数进行通信了。

同时, Socket 还支持设置选项,例如设置超时时间、关闭延迟等


Socket异常处理

在 Python 中使用 socket 模块时,如果发生异常,会抛出一个异常对象。常见的 socket 异常包括如下:

  • ConnectionRefusedError:连接被服务器拒绝。
  • ConnectionResetError:连接被服务器重置。
  • timeout:操作超时。
  • OSError:操作系统错误。

如下代码所示, 为了处理 socket 异常,需要使用 try-except 语句

import socket

try:
    # 创建 socket 对象
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 连接服务器
    s.connect(('www.example.com', 80))
except ConnectionRefusedError:
    # 处理连接被拒绝的情况
    print("Connection refused by the server")
except timeout:
    # 处理超时的情况
    print("Timed out")
except OSError:
    # 处理操作系统错误的情况
    print("OS error")

在上面的代码中,我们尝试连接到给定的服务器,如果连接被拒绝,则会抛出 ConnectionRefusedError 异常;如果操作超时,则会抛出 timeout 异常;如果发生操作系统错误,则会抛出 OSError 异常。


Socket模块函数

创建Socket对象

在 Python 中,你可以使用 socket 模块中的 socket() 函数来创建一个 Socket 对象。

例如,下面是一段代码,用于创建一个 Socket 对象

import socket

# 创建 Socket 对象
sock = socket.socket()

# 这里可以做一些其他操作,例如绑定地址和端口,设置选项等
# ...

例如下面的代码, Socket.socket() 函数调用创建了一个 socket 对象,该对象使用两个参数初始化:

  • socket.AF_INET:这表示使用 IPv4 协议。
  • socket.SOCK_STREAM:这表示使用 TCP 协议

因此,这段代码创建的套接字是一个使用 IPv4 协议和 TCP 协议的网络套接字

import socket

#使用Python的socket模块来创建套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

Socket对象常用方法

Socket模块方法描述
sock.bind()绑定一个地址和端口号到 Socket 对象上
sock.listen()监听来自客户端的连接
sock.accept()接收客户端的连接
sock.connect()连接到服务器
sock.send()发送数据到服务器
sock.recv()从服务器接收数据
sock.close()关闭Socket对象

关闭Socket对象

关闭Socket对象除了使用sock.close(), 还有一种常见的方法是使用 Python 的上下文管理器,这样就不用手动关闭 socket 对象

在下面的代码中,当执行完 with 语句块中的代码时,socket 对象会自动关闭。这种方法通常比手动关闭 socket 对象更方便。

另外,还有一点需要注意:在处理 socket 异常时,通常需要考虑关闭 socket 对象。否则可能会导致资源泄露

import socket

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    # 连接服务器
    s.connect(('www.example.com', 80))
    # 在这里使用 socket 对象

# 在这里 socket 对象已经自动关闭

一个简单的Socket实例

客户端代码

import socket

# 创建 socket 对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 获取本地主机名
host = socket.gethostname()

port = 12345

# 连接服务,指定主机和端口
client_socket.connect((host, port))

# 接收小于 1024 字节的数据
msg = client_socket.recv(1024)

# 关闭Socket对象
client_socket.close()

# 输出:对服务端发来的消息进行utf-8解码后的内容
print(msg.decode('utf-8'))

服务端代码

import socket

# 创建 socket 对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 获取本地主机名
host = socket.gethostname()

port = 12345

# 绑定端口
server_socket.bind((host, port))

# 设置最大连接数,超过后排队
server_socket.listen(5)

while True:
    # 建立客户端连接
    client_socket, addr = server_socket.accept()
    print("连接地址: %s" % str(addr))
    
    # 对发送数据进行utf-8编码
    msg = "Hello World"
    client_socket.send(msg.encode('utf-8'))
    
    # 关闭Socket对象
    client_socket.close()

运行测试

先运行服务端代码, 再运行客户端代码, 随后在客户端界面接受到服务端发来的"Hello World"
请添加图片描述

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

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

相关文章

为什么RocketMQ不使用Zookeeper作为注册中心呢?

根据CAP理论,同时最多只能满⾜两个点,而zookeeper满足的是CP,也就是说zookeeper并不能保证服务的可用性,zookeeper在进⾏选举的时候,整个选举的时间太⻓,期间整个集群都处于不可用的状态,而这对…

游戏网页设计成品 学校班级网页制作模板 大学生静态HTML网页源码 dreamweaver网页作业 简单网页课程成品

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置,有div的样式格局,这个实例比较全面,有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 ⚽精彩专栏推荐&#x1…

makefile编译一个工程碰到的问题(仅做为记录,没有逻辑)

一、编译选项如下 test : all$(CC) $(CXXFLAGS) -I/DecoderFFMPEGLive/ -o Test/$.o -c Test/test.cpp$(CC) $(CXXFLAGS) -o $ Test/$.o -L. -lDecoderFFMPEGLive -lpthread 报错误:/usr/bin/ld: cannot open output file test: Is a directory 是因为我想生成…

论文笔记CATEGORICAL REPARAMETERIZATION WITH GUMBEL-SOFTMAX

目录Gumbel-Softmax分布Gumbel-Softmax EstimatorStraight-Through (ST) Gumbel-Softmax EstimatorStraight-Through Estimator (STE)Straight-Through (ST) Gumbel-Softmax Estimator参考Gumbel-Softmax分布 Gumbel-Softmax分布是一个定义在单纯形(simplex)上的连续分布。 Gu…

项目成功的制胜法宝——有效的领导力

项目经理在开展项目的过程中,为了确保项目的成功且实现价值交付,往往会使出浑身解数、有勇有谋、甚至熟练使用“孙子兵法”。毕竟在很多情况下,需要“带兵打仗”的项目经理权力微弱,不能像“将军”那般拥有权力的加持、一呼百应。…

javaSE - 认识字符串(String class)上半部分

前言 字符串: 在C语言里面 是 没有字符串类型的! 但是,在 Java 和 C 里,有字符串类型【String】 什么是字符串?什么是字符? 在java里面有表示字符串的类 String 使用双引号,且双引号中包含任意数量的字符【…

42 | iptables的使用方法

1 iptables简介 iptables是一个linux下的防火墙工具,能帮助我们基于规则进行网络流量控制。它可以做到,但不限于以下功能: 允许/拒绝某种协议的链接建立,比如TCP,UDP允许/拒绝 来自某个ip的访问允许/拒绝某个端口被访…

田径运动会成绩管理系统

开发工具(eclipse/idea/vscode等): 数据库(sqlite/mysql/sqlserver等): 功能模块(请用文字描述,至少200字): 模块划分:通知类型、通知信息、裁判信息、运动员信息、项目类型、项目信息、场地信息、项目安排、报名信息、…

深度学习目标检测:YOLOv5实现红绿灯检测(含红绿灯数据集+训练代码)

深度学习目标检测:YOLOv5实现红绿灯检测(含红绿灯数据集训练代码) 1. 前言 本篇博客,我们将手把手教你搭建一个基于YOLOv5的红绿灯目标检测项目。目前,基于YOLOv5s的红绿灯检测精度平均值mAP_0.50.93919,mAP_0.5:0.950.63967&…

_9LeetCode代码随想录算法训练营第九天-C++栈和队列

_9LeetCode代码随想录算法训练营第九天-C栈和队列 理论基础232.用栈实现队列225.用队列实现栈 基础知识 C标准库版本 HP STL 其他版本的C STL,一般是以HP STL为蓝本实现出来的,HP STL是C STL的第一个实现版本,而且开放源代码。P.J.Plauge…

【软件测试】测试面试,面试官其实想要的答案......

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 测试经理 保障xxx的…

Python入门自学进阶-Web框架——29、DjangoAdmin项目应用-整表只读、自定义用户认证

一、整表只读 对于readonly_fields是对单个字段设置只读,现在要对整个表使用只读,也做成可配置的。在自己项目的admin.py中进行配置,如在mytestapp_admin.py中对Customer进行整表只读配置,在基类BaseAdmin中增加readonly_table …

juc-1-进程/线程/创建线程代码

1 场景: 1:执行的任务,短而快。不能是很耗时的任务。 2:异步写日志(日志框架底层就是)。 3:异步发送邮件,短信。 用MQ 最好。 4:多线程下载 2 进程与线程 进程: 进程&#xff1…

Centerfusion算法环境配置及模型训练

Centerfusion算法环境配置及模型训练概述1. 配置conda环境1.1 新建conda环境1.2 安装cuda1.3 安装cudnn1.4 安装pytorch1.5 安装cocoapi2. 配置Centerfusion2.1 克隆CenterFusion的github库2.2 安装依赖包2.3 安装DCNv22.4 下载nuscenes-devkit包3. 数据集准备3.1 下载数据集3.…

细粒度图像分类论文研读-2019

文章目录Cross-X Learning for Fine-Grained Visual Categorization(by end-to-end)AbstractIntroductionApproachPreliminariesCross- Category Cross-Semantic RegularizerCross-Layer RegularizerOptimizationLearning a Mixture of Granularity-Spec…

公司刚来的京东架构师:看完我写的 spring 笔记,甩给了我一份文档

Spring 是分层的 full-stack(全栈) 轻量级开源框架,以 IoC 和 AOP 为内核,提供了展现层 SpringMVC 和业务层事务管理等众多的企业级应⽤技术,还能整合开源世界众多著名的第三⽅框架和类库,已经成为使⽤最多…

优维助力国内某省级商业银行同城异地灾备自动化建设

银监会在《商业银行数据中心监管指引》中明确要求“商业银行每年至少进行一次重要信息系统专项灾备切换演练,每三年至少一次重要信息系统全面灾备切换演练,以真实业务接管为目标,验证灾备系统有效接管生产系统与安全回切的能力,并…

SpringSecurity概念以及整合ssm框架

基本概念 Spring中提供安全认证服务的框架,认证:验证用户密码是否正确的过程,授权:对用户能访问的资源进行控制 用户登录系统时我们协助 SpringSecurity 把用户对应的角色、权限组装好,同时把各个资源所要求的权限信息…

毕业设计-基于大数据技术的旅游推荐系统-python

目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科…

前端基础(十一)_Float浮动、清除浮动的几种方法

浮动 1、什么是浮动? 目的:为了让多个块级元素在同一行显示; 文档流:可显示的对象在排列时所占的位置; 浮动:使元素脱离正常的文档流,按照指定的顺序,方向发生移动,直到…