【问题标题】:s.sendall doesn't work inside a thread in pythons.sendall 在 python 的线程中不起作用
【发布时间】:2015-05-22 19:32:43
【问题描述】:

我正在尝试用 python 开发一个聊天程序。我希望它有多个客户端,所以我使用线程来处理这个。但是,当我尝试将消息发送到所有连接的客户端时,服务器仅将其发送给发送消息的客户端。我不确定我是否只是遗漏了一些明显的东西,但这里是服务器的代码:

import socket
from thread import *

host = '192.168.0.13'
port = 1024
users = int(input("enter number of users: "))

def clienthandler(conn):
    while True:
        data = conn.recv(1024)
        if not data:
            break
        print data
        conn.sendall(data)
    conn.close()


serversock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversock.bind((host, port))
serversock.listen(users)

for i in range(users):
    conn, addr= serversock.accept()
    print 'Connected by', addr
    start_new_thread(clienthandler, (conn,))

这是客户端的代码:

import socket

host = '192.168.0.13'
port = 1024

usrname = raw_input("enter a username: ")
usrname = usrname + ": "
clientsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientsock.connect((host, port))

while True:
    x = raw_input('You: ')
    x = usrname + x
    clientsock.sendall(x)
    data = clientsock.recv(1024)
    print data

【问题讨论】:

  • 因为你告诉他要为写信的人服务(通过将conn 传递给start_new_thread)。

标签: python multithreading sockets


【解决方案1】:

sendall 中的“全部”表示它会发送您要求它发送的所有数据。这并不意味着它通过多个连接发送它。这样的界面是完全不切实际的。例如,如果另一个线程正在其中一个连接上发送其他内容,会发生什么情况?如果其中一个连接的队列已满,会发生什么情况?

sendall:向套接字发送数据。套接字必须连接到远程套接字。可选的 flags 参数与上面的 recv() 具有相同的含义。 与 send() 不同,此方法继续从字符串发送数据,直到发送完所有数据或发生错误。 成功时不返回任何内容。出错时会引发异常,并且无法确定成功发送了多少数据(如果有)。 -- 17.2. socket

【讨论】:

  • 好的,谢谢您解决这个问题。我将如何将其发送到所有连接
  • @PeterMills 您必须编写代码来管理线程的并发性。您可能需要一个等待每个连接发出的消息队列,并受某种同步保护。它必须有多复杂取决于您的要求有多复杂。如果您不在乎一个客户端接收数据不够快是否会导致整个服务器停顿,您可以简化设计。但是你需要真正编写代码来做这些事情。
【解决方案2】:

您可以尝试通过拉出用户列表并对其进行迭代,然后单独发送相同的消息,但是,除非您是管理员并且想要广播警告,否则此功能将非常普通。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 2015-03-03
    • 2014-09-29
    • 2012-11-29
    相关资源
    最近更新 更多