2016-08-24 47 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容量和寿命的项目决定。

相关问题