我想創建處理在同一時間大量客戶的服務器(處理:從客戶端接收數據,並在同一時間將數據發送到所有客戶端!)Python的插座,高級聊天框
其實我試圖創建一個聊天框。該程序將這樣工作:
1)將有一個服務器來處理客戶端。
2)多個客戶端可以加入服務器。
3)客戶端發送消息(字符串)到服務器。
4)服務器從客戶端收到消息,然後發送給除客戶端以外的客戶端的所有 客戶端。
這就是客戶之間如何溝通。沒有私人信息可用。當有人點擊輸入時,所有的客戶端都會在他們的屏幕上看到消息。
客戶端模塊很容易製作,因爲客戶端只與一個套接字(服務器)通信。
從另一方面的服務器模塊是非常複雜的,我不知道該怎麼做(我也知道線程)。
這是我atempt:
import socket, threading
class Server:
def __init__(self, ip = "", port = 5050):
'''Server Constructor. If __init__ return None, then you can use
self.error to print the specified error message.'''
#Error message.
self.error = ""
#Creating a socket object.
self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#Trying to bind it.
try:
self.server.bind((ip, port))
pass
#Failed, because socket has been shuted down.
except OSError :
self.error = "The server socket has been shuted down."
return None
#Failed, because socket has been forcibly reseted.
except ConnectionResetError:
self.error = "The server socket has been forcibly reseted."
return None
#Start Listening.
self.server.listen()
#_____Other Variables_____#
#A flag to know when to shut down thread loops.
self.running = True
#Store clients here.
self.clients = []
#_____Other Variables_____#
#Start accepting clients.
thread = threading.thread(target = self.acceptClients)
thread.start()
#Start handling the client.
self.clientHandler()
#Accept Clients.
def acceptClients(self):
while self.running:
self.clients.append(self.server.accept())
#Close the server.
self.server.close()
#Handle clients.
def clientHandler(self):
while self.running:
for client in self.clients:
sock = client[0]
addr = client[1]
#Receive at most 1 mb of data.
#The problem is that recv will block the loop!!!
data = sock.recv(1024 ** 2)
正如你所看到的,我使用一個線程,因此server.accept()不會阻止此程序接受客戶端。然後我將客戶存儲到一個列表中。但是問題出在clientHandler。我怎樣才能同時接收所有 客戶?第一次recv會阻止循環!
我也嘗試爲每個新客戶端 啓動新線程(clientHandlers),但問題是同步。
那麼發送呢?服務器必須將數據發送給所有客戶端,因此clientHandler尚未完成。但如果我混合方法recv和發送然後問題變得更加複雜。
那麼做到這一點的最佳方法是什麼? 我也想給我一個例子。
我真的很感謝你!我無法通過我自己找到答案。我在Python中學習套接字超過一年,而且我的水平還很低。現在我繼續前進! 我會用結果發佈答案。我想告訴我是否有問題。 – babaliaris