Python网络编程:socket编程

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

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

一、引言

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

二、基础概念

2.1 什么是 Socket

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

2.2 套接字类型

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

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

2.3 网络协议

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

三、核心组件

3.1 创建 Socket

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

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

3.2 绑定地址

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

# 绑定 IP 地址和端口号
sock.bind(('localhost', 12345))

3.3 监听连接

服务器端需要监听来自客户端的连接请求。listen() 函数的参数指定了允许排队的最大连接数。

# 开始监听连接
sock.listen(5)

3.4 接受连接

服务器端使用 accept() 函数接受客户端的连接请求,该函数会阻塞直到有客户端连接。

# 接受客户端连接
client_sock, client_addr = sock.accept()
print(f'Connected by {client_addr}')

3.5 连接服务器

客户端需要使用 connect() 函数连接到服务器。

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

3.6 发送和接收数据

服务器和客户端都可以使用 send() 和 recv() 函数进行数据的发送和接收。

# 发送数据
sock.sendall(b'Hello, world')
# 接收数据
data = sock.recv(1024)
print(f'Received {data}')

3.7 关闭 Socket

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

sock.close()

四、常用功能

4.1 设置超时

可以使用 settimeout() 函数设置 socket 操作的超时时间。

# 设置超时时间为 5 秒
sock.settimeout(5.0)

4.2 设置为非阻塞模式

可以使用 setblocking() 函数设置 socket 为非阻塞模式。

# 设置为非阻塞模式
sock.setblocking(False)

4.3 获取本地地址和端口

使用 getsockname() 函数可以获取 socket 的本地地址和端口。

# 获取本地地址和端口
address = sock.getsockname()
print(f'Local address: {address}')

4.4 获取远程地址和端口

使用 getpeername() 函数可以获取 socket 的远程地址和端口。

# 获取远程地址和端口
address = client_sock.getpeername()
print(f'Remote address: {address}')

五、综合详细的例子

5.1 示例:简单的聊天程序

我们将实现一个简单的聊天程序,包含服务器端和客户端,允许多个客户端连接到服务器并进行消息传递。


服务器端

import socket
import threading
def handle_client(client_socket, client_address):
    print(f'Accepted connection from {client_address}')
    while True:
        try:
            message = client_socket.recv(1024).decode('utf-8')
            if not message:
                break
            print(f'Received from {client_address}: {message}')
            client_socket.sendall(f'Echo: {message}'.encode('utf-8'))
        except ConnectionResetError:
            break
    client_socket.close()
    print(f'Connection from {client_address} closed')
def main():
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind(('localhost', 12345))
    server_socket.listen(5)
    print('Server listening on port 12345')
    
    while True:
        client_socket, client_address = server_socket.accept()
        client_handler = threading.Thread(target=handle_client, args=(client_socket, client_address))
        client_handler.start()
if __name__ == '__main__':
    main()

客户端

import socket
import threading
def receive_messages(sock):
    while True:
        try:
            message = sock.recv(1024).decode('utf-8')
            if not message:
                break
            print(message)
        except ConnectionResetError:
            break
def main():
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client_socket.connect(('localhost', 12345))
    print('Connected to server')
    
    receive_thread = threading.Thread(target=receive_messages, args=(client_socket,))
    receive_thread.start()
    
    while True:
        message = input()
        if message.lower() == 'exit':
            break
        client_socket.sendall(message.encode('utf-8'))
    
    client_socket.close()
    print('Disconnected from server')
if __name__ == '__main__':
    main()

5.2 运行结果

  1. 运行服务器端代码,服务器开始监听客户端连接。
Server listening on port 12345
  1. 运行客户端代码,客户端连接到服务器。
Connected to server
  1. 客户端输入消息,服务器接收到并回显。
Hello, server!
Echo: Hello, server!
  1. 多个客户端可以同时连接到服务器并进行消息传递。

六、总结

本文详细介绍了 Python 的 socket 编程,包括基础概念、核心组件、常用功能等,并通过一个综合的聊天程序示例展示了如何在实际项目中应用这些技术。通过学习这些内容,您应该能够熟练掌握 Python 中的 socket 编程,提高编写网络通信程序的能力。


Socket 编程是网络编程的重要组成部分,但在实际项目中,还需要考虑安全性、性能、错误处理等诸多问题。希望本文能帮助您更好地理解和掌握 Python 中的 socket 编程。


作者:Rjdeng

链接:https://juejin.cn/post/7398050410806378522

相关文章
|
3月前
|
机器学习/深度学习 算法 量子技术
GQNN框架:让Python开发者轻松构建量子神经网络
为降低量子神经网络的研发门槛并提升其实用性,本文介绍一个名为GQNN(Generalized Quantum Neural Network)的Python开发框架。
64 4
GQNN框架:让Python开发者轻松构建量子神经网络
|
6天前
|
JavaScript Java 大数据
基于python的网络课程在线学习交流系统
本研究聚焦网络课程在线学习交流系统,从社会、技术、教育三方面探讨其发展背景与意义。系统借助Java、Spring Boot、MySQL、Vue等技术实现,融合云计算、大数据与人工智能,推动教育公平与教学模式创新,具有重要理论价值与实践意义。
|
2月前
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
117 18
|
3月前
|
JSON 网络安全 数据格式
Python网络请求库requests使用详述
总结来说,`requests`库非常适用于需要快速、简易、可靠进行HTTP请求的应用场景,它的简洁性让开发者避免繁琐的网络代码而专注于交互逻辑本身。通过上述方式,你可以利用 `requests`处理大部分常见的HTTP请求需求。
314 51
|
2月前
|
数据采集 存储 数据可视化
Python网络爬虫在环境保护中的应用:污染源监测数据抓取与分析
在环保领域,数据是决策基础,但分散在多个平台,获取困难。Python网络爬虫技术灵活高效,可自动化抓取空气质量、水质、污染源等数据,实现多平台整合、实时更新、结构化存储与异常预警。本文详解爬虫实战应用,涵盖技术选型、代码实现、反爬策略与数据分析,助力环保数据高效利用。
111 0
|
9月前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
眼疾识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了4种常见的眼疾图像数据集(白内障、糖尿病性视网膜病变、青光眼和正常眼睛) 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Django框架搭建了一个Web网页平台可视化操作界面,实现用户上传一张眼疾图片识别其名称。
491 5
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
|
3月前
|
存储 监控 算法
基于 Python 跳表算法的局域网网络监控软件动态数据索引优化策略研究
局域网网络监控软件需高效处理终端行为数据,跳表作为一种基于概率平衡的动态数据结构,具备高效的插入、删除与查询性能(平均时间复杂度为O(log n)),适用于高频数据写入和随机查询场景。本文深入解析跳表原理,探讨其在局域网监控中的适配性,并提供基于Python的完整实现方案,优化终端会话管理,提升系统响应性能。
83 4
|
5月前
|
调度 Python
探索Python高级并发与网络编程技术。
可以看出,Python的高级并发和网络编程极具挑战,却也饱含乐趣。探索这些技术,你将会发现:它们好比是Python世界的海洋,有穿越风暴的波涛,也有寂静深海的奇妙。开始旅途,探索无尽可能吧!
112 15
|
6月前
|
数据采集 存储 监控
Python 原生爬虫教程:网络爬虫的基本概念和认知
网络爬虫是一种自动抓取互联网信息的程序,广泛应用于搜索引擎、数据采集、新闻聚合和价格监控等领域。其工作流程包括 URL 调度、HTTP 请求、页面下载、解析、数据存储及新 URL 发现。Python 因其丰富的库(如 requests、BeautifulSoup、Scrapy)和简洁语法成为爬虫开发的首选语言。然而,在使用爬虫时需注意法律与道德问题,例如遵守 robots.txt 规则、控制请求频率以及合法使用数据,以确保爬虫技术健康有序发展。
764 31
|
6月前
|
存储 监控 算法
基于 Python 哈希表算法的局域网网络监控工具:实现高效数据管理的核心技术
在当下数字化办公的环境中,局域网网络监控工具已成为保障企业网络安全、确保其高效运行的核心手段。此类工具通过对网络数据的收集、分析与管理,赋予企业实时洞察网络活动的能力。而在其运行机制背后,数据结构与算法发挥着关键作用。本文聚焦于 PHP 语言中的哈希表算法,深入探究其在局域网网络监控工具中的应用方式及所具备的优势。
153 7

推荐镜像

更多