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

相关文章
|
12天前
|
搜索推荐 程序员 调度
精通Python异步编程:利用Asyncio与Aiohttp构建高效网络应用
【10月更文挑战第5天】随着互联网技术的快速发展,用户对于网络应用的响应速度和服务质量提出了越来越高的要求。为了构建能够处理高并发请求、提供快速响应时间的应用程序,开发者们需要掌握高效的编程技术和框架。在Python语言中,`asyncio` 和 `aiohttp` 是两个非常强大的库,它们可以帮助我们编写出既简洁又高效的异步网络应用。
61 1
|
10天前
|
Python
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
使用Python的socket库实现客户端到服务器端的图片传输,包括客户端和服务器端的代码实现,以及传输结果的展示。
67 3
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
|
10天前
|
JSON 数据格式 Python
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
本文介绍了如何使用Python的socket模块实现客户端到服务器端的文件传输,包括客户端发送文件信息和内容,服务器端接收并保存文件的完整过程。
47 1
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
|
3天前
|
消息中间件 监控 网络协议
Python中的Socket魔法:如何利用socket模块构建强大的网络通信
本文介绍了Python的`socket`模块,讲解了其基本概念、语法和使用方法。通过简单的TCP服务器和客户端示例,展示了如何创建、绑定、监听、接受连接及发送/接收数据。进一步探讨了多用户聊天室的实现,并介绍了非阻塞IO和多路复用技术以提高并发处理能力。最后,讨论了`socket`模块在现代网络编程中的应用及其与其他通信方式的关系。
|
5天前
|
网络协议 Linux 应用服务中间件
Socket通信之网络协议基本原理
【10月更文挑战第10天】网络协议定义了机器间通信的标准格式,确保信息准确无损地传输。主要分为两种模型:OSI七层模型与TCP/IP模型。
|
7天前
|
机器学习/深度学习 人工智能 算法
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
玉米病害识别系统,本系统使用Python作为主要开发语言,通过收集了8种常见的玉米叶部病害图片数据集('矮花叶病', '健康', '灰斑病一般', '灰斑病严重', '锈病一般', '锈病严重', '叶斑病一般', '叶斑病严重'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。再使用Django搭建Web网页操作平台,实现用户上传一张玉米病害图片识别其名称。
22 0
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
|
13天前
|
运维 监控 网络安全
Python 在网络运维方面的自动化应用实例
Python 在网络运维方面的自动化应用实例
39 4
|
13天前
|
安全 网络协议 网络安全
Python Socket编程大揭秘:从菜鸟到黑客的进阶之路,你准备好了吗?
【10月更文挑战第4天】在编程领域,Python Socket编程犹如一把开启网络世界的钥匙,带领开发者从简单数据传输迈向复杂应用构建。本文将引导你从零开始,逐步掌握Socket编程的核心技巧,包括基本概念、TCP服务器与客户端的搭建、并发处理及异常管理、SSL/TLS加密通信,直至深入了解网络协议与安全漏洞。通过实战演练与理论学习,助你成为驾驭网络世界的高手。
27 1
|
8天前
|
运维 安全 网络协议
Python 网络编程:端口检测与IP解析
本文介绍了使用Python进行网络编程的两个重要技能:检查端口状态和根据IP地址解析主机名。通过`socket`库实现端口扫描和主机名解析的功能,并提供了详细的示例代码。文章最后还展示了如何整合这两部分代码,实现一个简单的命令行端口扫描器,适用于网络故障排查和安全审计。
13 0
|
17天前
|
安全 网络协议 IDE
使用Python编写网络扫描程序
使用Python编写网络扫描程序
27 0