-4

我在 Apache Tomcat 6.0.36 上运行 Web 应用程序,并将 IE8 用于带有 Windows 7 的 Web 浏览器。我最近应用了 Java 零日补丁(Java 7 Update 11)。

现在我的所有 Web 应用程序都会出现白屏,并显示“Internet Explorer 无法显示网页”消息这是我从 catalina 日志文件中获得的错误消息。

Jan 18, 2013 3:44:55 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 38198 ms
Jan 18, 2013 3:51:17 PM org.apache.tomcat.util.net.NioEndpoint setSocketOptions
SEVERE:
java.net.SocketException: Invalid argument: no further information
at sun.nio.ch.Net.setIntOption0(Native Method)
at sun.nio.ch.Net.setSocketOption(Unknown Source)
at sun.nio.ch.SocketChannelImpl.setOption(Unknown Source)
at sun.nio.ch.SocketAdaptor.setIntOption(Unknown Source)
at sun.nio.ch.SocketAdaptor.setTrafficClass(Unknown Source)
at org.apache.tomcat.util.net.SocketProperties.setProperties(SocketProperties.java:184)
at org.apache.tomcat.util.net.NioEndpoint.setSocketOptions(NioEndpoint.java:1089)
at org.apache.tomcat.util.net.NioEndpoint$Acceptor.run(NioEndpoint.java:1314)
at java.lang.Thread.run(Unknown Source)

非常感谢有关如何解决此问题的任何想法。

谢谢你。

4

1 回答 1

3

原因是 setTrafficClass 调用并且有一次相同的子弹。如果您使用 Java6 运行 Tomcat 进程,它应该可以工作。与 Windows 网络堆栈功能有关。一些应用程序提供属性“skipTrafficClass_call=true”,但这是应用程序行为的一部分。这是一个非常古老的问题,但 Java7 做了一个小而重要的改变。

引自网络:

“我已经找到了第一个问题。在调用 socketChannel.connect() 之后调用 java.nio.channels.SocketChannel.socket().setTrafficClass() 会触发 SocketException。将 setTrafficClass() 调用移到连接之前() 解决了这个问题。” “对 Java 6 的测试表明,如果在 connect() 之后调用 setTrafficClass(),它没有任何效果。看起来当 setter 无效时,Java 7 已经开始抛出异常。”

JDC 上的一些开发人员发表了评论,指出在 Windows 2000 和 XP 上没有设置 ToS 位。这不是 setTrafficClass 实现中的错误,而是必须通过创建注册表设置来启用 IP_TOS 选项。注册表设置是:-

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters\DisableUserTOSSetting

http://docs.oracle.com/javase/6/docs/api/java/net/Socket.html#setTrafficClass%28int%29

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4696356

http://tomcat.10.n6.nabble.com/Tomcat-7-Cluster-Issue-td4562937.html

您可以尝试旧的 Http11Protocol 连接器处理程序,这在 tomcat/conf/server.xml 文件中给出。更改 http(8080) 和 https(8443) 连接器。

<!-- protocol: org.apache.coyote.http11.Http11Protocol, same as HTTP/1.1
           org.apache.coyote.http11.Http11NioProtocol
           org.apache.coyote.http11.Http11AprProtocol
-->
<Connector port="8080" protocol="org.apache.coyote.http11.Http11Protocol"
       connectionTimeout="20000" redirectPort="8443" 
       disableUploadTimeout="true" useBodyEncodingForURI="true" />

编辑似乎 Tomcat 7.0.30+ 解决了这个问题,您可以使用 Windows+Java7+Tomcat7+NIO 连接器。从现在开始,所有 Java 网络应用程序都应该在打开连接之前设置可选的套接字选项,Java6 提供了免费通行证,但 Java7 抛出了异常。 http://svn.apache.org/viewvc?view=revision&revision=1358591

于 2013-01-19T14:02:07.627 回答