使用msvcrt模块避免在客户端聊天中阻塞

时间:2015-01-11 23:23:43

标签: python sockets python-2.7 select msvcrt

答案:使用龙卷风模块的类IOLoop和errno模块。

此外,这是一篇关于这个主题的好文章:Async I/O and Python


当客户端可以在不等待服务器重放的情况下编写时,我尝试编写公共聊天。我想在客户端随时发送消息的能力期间随时打印服务器的消息(当他输入他输入的消息时)。

我知道它可以通过线程来完成,但我也知道它可以用msvcrt模块完成。

这是我现在的客户端聊天:

def list2string(my_msg):
    s = ""
    for item in my_msg:
        s += item
    return s

import socket, sys, select, msvcrt

my_socket = socket.socket()
my_socket.connect(('127.0.0.1', 1733))

socket_messages = [my_socket]
my_msg = []

try:
    while 1:
        rlist, wlist, xlist = select.select(socket_messages, socket_messages, [])
        for sock in rlist:
            if sock is my_socket:
                msg = my_socket.recv(1024)
                print msg

        if msvcrt.kbhit():                # if the client typed character
            char = msvcrt.getch()         # get this character
            if chr(13) is char:           # if enter
                my_string_msg = list2string(my_msg)
                print '[Me]', my_string_msg
                my_socket.send(my_string_msg)
                my_msg = [] 

            elif ord(char) == 8:     #backspace
                my_msg.pop()

            else:
                # else just show the character in the line
                # sys.stdout.write(char) --> this command?
                # but then if the server would message it will be mixed with it.
                my_msg.append(char)
finally:
    my_socket.close()


如您所见,主要问题是如何编写客户端在服务器发送的打印消息中键入的字母。

1 个答案:

答案 0 :(得分:0)

答案:使用龙卷风模块的类IOLoop和errno模块。

此外,这是一篇关于这个主题的好文章:Async I/O and Python