Java-сокет, привязка к локальному порту

Я пытаюсь привязать сокет на стороне клиента к любому конкретному локальному порту, в этом коде я использовал 20000.

нормальные соединения, такие как ниже, работают нормально. Но не позволяет мне выбрать локальный порт.

hostSocket = new Socket(host,80);

поэтому я попробовал это:

hostSocket = new Socket(host, 80, InetAddress.getLocalHost(), 20000);

и так:

hostSocket = new Socket();
hostSocket.bind(new InetSocketAddress("localhost", 20000));
hostSocket.connect(new InetSocketAddress(host,80));

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

java.net.SocketException: Invalid argument or cannot assign requested address
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:327)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:193)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:180)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:384)
at java.net.Socket.connect(Socket.java:546)
at java.net.Socket.connect(Socket.java:495)
at com.mb.proxy.netflix.NetflixPrefetchingAgent.connect(NetflixPrefetchingAgent.java:98)
at com.mb.proxy.netflix.NetflixPrefetchingAgent.run(NetflixPrefetchingAgent.java:164)
at java.lang.Thread.run(Thread.java:679)
Exception in thread "Thread-19" java.lang.NullPointerException
at com.mb.proxy.netflix.NetflixPrefetchingAgent.prefetchChunk(NetflixPrefetchingAgent.java:272)
at com.mb.proxy.netflix.NetflixPrefetchingAgent.run(NetflixPrefetchingAgent.java:176)
at java.lang.Thread.run(Thread.java:679)

2 ответов


вы должны привязаться к внешнему (исходящему) IP-адресу вашего компьютера, а не к localhost (127.0.0.1).

следующие работы на моем ящике без проблем:

Socket s = new Socket();
s.bind(new InetSocketAddress("172.16.1.102", 5000));
s.connect(new InetSocketAddress("google.com", 80));

здесь 172.16.1.102 - это частный сетевой адрес NAT, назначенный этому окну через DHCP с моего маршрутизатора.


ответ Брайана находится на месте в определении проблемы.

однако вам не нужен IP-адрес исходящего интерфейса, потому что вы можете просто указать 0.0.0.0 на "любой адрес". Правильный исходящий интерфейс будет выбран автоматически. Это очень похоже на то, когда вы подключаетесь без привязки.

кроме того,самый простой способ, чтобы указать 0.0.0.0 поскольку адрес должен опустить параметр.

таким образом:

hostSocket = new Socket();
hostSocket.bind(new InetSocketAddress(20000));
hostSocket.connect(new InetSocketAddress(host, 80));