Python客户端在聊天

时间:2013-12-26 17:04:26

标签: python sockets chat raw-input

我在尝试构建聊天的客户端时遇到了问题。我刚开始,这是我的代码:

import socket
my_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
my_socket.connect(("10.10.10.69",1234))
while True:
    message=raw_input("your message: ")
    if(message=="quit"):
        my_socket.close()
        break
    my_socket.send(message)
    data=my_socket.recv(1024)
    print "message from server:" , data

问题是raw_input。当用户发送消息时,其他用户会堆叠在raw_input上,所以只有当他们发送消息时才会收到新消息。

如何修复它(不使用线程)?

3 个答案:

答案 0 :(得分:3)

正如我评论的那样,如果你的聊天客户端在Unix上运行,请使用select.select

例如:

import socket
import sys
import select

my_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
my_socket.connect(("10.10.10.69",1234))
sys.stdout.write('your message: ')
sys.stdout.flush()
while True:
    r, w, x = select.select([sys.stdin, my_socket], [], [])
    if not r:
        continue
    if r[0] is sys.stdin:
        message = raw_input()
        if message == "quit":
            my_socket.close()
            break
        my_socket.send(message)
        sys.stdout.write('your message: ')
        sys.stdout.flush()
    else:
        data = my_socket.recv(1024)
        print "message from server:" , data

答案 1 :(得分:2)

raw_input支持它所在的线程,因此您无法在等待它的同一线程中检索消息。因此,我建议使用2个线程,一个接收新消息(比如每十秒),另一个发送消息(使用类似于现有代码的代码)。

如果你没有致力于raw_input并且真的反对线程,你可能想要查看select module

答案 2 :(得分:1)

有建议对stdin使用select(),但似乎他们没有解决主要问题。使用select,想象本地用户正在输入一行,并且在此过程的中间,您的程序输出另一个用户消息,并且将调整本地输入的编辑。您是否不允许在输入当前信息期间显示新信息(为什么?)或屏幕搞砸了。如果您在终端中执行此操作,则应使用curses或更强大的工具;使用curses,您至少可以将输入和输出分成不同的屏幕区域。当然,如果你的情况允许,图形库(如wxWidgets)甚至更适合用户界面。