使用 Python 脚本和 netcat 转发消息

问题描述

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

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

=VLOOKUP(TEXT(A1,"000"),ARRAY,COL_NUM,FALSE)

在终端 T1,我然后运行流命令 (Kafka)。 kafka 服务器在端口 9092 上:

nc -l 2003

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

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

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

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

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

解决方法

您的 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()