python socket库详解
socket是 Python 标准库中的一个模块,提供了对底层网络通信的接口,允许开发者进行网络编程。通过 socket你可以创建客户端和服务器应用程序,实现网络通信。
1. 基本概念
- Socket:是网络通信的端点,用于在不同主机之间或同一主机上的不同进程之间进行数据传输。
 - IP 地址:标识网络中的设备。
 - 端口号:标识设备上的特定进程或服务。
 - 协议:常用的协议有 TCP(传输控制协议)和 UDP(用户数据报协议)。
2. 创建 Socket
使用 socket.socket()函数可以创建一个套接字对象。
 import socket
# 创建一个 TCP/IP 套接字
 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 创建一个 UDP 套接字
 udp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  
- socket.AF_INET:表示使用 IPv4 地址。
 - socket.SOCK_STREAM:表示使用 TCP 协议。
 - socket.SOCK_DGRAM:表示使用 UDP 协议。
3. TCP Socket 示例
3.1 TCP 服务器
 import socket
# 创建 TCP/IP 套接字
 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定套接字到本地地址和端口
 server_address = ('localhost', 12345)
 server_socket.bind(server_address)
# 监听连接
 server_socket.listen(1)
 print("等待连接...")
while True:
     # 等待连接
     connection, client_address = server_socket.accept()
     try:
         print("连接来自:", client_address)
        # 接收数据
         data = connection.recv(1024)
         print("接收到数据:", data.decode())
        # 发送数据
         connection.sendall("Hello, Client!".encode())
     finally:
         # 关闭连接
         connection.close()
  
3.2 TCP 客户端
 import socket
# 创建 TCP/IP 套接字
 client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接到服务器
 server_address = ('localhost', 12345)
 client_socket.connect(server_address)
try:
     # 发送数据
     message = "Hello, Server!"
     client_socket.sendall(message.encode())
    # 接收数据
     data = client_socket.recv(1024)
     print("接收到数据:", data.decode())
 finally:
     # 关闭连接
     client_socket.close()
4. UDP Socket 示例
4.1 UDP 服务器
 import socket
# 创建 UDP 套接字
 server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定套接字到本地地址和端口
 server_address = ('localhost', 12345)
 server_socket.bind(server_address)
print("等待数据...")
while True:
     # 接收数据
     data, client_address = server_socket.recvfrom(4096)
     print("接收到数据:", data.decode())
    # 发送数据
     server_socket.sendto("Hello, Client!".encode(), client_address)
4.2 UDP 客户端
 import socket
# 创建 UDP 套接字
 client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 服务器地址
 server_address = ('localhost', 12345)
try:
     # 发送数据
     message = "Hello, Server!"
     client_socket.sendto(message.encode(), server_address)
    # 接收数据
     data, server = client_socket.recvfrom(4096)
     print("接收到数据:", data.decode())
 finally:
     # 关闭套接字
     client_socket.close()
  
5. Socket 常用方法
- bind(address):将套接字绑定到指定的地址和端口。
 - listen(backlog):开始监听连接,backlog 指定最大连接数。
 - accept():接受一个连接,返回一个新的套接字对象和客户端地址。
 - connect(address):连接到指定的地址。
 - send(data):发送数据。
 - recv(bufsize):接收数据,bufsize指定最大接收字节数。
 - sendto(data, address):发送数据到指定的地址。
 - recvfrom(bufsize):接收数据,并返回数据和发送方地址。
 - close():关闭套接字。
6. 异常处理
在网络编程中,可能会遇到各种异常情况,如连接超时、连接被拒绝等。可以使用 try-except块来捕获和处理这些异常。
 import socket
 import sys
try:
     # 创建套接字并连接
     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     sock.connect(('localhost', 12345))
 except socket.error as err:
     print("Socket 错误:", err)
     sys.exit(1)
 finally:
     sock.close()
  
7. 总结
socket模块是 Python 网络编程的基础,通过它可以实现 TCP 和 UDP 协议的通信。掌握 socket的基本用法后,你可以进一步学习更高级的网络编程技术,如多线程服务器、异步 I/O 等。
