Python中的套接字和线程异步I/O

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',

我在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

>>> 
以下是服务器代码(稍加编辑,不会影响套接字的工作-我删除了用户在线部分):


正如你所看到的,它不像我希望的那样工作。如何让它异步工作?对不起,如果这是一个有点愚蠢的问题,但我已经环顾四周,似乎无法让它工作。我想做它没有扭曲或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())