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 等。