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()
一切都通过套接字发送。
listen
和send
函数是运行并行的,这样数据一到就打印,也可以随时发送数据。实际上,您可能希望进行一些更改,以便不只是在输入提示上打印数据。但是,这仅在命令行应用程序中很难做到。
研究 queues 以控制线程间的数据传递。
如果您还有其他问题,请告诉我。
我正在尝试在 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()
一切都通过套接字发送。
listen
和send
函数是运行并行的,这样数据一到就打印,也可以随时发送数据。实际上,您可能希望进行一些更改,以便不只是在输入提示上打印数据。但是,这仅在命令行应用程序中很难做到。
研究 queues 以控制线程间的数据传递。
如果您还有其他问题,请告诉我。