Python 中的简单 TELNET - 如果没有数据到来则循环暂停

Simple TELNET in Python - loop paused if no data coming

我正在尝试在 Python 中构建一个非常简单的 TELNET 客户端,但我在最后一部分遇到了问题:sending/receiving 数据 to/from 服务器。

使用我的代码,如果一开始没有数据到达,循环就会暂停,我什至无法发送命令。

这里是代码中感兴趣的部分:

# Infinite cycle that allows user to get and send data from/to the host
while True:

    incoming_data = my_socket.recv(4096)
    if not incoming_data:
        print('Problem occurred - Connection closed')
        my_socket.close()
        sys.exit()
    else:
        # display data sent from the host trough the stdout
        sys.stdout.write(incoming_data)
        # Commands sent to the host
    command = sys.stdin.readline()
    my_socket.send(command)

(如果我尝试连接到一些在开始时发送数据的主机,我认为该程序有点工作。)

我的想法是有两个循环,运行 同时获取数据或发送数据,但我无法让它工作。 我不能使用 telnet 库,我不想使用 select 库(仅 sys 和 socket)。

您想使用 threading 库。

以下程序运行在一个线程中接收,在另一个线程中发送:

import socket
from threading import Thread


def listen(conn):
    while True:
        received = conn.recv(1024).decode()
        print("Message received: " + received)


def send(conn):
    while True:
        to_send = input("Input message to send: ").encode()
        conn.sendall(to_send)

host = "127.0.0.1"
port = 12345    

sock = socket.socket()
sock.connect((host, port))

Thread(target=listen, args=[sock]).start()
Thread(target=send, args=[sock]).start()

此程序适用于 Python 3。Python 2 非常相似,只是 print() 的工作方式不同,您不需要 encode()decode() 一切都通过套接字发送。

listensend函数是运行并行的,这样数据一到就打印,也可以随时发送数据。实际上,您可能希望进行一些更改,以便不只是在输入提示上打印数据。但是,这仅在命令行应用程序中很难做到。

研究 queues 以控制线程间的数据传递。

如果您还有其他问题,请告诉我。