Сокетная связь сервера с двумя разными приложениями, Java - PullRequest
1 голос
/ 05 апреля 2011

Я пишу код для сервера, который помог бы двум разным приложениям на разных платформах общаться друг с другом. Чтобы визуализировать это немного, это будет примерно так:

App1 <------> Сервер <------> App2

Что сервер делает, так это выдает var1 из app2, записывает его в app1, затем читает var2 из app1 и записывает в app2. Как это:

while(true){<br> var1 = app2stream.readInt();<br> app1stream.writeInt(var1);<br> var2 = app1stream.readDouble();<br> app2stream.writeDouble(var2);<br> }

Моя проблема в том, что в какой-то момент у меня есть этот код на моем сервере:

app1.accept();<br> app2.accept();

Это означает, что независимо от того, что и с учетом того факта, что сервер всегда работает, app1 - это тот, который должен подключаться первым, поскольку app1.accept () является методом блокировки.

Есть ли способ обойти это? Было бы здорово разрешить двум приложениям подключаться к серверу независимо от того, кто «пришел» первым, а затем ждать, пока сервер продолжит выполнение вышеуказанного кода. Могу ли я использовать потоки только для части accept (), а затем передать потоки другому потоку? Я немного читал о каналах, но меня это немного озадачило, любые примеры были бы хороши.

Ответы [ 4 ]

1 голос
/ 05 апреля 2011

Использование NIO

Позволяет делать неблокирующие сокеты (в том числе принимать), используя класс Selector.

По сути, это дает вам гораздо больше встроенного доступа к системным библиотекам и возможность обрабатывать ваши задачи без многопоточности.

1 голос
/ 05 апреля 2011

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

0 голосов
/ 05 апреля 2011

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

Я полагаю, что альтернативой является создание нескольких потоков, каждый из которых прослушивает разные порты.Я никогда не пытался это сделать, я не уверен, что один из них заблокируется, пока не будет установлено соединение, и поэтому вы никогда не попадете в другой поток.

0 голосов
/ 05 апреля 2011

Вы, вероятно, должны относиться к ним обоим одинаково, если они не скажут иначе.

Например, когда каждый соединяемый сокет отправляет «какой клиент?» сообщение.

Затем проверьте, отвечает ли клиент 1 или 2.

Если оба отвечают 1 или что-то, просто отключите оба.

...