2013-05-25 5 views
0

У меня есть сервер java nio с адресом ip 192.168.0.1, прослушивающий порт 80. Я настроил этот сервер для привязки к нескольким именам доменов/хостов, скажем, server1, server2, server3 все разрешено как 192.168.0.1.Java Server Socket, связывающий несколько имен доменов/хостов

Теперь я надеюсь, что если клиент подключится к серверу 1, на стороне сервера, я могу узнать, что клиент подключается к server1 вместо других имен или прямого ip-адреса, так что я могу сделать что-то особенное, и если клиент подключается к серверу2, я могу узнать, что клиент запрашивает server2, поэтому я могу сделать что-то еще особенное и так далее.

Теперь возникает вопрос: кажется, на стороне сервера, я не могу легко получить правильную информацию, к которой подключается имя моего клиента.

У меня есть код последующие:

ServerSocketChannel ssChannel = (ServerSocketChannel) selKey.channel(); 
String boundHost = sChannel.socket().getLocalAddress().getHostName(); 

Но это не работает, boundHost всегда сервер1 даже если клиенты подключаются к server2 или сервере3.

ответ

3

Вы не можете получить такую ​​информацию из сокетов: сокеты не знают о именах хостов, только IP-адресах.

Если вы примете пример HTTP, то отличием хоста от другого является заголовок Host в заголовке HTTP.

Таким образом, вы можете различать только разные серверы, если используемый вами протокол имеет в нем информацию о имени хоста.

+0

Спасибо fge за ответ. Итак, есть ли вероятность, что Java или даже C могут получить эту информацию? На самом деле я надеюсь создать мультиплексор/прокси-сервер уровня TCP. Я знаю, что Apache2 имеет прокси-модуль, который фактически взламывает протокол, чтобы получить эту информацию. Но я не хочу этого делать. Я надеюсь сделать его полностью прозрачным из протоколов верхнего уровня. –

+0

Или это просто технически абсолютно невозможно? Благодарю. –