Ric*_*ard 12 java sockets openshift openshift-cartridge
我正在使用Java8并且有一个可以在我的localhost上完美运行的聊天服务器,但是当我将它部署到OpenShift服务器时,我收到以下错误:
java.net.SocketException:权限被拒绝
Run Code Online (Sandbox Code Playgroud)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();
}
Run Code Online (Sandbox Code Playgroud)
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
在这个链接中, OpenShift谈论端口绑定和代理.我真的不明白这一切.看起来我应该使用端口8000(我是),但我不清楚我应该使用什么主机名.我正在使用我的应用程序URL名称(jbosswildfly-easyjobs.rhcloud.com).那是对的吗?
如果我将地址更改为http://jbosswildfly-easyjobs.rhcloud.com(即前缀http://),我会收到以下错误:
java.net.SocketException:未解析的地址
我试图找出解决方案。我有一些解决方案。所有这些都建议添加-Djava.net.preferIPv4Stack=true到VM选项。
Atlassian文档还给出了根本原因和解决方案,如下所示:
原因
- 根据这篇文章,这是 Java 7 的已知问题之一。
- 这也可能是由服务器上安装的任何防病毒或防火墙软件引起的。
解决
- 使用
-Djava.net.preferIPv4Stack=trueJVM 系统属性帮助启用 Java 7 上的 IPv4 支持。- 检查服务器上的防病毒和防火墙软件是否阻止 Stash 连接到邮件服务器的能力。
该解决方案适用于 Java 7,但您使用的是 Java 8。所以我查找您的堆栈跟踪。有一条线
at io.netty.channel.socket.nio.NioServerSocketChannel.doBind(NioServerSocketChannel.java:125)
Run Code Online (Sandbox Code Playgroud)
这表明您正在使用netty。
但是netty对版本有一些要求。也有一些限制。
JDK 5 (Netty 3.x) 或 6 (Netty 4.x) 就足够了。某些组件(例如 HTTP/2)可能有更多要求
Java 目前不支持 ALPN 或 NPN(存在跟踪问题,因此请投票!)。由于 JDK 缺乏支持,我们需要使用 OpenJDK 的 Jetty-ALPN(如果在 Java < 8 上则为 Jetty-NPN)引导类路径扩展。为此,请添加引用 Jetty alpn-boot jar 路径的 Xbootclasspath JVM 选项。
Run Code Online (Sandbox Code Playgroud)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的设置器,用于配置 ALPN 或 NPN 。有关 ALPN 的HTTP/2 示例和有关 NPN 使用的SPDY 示例,请参阅HTTP/2 示例。
有关详细说明,您可以通过此链接。
因此,请检查您的netty版本并根据上述问题做出决定。或者如果可能的话使用 JDK 7。
| 归档时间: |
|
| 查看次数: |
4295 次 |
| 最近记录: |