Socket编程是计算机网络编程的基础,它允许两台计算机(或同一个计算机的不同进程)之间进行通信。Python 提供了 socket
模块,可以很方便地进行 Socket 编程。下面是一些基本的 Socket 编程示例,包括 TCP 和 UDP。
TCP Socket 编程
TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
服务器端
import socket# 创建一个 socket 对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 绑定地址和端口
server_address = ('localhost', 65432)
server_socket.bind(server_address)# 开始监听
server_socket.listen(5)
print('Server listening on', server_address)while True:# 等待连接print('Waiting for a connection...')connection, client_address = server_socket.accept()try:print('Connection from', client_address)# 接收数据while True:data = connection.recv(1024)if data:print('Received', repr(data))# 发送数据connection.sendall(data)else:breakfinally:# 清理连接connection.close()
客户端
import socket# 创建一个 socket 对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 连接到服务器
server_address = ('localhost', 65432)
client_socket.connect(server_address)try:# 发送数据message = 'This is the message. It will be echoed back.'print('Sending', repr(message))client_socket.sendall(message)# 接收数据amount_received = 0amount_expected = len(message)while amount_received < amount_expected:data = client_socket.recv(1024)amount_received += len(data)print('Received', repr(data))finally:# 清理连接client_socket.close()
UDP Socket 编程
UDP(用户数据报协议)是一个简单的面向数据报的传输层协议。它不保证数据包的顺序、可靠性或完整性。
服务器端
import socket# 创建一个 socket 对象
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 绑定地址和端口
server_address = ('localhost', 10000)
sock.bind(server_address)print('Starting UDP server')while True:# 接收数据print('Waiting to receive message')data, address = sock.recvfrom(4096) # 缓冲区大小是 4096 字节print('Received {} bytes from {}'.format(len(data), address))print('Data: {}'.format(data))if data:sent = sock.sendto(data, address) # 将接收到的数据发送回去print('Sent {} bytes back to {}'.format(sent, address))
客户端
import socket
import time# 创建一个 socket 对象
MESSAGE = 'This is the message.'
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 连接到服务器
server_address = ('localhost', 10000)try:# 发送数据print('Sending: {}'.format(MESSAGE))sent = sock.sendto(MESSAGE.encode(), server_address)# 接收响应time.sleep(1) # 等待一秒以确保服务器有时间处理请求data, server = sock.recvfrom(4096)print('Received: {}'.format(data.decode()))finally:# 清理连接print('Closing socket')sock.close()
注意事项
- 异常处理:在实际应用中,应添加更多的异常处理,以确保程序的健壮性。
- 并发:对于多个客户端连接,可以使用多线程或异步编程来处理。
- 资源管理:确保在程序结束时正确关闭所有的 socket 连接。
以上是一些基础的 Python Socket 编程示例,希望对你有所帮助。