【问题标题】:Avoid blocking in cliet side chat using msvcrt module避免使用 msvcrt 模块阻止客户端聊天
【发布时间】:2015-03-09 16:56:01
【问题描述】:

答案:使用tornado模块和errno模块的IOLoop类。

另外,这是一篇关于主题的好文章: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()


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

【问题讨论】:

    标签: python sockets python-2.7 select msvcrt


    【解决方案1】:

    答案:使用tornado模块和errno模块的类IOLoop。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-21
      • 1970-01-01
      • 2015-10-12
      • 2011-01-04
      • 1970-01-01
      • 2015-07-03
      • 2015-06-01
      相关资源
      最近更新 更多