【发布时间】: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
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:线程、网络和 Python - Python技术站