2013-07-21 2 views
0

У меня возникли проблемы с использованием сокетов в java. Прежде всего, позвольте мне объяснить, что я хочу делать с сокетами в java. Я хочу подключить свой ноутбук через Интернет через него. У моего ноутбука есть сервер, и клиент должен подключиться через Интернет. Поскольку у меня есть маршрутизатор для работы с моей локальной сетью, и я не хочу вести порт на маршрутизаторе к моему ноутбуку, мне нужно следовать по пути «Интернет-> маршрутизатор-> локальная сеть-> mylaptop». Проблема в том, что я нашел способ использовать как интернет-IP-адрес, так и локальный IP-адрес; Тем не менее, он бросает исключение: "Exception in thread "main" java.net.BindException: Address already in use"Ошибка Java Socket Bind

Код Стараюсь является:

InetAddress addr = InetAddress.getByName("XXX.XXX.XXX.XXX"); 
InetAddress local = InetAddress.getByName("YYY.YYY.YYY.YYY"); 
Socket socket = new Socket(addr, 1111, local, 1111); // The line I have got exception 

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

Socket socket = new Socket("XXX.XXX.XXX.XXX", 1111); 

* Xs для интернет-ip-адреса

* Подставка под открытым небом для местного ip-адреса

* Коды относятся к клиентской стороне кода

ответ

2

Насколько я понимаю, у вас есть маршрутизатор с Интернетом (WAN) IP XXX.XXX.XXX.XXX с NAT, и у вас есть ноутбук с локальным (LAN) IP YYY.YYY.YYY.YYY подключен к маршрутизатору, и вы предполагаете, что

Socket socket = new Socket(InetAddress.getByName("XXX.XXX.XXX.XXX"), 1111, InetAddress.getByName("YYY.YYY.YYY.YYY"), 1111); 

будет подключаться к компьютеру. Это неверно.

Документация конструктора Socket класса вы используете говорит:

Создает сокет и связывает его с указанным удаленным хостом на указанный удаленный порт. Сокет также привяжет() к локальному адресу и порту.

То, что не Что угодно.

Вы не можете подключиться к устройству, расположенному за NAT, как это. Вы должны «вести порт на маршрутизаторе».

+0

Хорошо, что у вас есть смысл. Однако, что, если я не хочу вести порт на маршрутизаторе? –

0

Вам не нужно указывать местный адрес: порт сокета, и вы делаете это неправильно. Удалите последние два параметра.