python之socket编程
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:
break
finally:
# 清理连接
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 = 0
amount_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 编程示例,希望对你有所帮助。