Приложение чата на Java через Интернет | ConnectException (истекло время ожидания соединения)

Я пытаюсь разработать базовое приложение для чата. Я написал необходимые коды как для сервера, так и для клиента, и приложение отлично работает в локальной сети. Однако когда я попытался заставить его работать через Интернет, я застрял. Я узнал, что мне нужно сделать переадресацию портов на сервере, и я сделал это. Я перенаправил порт 6000, и canyouseeme.org дал успешное сообщение. Таким образом, порт, безусловно, открыт, и никакой брандмауэр не блокирует его. Однако клиентский код не может подключиться к нему.

Код сервера открывает ServerSocket следующим образом (их определения сделаны ранее):

InetAddress IP = InetAddress.getLocalHost();
welcomeSocket = new ServerSocket(6000, 10, IP);
connectionSocket = welcomeSocket.accept();

И клиентский код пытается подключиться к нему, в основном используя следующий код:

clientSocket = new Socket("xx.xxx.xxx.xx", 6000);

где xx.xxx.xxx.xx - это IP-адрес сервера (не локальный с 192.168.xx).

Это проблема с Java? Я спрашиваю, потому что порт 6000, очевидно, открыт и canyouseeme.org может успешно подключиться к нему, но мой клиент не может это сделать. Почему такое происходит? Любая помощь будет принята с благодарностью (для получения дополнительной информации, пожалуйста, прочитайте комментарии ниже).

Сообщение об ошибке ниже:

java.net.ConnectException: Connection timed out: connect
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
    at java.net.Socket.connect(Socket.java:519)
    at java.net.Socket.connect(Socket.java:469)
    at java.net.Socket.<init>(Socket.java:366)
    at java.net.Socket.<init>(Socket.java:180)
    at ChatPanel$ConnectButtonListener.actionPerformed(ChatPanel.java:206)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
    at java.awt.Component.processMouseEvent(Component.java:6038)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
    at java.awt.Component.processEvent(Component.java:5803)
    at java.awt.Container.processEvent(Container.java:2058)
    at java.awt.Component.dispatchEventImpl(Component.java:4410)
    at java.awt.Container.dispatchEventImpl(Container.java:2116)
    at java.awt.Component.dispatchEvent(Component.java:4240)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
    at java.awt.Container.dispatchEventImpl(Container.java:2102)
    at java.awt.Window.dispatchEventImpl(Window.java:2429)
    at java.awt.Component.dispatchEvent(Component.java:4240)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

1 ответ

Решение

На клиенте вы должны использовать

clientSocket = new Socket(InetAddress.getByAddress(addr), port);

где addr это публичный адрес сервера и port сервер связан с.

Другие вопросы по тегам