簡體   English   中英

Openshift java.net.SocketException:權限被拒絕

[英]Openshift java.net.SocketException: Permission denied

我正在使用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 Web套接字指南,其中說應該使用端口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:未解析的地址

在此輸入圖像描述

鏈接的博客文章說您可以使用端口8000和8443連接到OpenShift上的websockets。但是,服務器本身只需要綁定到端口8080 ,然后您可以從外部連接到上面的ws端口。 您已找到的此圖解釋了配置。

WildFly已經使用了8080,因此您可能希望使用DIY盒式磁帶來部署您的應用程序(不要忘記在8080上運行的啟動操作掛鈎中禁用默認的ruby服務器)或者在這里受到啟發。

我試圖找出解決方案。 我有一些解決方案。 所有人都建議將-Djava.net.preferIPv4Stack=true添加到VM選項中。

Atlassian文檔也得到了根本原因和解決方案,如下所示:

原因

  1. 根據這篇文章 ,這是Java 7的已知問題之一。
  2. 這也可能是由服務器上安裝的任何防病毒軟件或防火牆軟件引起的。

解析度

  1. 使用-Djava.net.preferIPv4Stack=true JVM系統屬性來幫助在Java 7上啟用對IPv4的支持。
  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缺乏支持,我們需要為OpenJDK使用Jetty-ALPN(如果在Java <8上為Jetty-NPN)bootclasspath擴展。 為此,請添加一個引用Jetty alpn-boot jar路徑的Xbootclasspath JVM選項。

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

請注意,您必須使用特定於您正在使用的Java版本的Jetty-ALPN jar版本。

JDK密碼

Java 7不支持HTTP2 RFC 推薦的密碼套件 為了解決這個問題,我們建議服務器盡可能使用Java 8,或者使用其他JCE實現,例如Bouncy Castle 如果這不可行,則可以使用其他密碼,但是您需要確保您打算調用的服務也支持HTTP / 2 RFC禁止的這些密碼,並評估了這樣做的安全風險。

啟用ALPN或NPN

SslContextBuilder具有ApplicationProtocolConfig的setter,用於配置ALPN或NPN。 有關NPN用法的ALPN和SPDY示例 ,請參閱HTTP / 2示例

有關詳細說明,您可以瀏覽此鏈接

建議:

因此,請檢查您的netty版本並根據上述問題做出決定。 或者盡可能使用JDK 7。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM