Java Sockets - убедитесь, что одно клиентское соединение обслуживается раньше других - PullRequest
0 голосов
/ 24 августа 2011

У меня есть несколько клиентских TCP-сокетов, подключающихся к серверному сокету.Ничего необычного в этом нет.По этим сокетам периодически поступают данные, которые должны обрабатывать сокеты сервера.В течение некоторых периодов будет происходить почти непрерывный поток данных от клиентов к серверу.

Моя проблема заключается в том, что мне нужно убедиться, что данные, поступающие по одному соединению с сокетом, обслуживаются сервером до поступления данныхот других.Только после того, как больше не будет данных об этом «специальном» соединении, я должен читать данные от других клиентов.

Сейчас у меня есть подход потока к клиенту, который я не считаю лучшимрешение для моего случая.То, что связано с быстрым «специальным» соединением, является новым требованием.Итак, сейчас я ищу способы удовлетворить это требование без переписывания обработки сокетов, которая у меня уже есть.

Есть предложения?Большое спасибо.

Ответы [ 2 ]

1 голос
/ 24 августа 2011

Вам нужно будет реализовать какой-то алгоритм планирования / качества обслуживания.В простейшей форме это действительно может быть просто «пока есть данные в специальном сокете, не беспокойтесь о других сокетах».

Эта простая модель может быть реализована, например, с помощью двух списков:

  1. Один список специальных сокетов
  2. Один список обычных сокетов.

Один работник читает сокеты и записывает в очередь.После считывания небольшого количества байтов он проверяет, есть ли в данных специальные сокеты.Если это так, сначала прочитайте специальные сокеты, только после продолжения с другими сокетами.Хитрость заключается в чтении данных в достаточно маленьких порциях, чтобы иметь возможность переключаться достаточно быстро, но не слишком мало, чтобы потерять всю эффективность.Вот как работает планирование для процессоров.

Имейте в виду, что при чтении только специальных сокетов, если в специальных сокетах есть данные, другие сокеты могут вообще не считываться.Если вы не хотите этого, рассмотрите алгоритмы планирования, такие как Взвешенная справедливая организация очередей или Взвешенная циклическая перестановка .

0 голосов
/ 24 августа 2011

Как отметил @Konerak, вам придется реализовать некоторую форму QoS.

Вы можете попытаться определить тип данных для сообщений, с которыми вы их инкапсулируете, а затем добавить тег, чтобы аннотировать, что определенное сообщение являетсяопределенного вида (как ваша специальная розетка).Затем, когда сервер получает сообщение, вы можете вставить сообщение в очередь, где вы начинаете выполнение.Сначала выполните все сообщения, помеченные как «специальные» (или то, что вы хотите использовать), а затем перейдите ко всем сообщениям без тега.Очередь (FIFO) гарантирует, что все сообщения будут обработаны так, как они были получены.Обязательно посмотрите метод очереди * Peek (http://download.oracle.com/javase/1,5.0/docs/api/java/util/Queue.html).

Это может работать как быстрое исправление с минимальным изменением кода, но это может открыть целый ряд проблем.,А именно Память, ссылаясь на размер очереди, поскольку другие сообщения не будут удалены, пока специальные сообщения не будут обработаны.

Вы также можете сохранить метод «Поток на клиента».Это вполне нормально в небольшой среде с подключенной парой клиентов, но когда вы начнете масштабироваться до больших номеров, вам, возможно, придется подумать об использовании NIO.Но, как я уже сказал, оба являются подходящими подходами, каждый из которых имеет свои плюсы и минусы.

Просто идея и пара вещей, которые нужно учитывать.

...