【问题标题】:Forwarding messages with Python script and netcat使用 Python 脚本和 netcat 转发消息
【发布时间】:2021-09-02 18:25:57
【问题描述】:

我正在尝试将终端输出流(在终端 T1 中)转发到本地主机端口,在终端 T2 上收听。然后,使用一个简单的 Python 套接字脚本来捕获该流数据并将其打印出来。我在 ubuntu 命令中引用了 this post,在 Python 套接字脚本中引用了 this post

情况1: 在终端 T2 中,我首先运行:监听 2003 端口

nc -l 2003

然后在终端 T1 中运行流式传输命令 (Kafka)。 kafka 服务器在 9092 端口:

.bin/kafka-console-consumer --topic <topic_name> --from-beginning --bootstrap-server <dns:port> | pv | netcat localhost 2003

在这种情况下,我可以看到流数据显示在 T2 上。因此,流已经从 Kafka 终端发送到另一个端口,被另一个进程监听。

情况2: 这是我在终端 T3 上运行的 Python 代码

import socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 2003))
while True:
    data = client_socket.recv(512)
    if len(data) > 0:
        print("RECEIVED: %s" % data)

顺序是:我运行 T2,在 T3 中运行 Python 代码,然后在 T1 中运行 Kafka 命令。这一次,我在 T3 或 T2 中都没有看到任何消息。

其目的是通过中间转发器使用 Python 脚本捕获 Kafka 流式传输的数据。这是正确的方法还是有什么方法可以做到这一点?

【问题讨论】:

  • 您的 python 代码作为客户端工作,它连接到作为服务器工作的 nc -l 2003,但 nc -l 2003 必须向客户端发送一些内容才能在 Python 终端中查看某些内容 - 但通常它不会向客户端发送任何内容.您应该使用socket.listen()socket.bind() 作为服务器运行Python 而不是nc -l 2003

标签: python sockets ubuntu apache-kafka localhost


【解决方案1】:

您的 Kafka 和 Python 作为客户端工作,nc -l 2003 作为服务器工作。

存在三个问题。

  1. 此服务器只能从一个客户端接收值。
  2. Python 等待来自服务器的数据,但该服务器什么也没发送。
  3. 此服务器没有从一个客户端发送到另一个客户端的功能。

您应该使用 Python 创建服务器并使用它而不是 nc

这是一个简单的服务器,您可以使用它来代替 nc -l 2003

import socket

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('localhost', 2003))
server.listen(1)

print('WAITING FOR CLIENT')
s, addr = server.accept()
print('CONNECTED:', addr)

try:

    while True:
        data = s.recv(512)
        if not data:
            break
        print("RECEIVED:", data.decode())

except KeyboardInterrupt:
    print('STOPPED by CTRL+C')
finally:    
    s.close()
    server.close()

【讨论】: