Python 中的 Socket 编程入门

news2024/11/15 17:44:37

Python 中的 Socket 编程入门

Socket 编程是网络编程的重要组成部分,允许计算机通过网络进行通信。在 Python 中,使用内置的 socket 模块,开发者可以轻松地实现客户端和服务器之间的交互。本文将详细介绍 Python 中的 Socket 编程,包括基本概念、常用操作、TCP 和 UDP 通信的实现,以及一些实践示例,适合新手学习和理解。

在这里插入图片描述

一、什么是 Socket?

Socket 是一个网络编程的接口,提供了网络通信的基础。它使得应用程序能够通过网络互相发送和接收数据。简单来说,Socket 就是一个网络连接的端点,它可以被视作网络通信的“门”,通过它进行数据的发送和接收。

1.1 Socket 的工作原理

Socket 编程的基本原理如下:

  • 服务器端:创建一个 Socket,绑定到指定的地址和端口,开始监听客户端的连接请求。
  • 客户端:创建一个 Socket,连接到服务器的地址和端口。
  • 数据交换:一旦连接建立,客户端和服务器就可以互相发送和接收数据。
  • 关闭连接:数据传输完成后,关闭 Socket 以释放资源。

二、Socket 的类型

Socket 主要有两种类型:

  • TCP Socket:基于传输控制协议(TCP),提供可靠的、面向连接的数据传输。适用于需要保证数据完整性和顺序的场景,例如网页浏览、文件传输等。
  • UDP Socket:基于用户数据报协议(UDP),提供无连接、不可靠的数据传输。适用于对速度要求高、数据丢失可接受的场景,例如视频直播、在线游戏等。

三、Python 中的 Socket 编程

Python 提供了 socket 模块来进行 Socket 编程。下面我们将详细介绍如何使用该模块实现基本的 Socket 操作。

3.1 导入 socket 模块

在使用 Socket 编程之前,我们需要导入 Python 的 socket 模块。

import socket

3.2 TCP Socket 编程

3.2.1 TCP 服务器

下面是一个简单的 TCP 服务器的示例代码:

import socket

# 创建一个 TCP Socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定到指定的地址和端口
server_socket.bind(('localhost', 12345))

# 开始监听客户端的连接请求
server_socket.listen(5)
print("服务器已启动,等待连接...")

while True:
    # 接受客户端的连接
    client_socket, addr = server_socket.accept()
    print(f"连接来自: {addr}")

    # 接收数据
    data = client_socket.recv(1024).decode('utf-8')
    print(f"接收到的数据: {data}")

    # 发送数据
    response = "Hello, Client!"
    client_socket.send(response.encode('utf-8'))

    # 关闭与客户端的连接
    client_socket.close()
3.2.2 TCP 客户端

接下来是一个简单的 TCP 客户端的示例代码:

import socket

# 创建一个 TCP Socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 连接到服务器
client_socket.connect(('localhost', 12345))

# 发送数据
message = "Hello, Server!"
client_socket.send(message.encode('utf-8'))

# 接收服务器的响应
response = client_socket.recv(1024).decode('utf-8')
print(f"服务器响应: {response}")

# 关闭连接
client_socket.close()

3.3 UDP Socket 编程

UDP 编程的代码结构与 TCP 稍有不同。以下是一个简单的 UDP 服务器和客户端示例。

3.3.1 UDP 服务器
import socket

# 创建一个 UDP Socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 绑定到指定的地址和端口
server_socket.bind(('localhost', 12345))
print("UDP 服务器已启动,等待消息...")

while True:
    # 接收数据
    data, addr = server_socket.recvfrom(1024)
    print(f"接收到来自 {addr} 的数据: {data.decode('utf-8')}")

    # 发送响应
    response = "Hello, Client!"
    server_socket.sendto(response.encode('utf-8'), addr)
3.3.2 UDP 客户端
import socket

# 创建一个 UDP Socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 发送数据
message = "Hello, UDP Server!"
client_socket.sendto(message.encode('utf-8'), ('localhost', 12345))

# 接收服务器的响应
response, addr = client_socket.recvfrom(1024)
print(f"服务器响应: {response.decode('utf-8')}")

# 关闭连接
client_socket.close()

四、Socket 编程的常见操作

在 Socket 编程中,有一些常用的操作和方法,下面简要介绍一些常见的方法。

4.1 Socket 方法

  • socket.socket(family, type):创建一个新的 Socket 对象。
  • bind(address):将 Socket 绑定到指定的地址(主机名或 IP 地址)和端口号。
  • listen(backlog):开始监听传入连接,backlog 参数指定在拒绝连接之前,可以挂起的最大连接数量。
  • accept():接受一个连接请求,返回一个新的 Socket 对象和客户端的地址。
  • connect(address):连接到指定的地址。
  • send(data):发送数据到连接的 Socket。
  • recv(bufsize):接收数据,bufsize 参数指定要接收的最大字节数。
  • close():关闭 Socket。

4.2 处理异常

在网络编程中,异常处理非常重要,因为网络连接可能随时中断。我们可以使用 try...except 块来处理可能的异常。

try:
    # Socket 操作
    ...
except socket.error as e:
    print(f"发生错误: {e}")

五、实践示例:聊天室应用

为了更好地理解 Socket 编程,下面将实现一个简单的聊天室应用。该应用允许多个客户端通过 TCP 连接到服务器,并进行实时聊天。

5.1 聊天室服务器

import socket
import threading

clients = []

def handle_client(client_socket):
    while True:
        try:
            message = client_socket.recv(1024).decode('utf-8')
            if message:
                print(f"接收到消息: {message}")
                broadcast(message, client_socket)
            else:
                break
        except:
            break
    client_socket.close()
    clients.remove(client_socket)

def broadcast(message, client_socket):
    for client in clients:
        if client != client_socket:
            client.send(message.encode('utf-8'))

def start_server():
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind(('localhost', 12345))
    server_socket.listen(5)
    print("聊天室服务器已启动,等待连接...")

    while True:
        client_socket, addr = server_socket.accept()
        clients.append(client_socket)
        print(f"新用户连接: {addr}")
        threading.Thread(target=handle_client, args=(client_socket,)).start()

start_server()

5.2 聊天室客户端

import socket
import threading

def receive_messages(client_socket):
    while True:
        message = client_socket.recv(1024).decode('utf-8')
        print(f"接收到消息: {message}")

def start_client():
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client_socket.connect(('localhost', 12345))

    threading.Thread(target=receive_messages, args=(client_socket,)).start()

    while True:
        message = input("请输入消息: ")
        client_socket.send(message.encode('utf-8'))

start_client()

六、总结

Socket 编程是实现网络通信的基础,Python 提供了简单易用的 socket 模块,方便开发者进行 TCP 和 UDP 通信。通过本文的介绍,你应该对 Python 中的 Socket 编程有了初步的了解。

从简单的客户端和服务器示例到更复杂的聊天室应用,Socket 编程的灵活性和强大功能使其成为网络应用开发的重要工具。随着你对 Socket 编程的深入了解,可以实现更复杂的网络应用,掌握网络协议、数据处理等更高级的概念。

如果你希望更深入地学习网络编程,建议参考相关书籍和文档,进行更多的实践和探索。希望你在 Socket 编程的学习中获得乐趣!

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

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

相关文章

微服务Docker相关指令

1、拉取容器到镜像仓库 docker pull xxx //拉取指令到 镜像仓库 例如 docker pull mysql 、docker pull nginx docker images //查看镜像仓库 2、删除资源 2.1、删除镜像仓库中的资源 docker rmi mysql:latest //删除方式一:格式 docker rmi 要…

19.初始C语言指针

初始C语言指针 1.指针的认识2.指针变量的引入3.指针变量的类型4.指针的应用场景15.指针的应用场景26.作业 1.指针的认识 指针 地址 //int a 10; //类型 变量名 内存地址 值 1.变量名直接访问2.通过地址访问&:取地址运算符* :将地址内的值读取…

数据库数据恢复—Oracle报错“需要更多的恢复来保持一致性”的数据恢复案例

Oracle数据库故障&检测: 打开oracle数据库报错“system01.dbf需要更多的恢复来保持一致性,数据库无法打开”。 数据库没有备份,无法通过备份去恢复数据库。用户方联系北亚企安数据恢复中心并提供Oracle_Home目录中的所有文件,…

GitHub 上高星 AI 开源项目推荐

FIFO-Diffusion 介绍:FIFO-Diffusion 是一个创新的开源项目,它能够基于文本描述生成无限长度的高品质视频,而无需任何预先的模型训练。这一技术的核心在于其高效的内存管理策略和先进的扩散模型,使得即使是小型GPU配置也能轻松应…

1018. 可被 5 整除的二进制前缀

目录 一:题目: 二:代码: 三:结果: 一:题目: 给定一个二进制数组 nums ( 索引从0开始 )。 我们将xi 定义为其二进制表示形式为子数组 nums[0..i] (从最高有效位到最低有效位)。 …

数据结构之栈(python)

栈(顺序栈与链栈) 1.栈存储结构1.1栈的基本介绍1.2进栈和出栈1.3栈的具体实现1.4栈的应用例一例二例三 2.顺序栈及基本操作(包含入栈和出栈)2.1顺序栈的基础介绍2.2顺序栈元素入栈2.3顺序栈元素出栈2.4顺序栈的表示和实现 3.链栈及…

IDEA去除掉虚线,波浪线,和下划线实线的方法

初次安装使用IDEA,总是能看到导入代码后,出现很多的波浪线,下划线和虚线,这是IDEA给我们的一些提示和警告,但是有时候我们并不需要,反而会让人看着很不爽,这里简单记录一下自己的调整方法&#…

Linux:权限管理

基本权限和归属 权限和归属 基本权限与归属 • 访问权限 – 读取:允许查看内容-read – 写入:允许修改内容-write – 可执行:允许运行和切换-excute对于文本文件:r读取权限:cat、less、grep、head、tailw写入权限&am…

linux下共享内存的3种使用方式

进程是资源封装的单位,内存就是进程所封装的资源的一种。一般情况下,进程间的内存是相互隔离的,也就是说一个进程不能访问另一个进程的内存。如果一个进程想要访问另一个进程的内存,那么必须要进过内核这个桥梁,这就是…

中国雕塑—孙溟㠭凿刻印《自然贼》

中国雕塑孙溟㠭凿刻作品《自然贼》 孙溟㠭凿刻印《自然贼》 遵循自然之法谓之道,脱离自然之道谓之贼,道法自然。丙申秋月溟展刊。 孙溟㠭凿刻印《自然贼》 这方《自然贼》,红木章料,半尺见方,自然古朴,浑…

摆脱困境并在iPhone手机上取回删除照片的所有解决方案

您是否无意中从 iPhone 中删除了照片?您,无需惊慌,因为您可以使用以下方法恢复所有照片。 如果您长时间使用 iPhone,您应该知道 iOS 提供了许多 Android 不提供的备份功能。例如,您的所有照片都会自动备份到 iCloud 存…

【机器学习(七)】分类和回归任务-K-近邻 (KNN)算法-Sentosa_DSML社区版

文章目录 一、算法概念二、算法原理(一)K值选择(二)距离度量1、欧式距离2、曼哈顿距离3、闵可夫斯基距离 (三)决策规则1、分类决策规则2、回归决策规则 三、算法优缺点优点缺点 四、KNN分类任务实现对比&am…

音视频生态下Unity3D和虚幻引擎(Unreal Engine)的区别

技术背景 好多开发者跟我们做技术交流的时候,会问我们,为什么有Unity3D的RTMP|RTSP播放模块,还有RTMP推送和轻量级RTSP服务模块,为什么不去支持虚幻引擎?二者区别在哪里?本文就Unity3D和虚幻引擎之间的差异…

idea上传jar包到nexus

注意&#xff1a;确保idea中项目为maven项目&#xff0c;并且在nexus中已经创建了maven私服。 1、配置pom.xml中推送代码配置 <distributionManagement> <repository> <id>releases</id> <url>http://127.0.0.1:8001/repository/myRelease/<…

鼻咽癌中三级淋巴结构的单细胞与空间转录组分析|文献精析·24-09-22

小罗碎碎念 研究团队通过单细胞和空间转录组分析&#xff0c;揭示了与鼻咽癌进展和免疫治疗反应相关的三级淋巴结构。 作者角色作者姓名单位&#xff08;中文&#xff09;第一作者Yang Liu/通讯作者Jin-Xin Bei国家癌症中心南方肿瘤学重点实验室&#xff0c;鼻咽癌诊断治疗广东…

机器学习04-逻辑回归(python)-02原理与损失函数

​​​​​​​ 1. 逻辑回归概念 逻辑回归&#xff08;Logistic Regression&#xff09; 是一种 分类模型&#xff0c;主要用于解决 二分类问题&#xff08;即分成两类&#xff0c;如是否通过、是否患病等&#xff09;。逻辑回归的目标是根据输入的特征预测一个 概率&#xff0…

C++——关联式容器(4):set和map

在接触了诸如二叉搜索树、AVL树、红黑树的树形结构之后&#xff0c;我们对树的结构有了大致的了解&#xff0c;现在引入真正的关联式容器。 首先&#xff0c;先明确了关联式容器的概念。我们之前所接触到的如vector、list等容器&#xff0c;我们知道他们实际上都是线性的数据结…

C++门迷宫

目录 开头程序程序的流程图程序游玩的效果下一篇博客要说的东西 开头 大家好&#xff0c;我叫这是我58。 程序 #include <iostream> using namespace std; void printmaze(const char strmaze[11][11]) {int i 0;int ia 0;for (; i < 11; i) {for (ia 0; ia <…

部署林风社交论坛/社交论坛linfeng-community遇到问题集合

部署开源版本遇到的问题 1.管理端前端部署 npm install报错 “ERR! gyp verb ensuring that file exists: C:\Python27\python.exe” “ERR! gyp ERR! node -v v20.10.0” “ ERR! gyp ERR! node-gyp -v v3.8.0” 原因:node版本和node-gyp版本不匹配 解决方法: 1&…

航拍房屋检测系统源码分享

航拍房屋检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…