Python TCP 连续读取
引言
在网络通信中,TCP是一种可靠的协议,它可以确保数据的可靠传输。使用Python编写TCP通信程序非常简单,但在实际应用中,我们经常需要处理连续到达的数据流。本文将介绍如何使用Python编写程序来连续读取TCP数据。
TCP简介
TCP(传输控制协议)是一种面向连接的协议,它提供了可靠的数据传输服务。TCP协议使用三次握手建立连接,并使用滑动窗口和序列号等机制来确保数据的可靠传输。相比于UDP协议,TCP协议更适用于对数据传输可靠性要求较高的场景。
Python TCP编程
Python提供了socket模块来进行网络编程,我们可以使用socket模块来创建TCP服务器和客户端。
TCP服务器
以下是一个简单的TCP服务器示例代码:
import socket
# 创建socket对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定地址和端口
server_address = ('localhost', 8888)
server_socket.bind(server_address)
# 监听连接
server_socket.listen(1)
print('Server is listening on {}:{}'.format(*server_address))
while True:
# 接受新的连接
client_socket, client_address = server_socket.accept()
print('New connection from {}:{}'.format(*client_address))
# 处理连接
while True:
# 从客户端接收数据
data = client_socket.recv(1024)
if not data:
break
# 处理接收到的数据
print('Received data: {}'.format(data.decode()))
# 发送响应数据
response_data = 'Hello, {}'.format(client_address[0]).encode()
client_socket.sendall(response_data)
# 关闭连接
client_socket.close()
在上述代码中,我们使用socket.socket()函数创建了一个socket对象,并指定了地址族为socket.AF_INET,协议类型为socket.SOCK_STREAM,即TCP协议。然后,我们使用bind()方法绑定了服务器的地址和端口。接下来,使用listen()方法监听连接。在一个无限循环中,我们使用accept()方法接受新的连接,并使用recv()方法接收数据。如果接收到的数据为空,则说明连接已关闭,我们通过break语句退出循环。否则,我们处理接收到的数据,并使用sendall()方法发送响应数据。最后,我们使用close()方法关闭连接。
TCP客户端
以下是一个简单的TCP客户端示例代码:
import socket
# 创建socket对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器
server_address = ('localhost', 8888)
client_socket.connect(server_address)
print('Connected to {}:{}'.format(*server_address))
while True:
# 发送数据
message = input('Enter a message to send: ')
client_socket.sendall(message.encode())
# 接收响应数据
response_data = client_socket.recv(1024)
if not response_data:
break
# 处理接收到的数据
print('Received response: {}'.format(response_data.decode()))
# 关闭连接
client_socket.close()
在上述代码中,我们也使用socket.socket()函数创建了一个socket对象,并使用connect()方法连接到服务器。然后,在一个无限循环中,我们使用input()函数从用户输入获取数据,并使用sendall()方法发送数据。接下来,我们使用recv()方法接收响应数据,如果接收到的数据为空,则说明连接已关闭,我们通过break语句退出循环。否则,我们处理接收到的数据并打印出来。最后,我们使用close()方法关闭连接。
连续读取TCP数据
在上述示例代码中,我们使用recv()方法接收数据,但这个方法只能接收到一次数据。如果服务器发送了多个包,或者数据流连续到达,我们需要连续读取数据。以下是一个示例代码:
import socket
# 创建socket对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器
server_address = ('localhost', 8888)
client_socket.connect(server_address)
print('Connected to {}:{}'.format(*server_address))
















