python中socket详解使用教程(结尾有案列)

socket 是 Python 中用于网络通信的一个标准库。它提供了创建网络套接字并进行网络通信的接口。下面我会详细解释 Python 中 socket 的基本概念和使用方法。

简单列程,在文章后面,可以自行翻阅

基本概念

  • 套接字(Socket):套接字是计算机之间进行通信的一种约定或端点,是不同主机间进程进行通信的端点。

  • TCP 和 UDP

    • TCP(传输控制协议):面向连接的、可靠的、基于字节流的传输层通信协议。
    • UDP(用户数据报协议):无连接的、不可靠的、基于数据报的传输层通信协议。

创建套接字

在 Python 中,使用 socket 模块创建套接字的基本语法如下:

python 复制代码
import socket  
  
# 创建一个 TCP 套接字  
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
  
# 创建一个 UDP 套接字  
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

其中:

  • socket.AF_INET 表示使用 IPv4 地址。
  • socket.SOCK_STREAM 表示使用 TCP 协议。
  • socket.SOCK_DGRAM 表示使用 UDP 协议。

绑定地址和端口

对于服务器端套接字,通常需要绑定到一个特定的地址和端口上:

python 复制代码
tcp_socket.bind(('localhost', 12345))

监听连接(仅适用于 TCP)

对于 TCP 服务器,需要监听连接:

python 复制代码
tcp_socket.listen(5)  # 最多挂起 5 个连接

接受连接(仅适用于 TCP)

服务器可以使用 accept 方法接受客户端的连接请求:

python 复制代码
client_socket, client_address = tcp_socket.accept()

这将返回一个包含新套接字和客户端地址的元组。新套接字用于与客户端通信。

连接服务器(仅适用于 TCP)

对于 TCP 客户端,需要连接到服务器:

python 复制代码
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
client_socket.connect(('server_address', port))

发送和接收数据

  • 发送数据

对于 TCP,使用 sendsendall 方法:

python 复制代码
tcp_socket.send(b'Hello, server!')

对于 UDP,使用 sendto 方法:

python 复制代码
udp_socket.sendto(b'Hello, server!', ('server_address', port))
  • 接收数据

对于 TCP,使用 recv 方法:

python 复制代码
data = tcp_socket.recv(1024)  # 最多接收 1024 字节的数据

对于 UDP,使用 recvfrom 方法:

python 复制代码
data, server_address = udp_socket.recvfrom(1024)

关闭套接字

使用 close 方法关闭套接字:

python 复制代码
socket.close()

TCP示例

TCP 服务器示例
python 复制代码
import socket  
  
def start_tcp_server():  
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
    server_socket.bind(('localhost', 12345))  
    server_socket.listen(5)  
    print('Server started, listening on port 12345...')  
      
    while True:  
        client_socket, client_address = server_socket.accept()  
        print(f'Connection from {client_address}')  
        data = client_socket.recv(1024)  
        print(f'Received data: {data.decode()}')  
        client_socket.send(b'Hello, client!')  
        client_socket.close()  
  
if __name__ == '__main__':  
    start_tcp_server()
TCP 客户端示例
python 复制代码
import socket  
  
def start_tcp_client():  
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
    client_socket.connect(('localhost', 12345))  
    client_socket.send(b'Hello, server!')  
    data = client_socket.recv(1024)  
    print(f'Received data from server: {data.decode()}')  
    client_socket.close()  
  
if __name__ == '__main__':  
    start_tcp_client()


UDP服务器示例

UDP 服务器示例

python 复制代码
import socket  
  
def start_udp_server():  
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 创建UDP套接字  
    server_socket.bind(('localhost', 12345))  # 绑定地址和端口  
    print('UDP Server started, listening on port 12345...')  
  
    while True:  
        data, client_address = server_socket.recvfrom(1024)  # 接收数据  
        print(f'Received data from {client_address}: {data.decode()}')  
        server_socket.sendto(b'Hello, client!', client_address)  # 发送响应  
  
if __name__ == '__main__':  
    start_udp_server()

UDP 客户端示例

python 复制代码
import socket  
  
def start_udp_client():  
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 创建UDP套接字  
    message = b'Hello, server!'  
    server_address = ('localhost', 12345)  
  
    client_socket.sendto(message, server_address)  # 发送数据  
    data, server_address = client_socket.recvfrom(1024)  # 接收响应  
    print(f'Received data from server: {data.decode()}')  
  
    client_socket.close()  # 关闭套接字  
  
if __name__ == '__main__':  
    start_udp_client()

示例解释

UDP服务器

  • 创建一个UDP套接字。
  • 绑定到本地地址和端口。
  • 进入一个无限循环,接收来自客户端的数据。
  • 对于接收到的每条消息,打印其内容,并发送一个响应给客户端。

UDP客户端

  • 创建一个UDP套接字。
  • 准备要发送的消息。
  • 发送消息到服务器的地址和端口。
  • 等待服务器的响应,并打印其内容。
  • 关闭套接字。
相关推荐
cheems9527几秒前
【javaEE】全方位拆解 UDP 协议
网络·网络协议·udp
崎岖Qiu5 分钟前
【计算机网络 | 第七篇】数据链路层及三个基本问题
网络·网络协议·计算机网络·数据链路层
科技块儿10 分钟前
物联网设备分布分析需要精准地理信息?支持IPv4IPv6双栈批量解析的IP离线库
物联网·网络协议·tcp/ip
Yu_Lijing17 分钟前
网络复习篇——网络基础(一)
网络·c++·笔记
乾元24 分钟前
身份与访问:行为生物识别(按键习惯、移动轨迹)的 AI 建模
运维·网络·人工智能·深度学习·安全·自动化·安全架构
tzy23330 分钟前
通俗理解 TCP 的 三次握手 和 四次挥手
网络·tcp/ip·三次握手·四次挥手
一晌小贪欢39 分钟前
深入理解 Python HTTP 请求:从基础到高级实战指南
开发语言·网络·python·网络协议·http
杜子不疼.40 分钟前
远程软件大战再升级:2026年2月三大远程控制软件深度横评,安全功能成新焦点
服务器·网络·安全
linux kernel2 小时前
第六部分:数据链路层
服务器·网络