Openshift java.net.SocketException: разрешение отклонено

Я использую Java8 и имею сервер чата, который отлично работает на моем localhost, но когда я развертываю его на сервере OpenShift, я получаю следующую ошибку:

java.net.SocketException: разрешение отклонено

2016-09-05 10:36:11,300 INFO  [stdout] (Thread-125) Starting Chat server on localhost:8000 ...
2016-09-05 10:36:13,194 ERROR [stderr] (Thread-125) Exception in thread "Thread-125" java.net.SocketException: Permission denied
2016-09-05 10:36:13,194 ERROR [stderr] (Thread-125)     at sun.nio.ch.Net.bind0(Native Method)
2016-09-05 10:36:13,195 ERROR [stderr] (Thread-125)     at sun.nio.ch.Net.bind(Net.java:433)
2016-09-05 10:36:13,195 ERROR [stderr] (Thread-125)     at sun.nio.ch.Net.bind(Net.java:425)
2016-09-05 10:36:13,195 ERROR [stderr] (Thread-125)     at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
2016-09-05 10:36:13,195 ERROR [stderr] (Thread-125)     at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
2016-09-05 10:36:13,196 ERROR [stderr] (Thread-125)     at io.netty.channel.socket.nio.NioServerSocketChannel.doBind(NioServerSocketChannel.java:125)
2016-09-05 10:36:13,196 ERROR [stderr] (Thread-125)     at io.netty.channel.AbstractChannel$AbstractUnsafe.bind(AbstractChannel.java:476)
2016-09-05 10:36:13,196 ERROR [stderr] (Thread-125)     at io.netty.channel.DefaultChannelPipeline$HeadHandler.bind(DefaultChannelPipeline.java:1000)
2016-09-05 10:36:13,196 ERROR [stderr] (Thread-125)     at io.netty.channel.DefaultChannelHandlerContext.invokeBind(DefaultChannelHandlerContext.java:463)
2016-09-05 10:36:13,197 ERROR [stderr] (Thread-125)     at io.netty.channel.DefaultChannelHandlerContext.bind(DefaultChannelHandlerContext.java:448)
2016-09-05 10:36:13,197 ERROR [stderr] (Thread-125)     at io.netty.channel.DefaultChannelPipeline.bind(DefaultChannelPipeline.java:842)
2016-09-05 10:36:13,197 ERROR [stderr] (Thread-125)     at io.netty.channel.AbstractChannel.bind(AbstractChannel.java:195)
2016-09-05 10:36:13,197 ERROR [stderr] (Thread-125)     at io.netty.bootstrap.AbstractBootstrap$2.run(AbstractBootstrap.java:338)
2016-09-05 10:36:13,198 ERROR [stderr] (Thread-125)     at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:370)
2016-09-05 10:36:13,198 ERROR [stderr] (Thread-125)     at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:353)
2016-09-05 10:36:13,198 ERROR [stderr] (Thread-125)     at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:116)
2016-09-05 10:36:13,198 ERROR [stderr] (Thread-125)     at java.lang.Thread.run(Thread.java:745)

Я просмотрел руководство по веб-сокетам OpenShift здесь, в котором говорится, что следует использовать порт 8000. Но я все еще получаю ошибку.

В Openshift я запускаю свой сервер чата на картридже WildFly Application Server 10.

Любые советы приветствуются.

Вот мой код:

WebAppInitializer.java

    try {
        new Thread() {
            public void run() {
                com.jobs.spring.chat.Server chatServer = new com.jobs.spring.chat.Server();
                chatServer.startServer();
            }
        }.start();
    } catch (Exception e) {
        e.printStackTrace();
    }

Server.java

import java.net.Socket;

import com.corundumstudio.socketio.AckRequest;
import com.corundumstudio.socketio.Configuration;
import com.corundumstudio.socketio.SocketIOClient;
import com.corundumstudio.socketio.SocketIOServer;
import com.corundumstudio.socketio.listener.ConnectListener;
import com.corundumstudio.socketio.listener.DataListener;
import com.corundumstudio.socketio.listener.DisconnectListener;
import com.fasterxml.jackson.databind.ObjectMapper;

/**
 * https://blog.openshift.com/paas-websockets/
 * @author Richard
 *
 */
public class Server {

    //private static final String SERVER = "localhost";
    private static final String SERVER = "jbosswildfly-easyjobs.rhcloud.com";
    private static final Integer PORT = 8000;

    public static void main(String[] args) {
        startServer();
    }

    public static void startServer() {
        Configuration config = new Configuration();
        config.setHostname(SERVER);
        config.setPort(PORT);
        final SocketIOServer server = new SocketIOServer(config);

        server.addConnectListener(new ConnectListener() {
            @Override
            public void onConnect(SocketIOClient client) {
                System.out.println("onConnected");
                client.sendEvent("chat_message:message", new Message("Welcome to the chat!"));
            }
        });

        server.addDisconnectListener(new DisconnectListener() {
            @Override
            public void onDisconnect(SocketIOClient client) {
                System.out.println("onDisconnected");
            }
        });

        server.addEventListener("chat_message:send", String.class, new DataListener<String>() {
            @Override
            public void onData(SocketIOClient client, String data, AckRequest ackSender) throws Exception {
                Message message = null;
                try {
                    message = new ObjectMapper().readValue(data.toString(), Message.class);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                message.setDate(System.currentTimeMillis());
                server.getBroadcastOperations().sendEvent("chat_message:message", message);
            }
        });

        System.out.println("Starting Chat server on " + SERVER + ":" + PORT+" ...");
        server.start();
        System.out.println("Chat server started");
        System.out.println("Chat server Environment Info: " + System.getenv());
        try {
            Socket socket = new Socket(SERVER, PORT);
            printSocketInformation(socket);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Prints debug output (to stdout) for the given Java Socket.
     */
    public static void printSocketInformation(Socket socket) {
        try {
            System.out.format("Port:                 %s\n", socket.getPort());
            System.out.format("Canonical Host Name:  %s\n", socket.getInetAddress().getCanonicalHostName());
            System.out.format("Host Address:         %s\n\n", socket.getInetAddress().getHostAddress());
            System.out.format("Local Address:        %s\n", socket.getLocalAddress());
            System.out.format("Local Port:           %s\n", socket.getLocalPort());
            System.out.format("Local Socket Address: %s\n\n", socket.getLocalSocketAddress());
            System.out.format("Receive Buffer Size:  %s\n", socket.getReceiveBufferSize());
            System.out.format("Send Buffer Size:     %s\n\n", socket.getSendBufferSize());
            System.out.format("Keep-Alive:           %s\n", socket.getKeepAlive());
            System.out.format("SO Timeout:           %s\n", socket.getSoTimeout());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

В этой ссылке OpenShift рассказывает о привязке портов и прокси. Я не очень понимаю все это. Похоже, я должен использовать порт 8000 (что я и делаю), но я не понимаю, какое имя хоста мне следует использовать. Я использую имя URL своего приложения (jbosswildfly-easyjobs.rhcloud.com). Это правильно?

Если я изменю адрес на http://jbosswildfly-easyjobs.rhcloud.com (т.е. префикс http://), я получу следующую ошибку:

java.net.SocketException: неразрешенный адрес

введите описание изображения здесь


person Richard    schedule 01.09.2016    source источник
comment
Вы получаете это исключение, когда делаете что?   -  person user207421    schedule 01.09.2016
comment
Это когда я запускаю сервер.   -  person Richard    schedule 01.09.2016
comment
Вы получаете это исключение при запуске сервера? Какая строка кода? Где трассировка стека? В чем собственно вопрос?   -  person user207421    schedule 03.09.2016
comment
Когда WebAppInitializer.java в приведенном выше примере запускает поток, вызывающий метод startServer() для Server.java.   -  person Richard    schedule 04.09.2016
comment
Я спрошу тебя в третий раз. Когда делаете что? Именно? Отправьте трассировку стека.   -  person user207421    schedule 05.09.2016
comment
Извините...... Я добавлю трассировку стека выше   -  person Richard    schedule 05.09.2016
comment
Вы проверили, содержит ли ваш truststore сертификат вашего сервера, если у него нет надлежащего сертификата?   -  person Imesha Sudasingha    schedule 06.09.2016
comment
Вы смогли это решить?   -  person mad_fox    schedule 31.12.2016


Ответы (2)


Я пытался найти решение. У меня есть некоторые решения. Все предлагают добавить -Djava.net.preferIPv4Stack=true к параметрам ВМ.

Документация Atlassian также содержит основную причину и решение, указанные ниже:

Причина

  1. Это одна из известных проблем с Java 7, согласно этому сообщению.
  2. Это также может быть вызвано любым антивирусным программным обеспечением или брандмауэром, установленным на сервере.

Разрешение

  1. Используйте системное свойство -Djava.net.preferIPv4Stack=true JVM, чтобы включить поддержку IPv4 в Java 7.
  2. Убедитесь, что антивирусное программное обеспечение и брандмауэр на сервере не блокируют возможность подключения Stash к почтовому серверу.

Это решение предназначено для Java 7, но вы используете Java 8. Поэтому я просматриваю вашу трассировку стека. Есть линия

 at io.netty.channel.socket.nio.NioServerSocketChannel.doBind(NioServerSocketChannel.java:125)

Что говорит о том, что вы используете netty.

Но у netty есть некоторые требования к версии. Также есть некоторые ограничения.

Достаточно JDK 5 (Netty 3.x) или 6 (Netty 4.x). Некоторые компоненты, такие как HTTP/2, могут иметь дополнительные требования.

Требования для Netty 4.x(ссылка)

В настоящее время Java не поддерживает ALPN или NPN (существует проблема с отслеживанием так что проголосуйте!). Из-за отсутствия поддержки в JDK нам нужно использовать расширение bootclasspath Jetty-ALPN (или Jetty-NPN, если на Java ‹ 8) для OpenJDK. Для этого добавьте параметр JVM Xbootclasspath, ссылающийся на путь к Jetty alpn-загрузочная банка.

java -Xbootclasspath/p:/path/to/jetty/alpn/extension.jar ...

Обратите внимание, что вы должны использовать выпуск jar Jetty-ALPN. зависит от используемой версии Java.

JDK-шифры

Java 7 не поддерживает наборы шифров, рекомендованные HTTP2. RFC. Чтобы решить эту проблему, мы предлагаем серверам по возможности использовать Java 8 или альтернативную реализацию JCE, такую ​​как Bouncy Castle. . Если это нецелесообразно, можно использовать другие шифры, но вы должны убедиться, что службы, которые вы собираетесь вызывать, также поддерживают эти шифры, запрещенные HTTP/2 RFC, и оценили связанные с этим риски безопасности.

Включение ALPN или NPN

SslContextBuilder имеет установщик для ApplicationProtocolConfig, который используется для настройки ALPN или NPN. См. HTTP/2. примеры для ALPN и Примеры SPDY для использования NPN.

Подробное описание можно найти по этой ссылке.

Предложения:

Поэтому проверьте свою версию netty и примите решение в соответствии с указанными выше проблемами. Или используйте JDK 7, если это возможно.

person SkyWalker    schedule 06.09.2016
comment
Спасибо. Я просмотрю ваш ответ завтра, когда у меня будет время. - person Richard; 06.09.2016

В связанном сообщении в блоге говорится, что вы можете подключаться к веб-сокетам в OpenShift, используя порты 8000 и 8443. Однако сам сервер должен быть привязан только к порту 8080, а затем вы можете подключаться извне к портам ws выше. . Эта схема, которую вы уже нашли, объясняет конфигурацию.

WildFly уже использует 8080, поэтому вы можете использовать самостоятельный картридж для развертывания своего приложения. (не забудьте отключить сервер ruby ​​по умолчанию в хуке start action, работающем на 8080) или вдохновитесь здесь.

person Jiri Fiala    schedule 07.09.2016