【问题标题】:Thread, Network and Python线程、网络和 Python
【发布时间】:2023-04-01 23:58:01
【问题描述】:

我正在尝试创建一个连接两台(或更多)计算机的小聊天程序,所以我尝试了这个:

    import socket

    tcpSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

    tcpSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)

    tcpSocket.bind(("0.0.0.0",8000))

    tcpSocket.listen(3)

    print "Waiting for a Client ... "
    (client, (ip,sock)) = tcpSocket.accept()

    print "Received connection from : ",ip

    print "Starting ECHO output ..."

    data = 'dump'

    client.send("Enter you're name : ")
    name=client.recv(1024)
    name=name.strip()

    while len(data) :
        send_data = raw_input("Me : ")
        try :
            client.send("Server : "+send_data)
            client.send("\n"+name+" : ")
        except :
            print "Connection lost !"
            break
        data = client.recv(2048)
        data = data.strip()
        print name+" : "+data

    print "Closing connection ..."
    client.close()

    print "Shutting down server ..."
    tcpSocket.close()

而且效果很好,唯一的问题是我不能将一台以上的计算机连接到服务器!我使用这个函数尝试了线程模块:

import socket
import thread

def thread_send() :



print "Received connection from : ",ip

    print "Starting ECHO output ..."

    data = 'dump'

    client.send("Enter you're name : ")
    name=client.recv(1024)
    name=name.strip()

    while len(data) :
        send_data = raw_input("Me : ")
        try :
            client.send("Server : "+send_data)
            client.send("\n"+name+" : ")
        except :
            print "Connection lost !"
            break
        data = client.recv(2048)
        data = data.strip()
        print name+" : "+data


tcpSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

tcpSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)

tcpSocket.bind(("0.0.0.0",8000))

tcpSocket.listen(5)

print "Waiting for a Client ... "

(client, (ip,sock)) = tcpSocket.accept()

for i in range(5) :

    thread.start_new_thread(thread_send,())

while True :
    pass

print "Closing connection ..."
client.close()

print "Shutting down server ..."
tcpSocket.close()

但它不起作用:/

【问题讨论】:

  • 调用这个函数的驱动程序在哪里?基本上,您在主线程上调用“接受”并将新连接/套接字传递给新线程。
  • 好的,谢谢,所以我尝试在函数外调用“accept”,但现在客户端连接到五个线程,但我想要的是 5 个客户端连接到一个服务器:/(我编辑了我的帖子显示整个代码!)
  • 不,它不会那样工作。 1)在while循环中运行accept(对于多个客户端)。 #2) 每次接受返回时,启动一个新线程并将新的套接字(客户端)和其他所需的详细信息(ip 和 sock)传递给它。 #3) 如何完成一个线程服务连接取决于你的方式。
  • 在您的情况下,每次获得连接时,您都会启动 5 个线程,这是不正确的。您需要为每个连接启动 1 个线程(注意:如果您打算在任何类型的可扩展应用程序中使用它,则不适合)
  • 这就是问题所在,我该怎么做?我是线程和东西的新手!所以请原谅我缺乏知识:p

标签:
python
multithreading
networking