2014-02-08 75 views
1

我試圖實現一個使用Twisted的聊天服務器,但是難以將存儲在factory.clients中的當前會話與唯一用戶ID(存儲在數據庫中)配對。在下面的代碼中,我假設新連接的用戶在加入服務器後立即發送其用戶ID。有了這個假設,我將factory.clients中的最後一個條目作爲其連接的索引並將其存儲在數據庫中。這種方法存在很多缺陷,我試圖確定一個更好的方法。Twisted - 在factory.clients中與唯一ID匹配的當前連接

我的主要問題:什麼是將唯一用戶ID與連接進行配對的最佳方式?

class ChatPlace(Protocol): 
def connectionMade(self): 
    self.factory.clients.append(self) 
    print "clients are ", self.factory.clients 
    print "connection from", self.transport.getPeer().host 

def connectionLost(self, reason): 
    self.factory.clients.remove(self) 

    def dataReceived(self, data): 

     #Variables and data parsing logic removed for brevity 

     #The cur_connect_idx should be mapped to factory.clients but I'm not sure of the best way 
     cur_connect_idx = len(self.factory.clients)-1 

     #Once the client_id can be properly accessed, I want to store info as follows so that a connection can be paired with a user_id 
     sql = "INSERT INTO user_db(user_id, user_name,cur_connect_idx) VALUES('%s','%s', '%d')" % (self.name, self.transport.getPeer().host,'',client_id) 

    #Remaining code omitted for brevity 

回答

1

爲什麼你需要把連接ID放入數據庫?

數據庫是你保存的地方持續狀態。連接和連接ID是暫態。

當你找出連接代表的是哪個用戶時,把這些信息放到工廠的數據結構中(或其他長壽命對象)。

例如:

def dataReceived(self, data): 
    username = self._parseAndExtractUsername(data) 
    if username is not None: 
     self.factory.users[username] = self 

現在你對工廠的字典,所有的協議實例,它映射到的用戶名協議實例之間共享。

+0

我不認爲我實際上需要數據庫中的連接ID,但這是我認爲可以解決將持久數據庫信息與瞬態用戶連接配對的問題的方式。我瀏覽了一些教程,但從未遇到任何與持久存儲配對的東西。你如何完成將用戶連接置入「工廠數據結構」? – CaptainIowa

+0

進一步補充說,我目前的範例是使用以下結構向服務器發送消息:<用戶ID,聊天文本,收件人用戶ID>。收到消息後,應使用收件人用戶標識映射到其當前服務器連接。 – CaptainIowa

+0

嗨!我不會爲你寫程序,對不起。對於我給出的答案有什麼不清楚的地方嗎?我認爲它包含解決您的問題所需的所有部分。謝謝! –