【问题标题】:Python client side in chat聊天中的 Python 客户端
【发布时间】:2013-12-26 17:04:25
【问题描述】:

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

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 上,因此只有当他们也发送消息时,他们才会收到新消息。

我怎样才能修复它(不使用线程)?

【问题讨论】:

  • 您使用哪种操作系统?在 Unix 中,您可以使用select.select。在 Windows 中,您应该使用线程。现在你有另一个问题:如果你在输入过程中收到消息,你的输入就会混乱。
  • 我正在使用 Ubuntu。其他问题我稍后会解决

标签: python sockets chat raw-input


【解决方案1】:

正如我所说,如果您的聊天客户端在 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

【讨论】:

  • 有没有办法在 Windows 上做到这一点?使用选择。选择?我不想用耳塞。
  • @Nityuiop18,您不能在 Windows 上使用 select.select(针对此问题),因为它仅适用于 Windows 上的套接字。
【解决方案2】:

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

如果您不致力于raw_input 并且真的反对线程,您可能需要查看select module

【讨论】:

  • 我想不使用theards来做
  • 如果你使用raw_input,我认为这是不可能的。
  • 不用raw_input也能做到吗?
  • 查看select module
【解决方案3】:

有一些建议将 select() 用于标准输入,但似乎它们并没有解决主要问题。使用 select,假设本地用户正在输入一行,并且在此过程的中间您的程序输出另一个用户消息,并且本地输入的编辑将被搞砸。要么您不允许在输入当前消息时显示新消息(为什么?),要么屏幕混乱。如果您在终端中执行此操作,您应该使用curses 或更强大的工具;使用 curses 您至少可以将输入和输出拆分到不同的屏幕区域。当然,如果您的情况允许,图形库(如wxWidgets)甚至更适合用户界面。

【讨论】:

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