Подключите два клиентских сокета - PullRequest
13 голосов
/ 05 апреля 2010

Допустим, у Java есть два вида сокетов:

  • серверные сокеты "ServerSocket"
  • клиентские розетки или просто "Сокет"

Представьте себе ситуацию двух процессов:

X = Клиент
Y = Сервер

Серверный процесс Y: имеет «ServerSocket», который прослушивает порт TCP
Клиентский процесс X: отправляет запрос на соединение через «сокет» Y.

Y: Затем метод accept() возвращает новый тип клиента "Socket",
когда это происходит, два сокета становятся «взаимосвязанными»,

Итак: сокет в клиентском процессе, связан с сокетом в серверном процессе.
Тогда: чтение / запись через сокет X похоже на чтение / запись через сокет Y.
Теперь два клиента сокета соединяются !!

Но ...
Что если я создаю два клиентских сокета в одном процессе, и я хочу, чтобы они были "взаимосвязаны"?

... даже возможно?

Скажем, как соединить два клиентских сокета, не используя промежуточный ServerSocket?

Я решил это, создав два потока для постоянного чтения A и записи B, и другое для чтения B и записи A ...
Но я думаю, что может быть лучше ... (Эти энергозатратные потоки не нужны в подходе клиент-сервер)

Любая помощь или совет будут оценены !! Спасибо


Edit:

Пример приложения: «Существующее серверное приложение может быть преобразовано в клиентское», Например, сервер VNC, один клиентский сокет подключается к серверу VNC, а другой клиентский сокет создается (для подключения к промежуточному серверу), затем приложение соединяет два клиента, в результате чего сервер VNC является клиентским приложением! И тогда, публичный IP не нужен.

VNCServer --- MyApp ---> | middle server | <--- Пользователь </p>

Ответы [ 12 ]

0 голосов
/ 15 июня 2010

В C вы можете вызвать socketpair (2) , чтобы получить пару подключенных сокетов, но я не уверен, есть ли в Java встроенный способ сделать то же самое.

0 голосов
/ 08 июня 2010

Зачем нам средний сервер? Если вы просто хотите выставить VNCServer. Почему бы не попробовать архитектуру, подобную следующей

VNCServer(S) <-> (C)MyApp(S) <-> (C) User

(S) represents a server socket
(C) represents a client socket

В этом случае MyApp действует как клиент (для VNCServer) и как сервер (для пользователя). Таким образом, вам придется реализовать клиентские и серверные сокеты в MyApp, а затем передавать данные.

Редактировать: Для связи с VNCServer MyApp необходимо знать IP-адрес VNCServer. Пользователь будет общаться только с MyApp и должен знать только IP-адрес MyApp. Пользователю не нужен IP-адрес VNCServer.

...