我现在已经在Python中使用了套接字了一段时间,我可以发送,接收,制作服务器和客户端等等。但是,我试图创建一个可以接收的Telnet客户端并使用线程异步发送数据。我已经创建了一个简单的Telnet服务器,它将收到的数据大写并将其发送回来,它工作正常,但我的客户端没有。这是客户端代码:
import socket
import threading
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost', 23))
def send():
while True:
command = input('>>> ')
s.send(command.encode())
print('Sent')
def recv():
while True:
data = s.recv(8192)
finalData = ''
try:
finalData = data.decode()
except Exception:
finalData = data
if len(finalData) == 0:
s.close()
else:
print(finalData)
sendThread = threading.Thread(target = send)
recvThread = threading.Thread(target = recv)
sendThread.start()
recvThread.start()
当它连接到我的服务器,并输入一些文本以便大写时,我可以看到服务器将其大写,但是一旦我输入其他要发送的东西,客户端只接收数据,这会使对象失败。例如,这里有一些客户端输出:
>>> Welcome to Telnet!
1 users online
Enter a string: hello
Sent
>>> g
SentHELLO
>>>
这是服务器代码(带有次要编辑但不会影响套接字的工作 - 我删除了用户的在线部分):
import socket
s = socket.socket()
s.bind(('', 23))
s.listen(100)
print('Socket created')
dataList = []
connected = False
while True:
c, addr = s.accept()
print('Connection received from ' + str(addr))
connected = True
c.send(b'Welcome to Telnet!\r\n')
c.send(b'Enter a string: ')
while connected:
data = c.recv(1024)
data = data.decode()
print(dataList)
dataToSend = ''
for i in dataList:
dataToSend += i
c.send(dataToSend.encode())
if data == '\r\n':
print('[enter]')
string = ''.join(dataList)
if 'quit\r\n' in string[-8:]:
c.close()
print('Connection closed by remote host')
connected = False
data = []
else:
string = ''.join(dataList)
c.send(string.upper().encode())
c.send(b'\r\nEnter a string: ')
dataList = []
elif data == '\b':
print('[backspace]')
if len(dataList) == 0:
pass
else:
dataList.pop()
c.send(b'\b')
elif data == ' ':
print('[space]')
dataList.append(' ')
elif data == '':
print('Connection closed by remote host')
c.close()
connected = False
data = []
users -= 1
else:
print(str(data))
dataList.append(data.upper())
正如您所看到的,它并不像我希望的那样工作。我怎样才能让它异步工作?对不起,如果这是一个愚蠢的问题,但我已经环顾四周,似乎无法让它发挥作用。我想没有像Twisted或asyncio这样的东西。