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

相关文章
|
5天前
|
数据采集 存储 JavaScript
构建你的第一个Python网络爬虫
【9月更文挑战第34天】在数字信息泛滥的时代,快速有效地获取和处理数据成为一项重要技能。本文将引导读者通过Python编写一个简易的网络爬虫,实现自动化地从网页上抓取数据。我们将一步步走过代码的编写过程,并探讨如何避免常见陷阱。无论你是编程新手还是想扩展你的技术工具箱,这篇文章都将为你提供有价值的指导。
46 18
|
16天前
|
机器学习/深度学习 人工智能 算法
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
文本分类识别系统。本系统使用Python作为主要开发语言,首先收集了10种中文文本数据集("体育类", "财经类", "房产类", "家居类", "教育类", "科技类", "时尚类", "时政类", "游戏类", "娱乐类"),然后基于TensorFlow搭建CNN卷积神经网络算法模型。通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型,并保存为本地的h5格式。然后使用Django开发Web网页端操作界面,实现用户上传一段文本识别其所属的类别。
29 1
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
2天前
|
存储 网络协议 Linux
聊一聊 Python 的 socket,以及 select、poll、epoll 又是怎么一回事?
聊一聊 Python 的 socket,以及 select、poll、epoll 又是怎么一回事?
12 2
|
12天前
|
机器学习/深度学习 数据采集 网络安全
使用Python实现深度学习模型:智能网络安全威胁检测
使用Python实现深度学习模型:智能网络安全威胁检测
54 5
|
15天前
|
数据采集 存储 JavaScript
构建您的第一个Python网络爬虫:抓取、解析与存储数据
【9月更文挑战第24天】在数字时代,数据是新的金矿。本文将引导您使用Python编写一个简单的网络爬虫,从互联网上自动抓取信息。我们将介绍如何使用requests库获取网页内容,BeautifulSoup进行HTML解析,以及如何将数据存储到文件或数据库中。无论您是数据分析师、研究人员还是对编程感兴趣的新手,这篇文章都将为您提供一个实用的入门指南。拿起键盘,让我们开始挖掘互联网的宝藏吧!
|
1天前
|
安全 网络协议 IDE
使用Python编写网络扫描程序
使用Python编写网络扫描程序
|
1天前
|
JSON API 开发者
深入解析Python网络编程与Web开发:urllib、requests和http模块的功能、用法及在构建现代网络应用中的关键作用
深入解析Python网络编程与Web开发:urllib、requests和http模块的功能、用法及在构建现代网络应用中的关键作用
6 0
|
1天前
|
网络协议 测试技术 网络安全
Python编程-Socket网络编程
Python编程-Socket网络编程
11 0
|
11天前
|
JSON 网络协议 数据格式
30天拿下Python之使用网络
30天拿下Python之使用网络
|
12天前
|
监控 网络协议 数据库连接
Python3 监控端口:使用 socket 库
Python3 监控端口:使用 socket 库
23 0