У нас была похожая ситуация с одним из созданных нами инструментов (я не работал над ним напрямую, но решение, кажется, работает нормально).Каждый раз, когда мы получали клиента, мы сохраняли соответствующую информацию в классе (аналогичном классу StateObject в примере) и добавляли этот класс в ArrayList (который работает нормально), но я полагаю, что более удачным решением было бы хранить классы в словаре.:
http://msdn.microsoft.com/en-us/library/xfhwa508.aspx
Класс Dictionary позволяет сопоставить ключ с объектом.Это позволяет легко получать доступ к объектам с помощью уникального ключа.Таким образом, при получении нового клиента вы можете создать идентификатор для этого клиента любым удобным для вас способом (это может быть просто целое число, которое увеличивается при каждом подключении клиента), создать класс объекта состояния и сохранить необходимую информацию в этом классе.затем добавьте пару слов «Класс ключей» в словарь, так что-то похожее на:
// Global definition of Client dictionary
// The first argument within <> is the key type, the second argument
// is the type of object that key will map to
Dictionary<int, StateObject> Clients = new Dictionary<int, StateObject>();
// Accept client callback
public static void AcceptCallback(IAsyncResult ar)
{
// Get the socket that handles the client request.
Socket listener = (Socket) ar.AsyncState;
Socket handler = listener.EndAccept(ar);
StateObject client = new StateObject();
// Then set all the variables of client here
Clients.Add(ID, client);
}
Примечание. Однако, если вы хотите создать свои идентификаторы, они должны быть уникальными для каждой записи в Словаре.
Мой совет - хранить обработчик для каждого принятого клиента сокета в StateObject.Таким образом, у вас всегда есть доступ к дескриптору, который может отправлять информацию каждому отдельному подключенному клиенту (именно так мы сделали это с нашим Tcp-соединением, мы сохранили TcpClient и его основной поток в нашем классе StateObject, а затем связались с каждым клиентом через этипеременные. Я предполагаю, что это возможно и с сокетами?)
Теперь, когда вся информация сохранена, вы можете использовать ключи ID в словаре, чтобы определить, с какими клиентами связываться.Использование LINQ дает вам замечательную команду выбора в одну строку:
// Selects state objects from Clients dictionary where ID has a value greater than 5
IEnumerable<StateObject> Clients.Where(c => c.Key > 5).Select(c => c.Value);
(я думаю, что это правильный запрос LINQ, но он нуждается в проверке, по сути, это говорит о выборе каждого StateObject из списка клиентов, где идентификаторбольше 5)
Если вы не хотите, чтобы идентификаторы идентифицировали клиентов таким образом, вы можете перебрать каждый StateObject в словаре и проверить внутренние переменные, чтобы увидеть, отправляете ли вы клиенту сообщение или нет.Что-то вроде:
foreach (StateObject client in Clients.Values)
{
if (client.ImportantVariable == true)
// Send client information via socket here
}
Вам решать, какой метод лучше всего соответствует вашим потребностям.Надеюсь, что это помогает и является жизнеспособным решением для вас.