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

时间:2015-09-14 16:41:17

标签: python multithreading sockets asynchronous

我现在已经在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这样的东西。

0 个答案:

没有答案