JRMP连接建立错误

我正在跟踪exception跟踪:

java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception is: java.net.SocketTimeoutException: Read timed out at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:293) at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:190) 

我在这方面阅读了一些论坛,但没有弄清楚这个例外的根本原因。 这是由于以下原因之一吗?

  1. 内存不足。
  2. RMI调用由于对服务器的请求数量增加而导致失败,导致其中一个请求等待并导致此请求处理超时。
  3. 不兼容的jre版本或与JRE版本相关的任何内容。
  4. 任何网络相关问题。
  5. 防火墙相关。

  1. 内存不足。

不是在客户端。 可能在服务器上,如果它导致例如分配线程失败。

  1. RMI调用由于对服务器的请求数量增加而导致失败,导致其中一个请求等待并导致此请求处理超时。

否。错误发生在连接建立阶段,早在调用服务器端方法实现之前。

  1. 不兼容的jre版本或与JRE版本相关的任何内容。

没有。

  1. 任何网络相关问题。

是。

  1. 防火墙相关。

不会。这会导致连接超时,或者在某些过时的情况下会导致连接拒绝,而不是读取超时。

在这种情况下,当来自LAN外部的持有SSH服务器的SSH客户端尝试连接到服务器并且涉及RMI让客户端在服务器上执行RMI方法时,我收到此错误。 原因是服务器的不可达性(缺少路由)。 似乎所有陈述的案例都与这个原因有关。

我在客户端有同样的错误。 服务器可以访问,我可以通过telnet打开端口。 当我在客户端和服务器端使用Wireshark观看时,我看到以下内容:

  • 建立TCP连接

    • SYN
    • SYN, ACK
    • ACK
  • 客户端发送: JRMI, Version 2, Stream Protocol

  • 服务器回复: JRMI, ProtocolAck – 但是这个包从未到达客户端

就我而言,它是从MagicDraw客户端到许可证服务器的连接。 对于其他位置的其他http.proxyHost=xxxx -Dhttp.proxyPort=8080 ,有助于使用代理: http.proxyHost=xxxx -Dhttp.proxyPort=8080并且客户端通过HTTP进行通信。 所以也许这可以帮助你省略这个问题。 https://docs.oracle.com/javase/7/docs/platform/rmi/spec/rmi-arch6.html

我无法具体,因为我无法访问Magic Draw的源代码。

在tomcat的启动文件中将CATALINA_OPTS设置为以下内容

 CATALINA_OPTS=-Djava.awt.headless=true -Xmx128M -server -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9091 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=localhost 

这里端口号不是服务器运行端口。 给出不同的端口号,如9091,1099等,主机名如localhost或198.168.128.72

像运行jconsole一样

 jconsole 198.168.128.72:9091 

这里的端口号不是服务器端口号。 它是CATALINA_OPTS给出的JMX端口。