OpenShift java.net.SocketException: Permissão negada

estou a usar o Java8 e tenho um servidor de Chatque funciona perfeitamente no meu localhost , mas quando o uso num servidor de OpenShift, recebo o seguinte erro:

Java. net. SocketException: Permissão negada

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)

Olhei para o Guia de tomadas Web OpenShift Aqui, que diz que a porta 8000 deve ser usada. Mas continuo a perceber o erro.

no Openshift estou a correr o meu servidor de chatnum WildFly Aplicação Servidor 10 cartucho.

todos os conselhos apreciados.

Aqui está o meu código:

inicializador de webapp.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();
    }

Servidor.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();
        }
    }
}

em esta ligação fala sobre a ligação de portas e proxies. Não percebo tudo. Parece que eu deveria usar o porto 8000 (que eu sou), Mas eu não sou claro que hostname eu devo usar. Estou a usar o nome do url da minha aplicação (jbosswildfly-easyjobs.rhcloud.com). correcto?

se mudar o endereço para, http://jbosswildfly-easyjobs.rhcloud.com (ou seja, prefixo http://) recebo o seguinte erro:

Java. net. SocketException: endereço por resolver

enter image description here

Author: Richard, 2016-09-01

2 answers

O post ligado no blog diz que pode ligar-se a websockets no OpenShift usando as portas 8000 e 8443. No entanto, o próprio servidor precisa de ser ligado apenas ao porto 8080 e então você pode se conectar externamente às portas ws acima. este diagrama que já encontrou explica a configuração.

O WildFly já está a usar o 8080, por isso poderá querer usar o cartucho de DIY para activar a sua aplicação (não se esqueça de desactivar o servidor de ruby por omissão no início gancho de ação que está rodando em 8080) ou ser inspirado aqui.

 2
Author: Jiri Fiala, 2016-09-07 14:09:07
Estava a tentar encontrar uma solução. Tenho algumas soluções. Todos sugerem adicionar -Djava.net.preferIPv4Stack=true às opções VM.

Documentação de Atlassian {[9] } também tem a causa raiz e a solução dada abaixo:

Causa

  1. Este é um dos problemas conhecidos com Java 7, como por Este post.
  2. Isto também pode ser causado por qualquer software anti-vírus ou firewall. instalado no servidor.

Resolução

  1. Use a propriedade do sistema JVM para ajudar activar o suporte para o IPv4 no Java 7.
  2. Verifique se o software anti-vírus e firewall no servidor não está a bloquear a capacidade do Stash de se ligar ao servidor de correio.

Esta solução é para Java 7, mas você está usando Java 8.Por isso, procuro o teu stacktrace. Há uma linha

 at io.netty.channel.socket.nio.NioServerSocketChannel.doBind(NioServerSocketChannel.java:125)
O que está a dizer que estás a usar netty .

Mas a netty tem alguns requisitos com base na versão. Há também algumas limitações.

JDK 5 (Netty 3.x) ou 6 (Netty 4.x) é suficiente. Alguns componentes, tais como HTTP / 2 pode ter mais Requisitos

Requisitos para o Netty 4.x (ligação)

O Java não suporta de momento o ALPN ou o NPN (o é um problema de seguimento por isso, vá para cima!). Por falta de apoio no JDK precisamos utilizar o Jetty-ALPN (ou Jetty-NPN if on Java para fazer isto, adicione uma opção Xbootclassspath JVM referenciando o caminho para o Jetty alpn-boot jar.

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

Lembre-se que tem de utilizar a libertação do jarro de mola (Jetty-ALPN) específica para a versão de Java que você está usando.

Cifras JDK

Java 7 não suporta as suites de cifra recomendadas pelo HTTP2 RFC . Para resolver isso, sugerimos que os servidores usem Java 8 onde possível ou usar uma implementação JCE alternativa como Bouncy Castle . Se isto não for prático, é possível utilizar outros Cifras, mas você precisa garantir que os serviços que você pretende chamar também suporta estas cifras proibidas pelo RFC HTTP/2 e tem avaliei os riscos de segurança de fazê-lo.

Activar a ALPN ou a NPN

A SslContextBuilder tem um setter para um ApplicationProtocolConfig que é usado para configurar ALPN ou NPN. Veja os exemplos de HTTP/2 para ALPN e para SPDY para NPN uso.

Para mais detalhes, pode passar por este link.

Sugestões:

Por isso, verifique a sua versão netty e tome a decisão de acordo com as questões acima. Ou utilizar JDK 7, se possível.

 1
Author: SkyWalker, 2016-09-06 15:09:45