2016-08-24 45 views
0

我想就如何解決我遇到的問題發表意見。連接到現有的工人/任務?

比方說,我有一個服務器和一個客戶端。

客戶端A連接,並要求服務器產生一個新的線程從1數到9999讓我們稱此主題A.

客戶端B連接,並要求服務器產卵另一個線程遞減計數從9999到1我們叫這個線程B.

線程A發送調用客戶端當前計數的更新(即線程A更新客戶端A,線程B更新客戶端B)。

客戶端A然後斷開連接並重新連接 - 我的問題是,我如何「重新訂閱」當前線程並繼續獲取更新?

是否有任何現有的庫來幫助完成這些任務?

更新:多一點澄清,如果有幫助:

這些服務器線程將繼續在後臺運行。例如,客戶端將連接到服務器並啓動任務 - 此任務將消息發送回客戶端。用戶知道任務已經開始,因爲他們的客戶正在接收消息。用戶斷開客戶端,但任務仍在後臺處理。用戶決定檢查任務,以便再次啓動客戶端並連接到服務器。最後一句話是我想要實現的。我不明確的道歉。

+0

爲什麼你需要訂閱相同的線程?如果連接到服務器的許多客戶端會產生大量的線程,那麼服務器將完全無法響應呢? – galenus

+0

我想我正在嘗試使用我試圖實現的一個示例 - 基本上重新訂閱「任務」並繼續獲取更新。 – TotalApproved

+0

你的架構應該是線程不可知的。即每個線程(例如,來自線程池)應該能夠從前一線程離開的位置選擇工作並繼續處理。但是,您的問題包含的信息太少。例如,分配給服務器線程的是哪種工作負載?它僅在客戶端連接時才被處理,還是持續後臺進程? – galenus

回答

1

爲了解決你的問題,試試這個:

給服務器一個noticication斷開 當「驗證」與創建和發送到服務器,而第一連接和艾威重新連接一個GUID。

服務器獲取GUID,將它們保存到列表中,並在每個連接上查找服務器獲取GUID,查找現有條目,如果有條目,則知道客戶端已連接。如果不是,則客戶端尚未連接,所以服務器必須創建一個新線程。

相反GUID的,您可以使用所有其他唯一的ID(如MAC,校驗通過硬件等)

0

這是什麼可以做一個抽象的例子。由於該問題沒有指定具體的API,我將使用構成的名稱和類。

爲了識別客戶端,我們將使用一些獨特的識別令牌,我們稱之爲ClientToken。令牌將在第一個客戶端連接上分配。它將被返回給客戶端進行進一步驗證,並且服務器也將使用它來處理任務的跟蹤。

跟蹤部分是從令牌到任務數據的一些字典。任務數據是一對任務和它的消息隊列:

private readonly ConcurrentDictionary<ClientToken, TaskData> m_tasks; 

class TaskData 
{ 
    public Task ProcessingTask { get; set; } 
    public BlockingCollection<Message> TaskMessages { get; } = 
     new BlockingCollection<Message>(); 
} 

假設客戶端A通過連接任何手段服務器。這需要連接照顧的部分看起來像:

//this is a kind of event handler, we should'n 'await' on it 
async void OnClientConnectedAsync(Client client) 
{ 
    var token = client.GetToken(); 
    TaskData taskData; 
    if (token != null && m_tasks.TryGetValue(token, out taskData)) 
    { 
     await ProcessMessagesAsync(taskData); 
    } 
    else 
    { 
     taskData = new TaskData(); 
     token = GenerateUniqueTokenBasedOnTheClientParameters(client); 
     await client.SetTokenAsync(token); 

     if (m_tasks.TryAdd(token, taskData)) 
     { 
      taskData.ProcessingTask = 
       InitProcessingTask(
        taskData.Messages, //will be used by the 
        client); 

      await ProcessMessagesAsync(taskData); 
     } 
    } 
} 

async Task ProcessMessagesAsync(TaskData taskData) 
{ 
    while (client.IsConnected) 
    { 
     var message = taskData.Messages.Take(); 
     await client.SendAsync(message); 
    } 
} 

你應該在Messages容量和壽命的項目決定。

相關問題