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,使用 send
或 sendall
方法:
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套接字。
- 准备要发送的消息。
- 发送消息到服务器的地址和端口。
- 等待服务器的响应,并打印其内容。
- 关闭套接字。