Python中的套接字和线程异步I/O
我在Python中使用套接字已经有一段时间了,我对发送、接收、生成服务器和客户机等都很在行。不过,我正在尝试创建一个Telnet客户机,它可以使用线程异步接收和发送数据。我制作了一个简单的Telnet服务器,它利用它接收和发送的数据,工作正常,但我的客户端没有。以下是客户端代码:Python中的套接字和线程异步I/O,python,multithreading,sockets,asynchronous,Python,Multithreading,Sockets,Asynchronous,我在Python中使用套接字已经有一段时间了,我对发送、接收、生成服务器和客户机等都很在行。不过,我正在尝试创建一个Telnet客户机,它可以使用线程异步接收和发送数据。我制作了一个简单的Telnet服务器,它利用它接收和发送的数据,工作正常,但我的客户端没有。以下是客户端代码: import socket import threading s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('localhost',
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
>>>
以下是服务器代码(稍加编辑,不会影响套接字的工作-我删除了用户在线部分):
正如你所看到的,它不像我希望的那样工作。如何让它异步工作?对不起,如果这是一个有点愚蠢的问题,但我已经环顾四周,似乎无法让它工作。我想做它没有扭曲或asysio任何东西。< /P>你使用的是什么版本的Python?考虑使用!它是python 3附带的异步编程框架。当我使用
nc-l
作为服务器时,你的客户端工作得非常完美。请发布仍然存在问题的服务器代码的最短工作版本。我将尝试asyncio,但我希望能够使用线程来完成。无论如何谢谢你!asyncio是本机Python吗?链接上说它包含在图书馆里,但我认为它是外部的东西。编辑:是的,当我导入它时我才意识到。谢谢@polpak!
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())