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
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.
-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
- Este é um dos problemas conhecidos com Java 7, como por Este post.
Isto também pode ser causado por qualquer software anti-vírus ou firewall. instalado no servidor.Resolução
- Use a propriedade do sistema JVM para ajudar activar o suporte para o IPv4 no Java 7.
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.