java.net.SocketException: Unexpected end of file from server 异常解决

公司业务需要,需要另外一个相似版本的web应用,项目部署的时候工程文件都是一样的(只是配置不一样),部署到新的地方时,比如tomcat服务器的时候,报了如下错误:

java.net.SocketException: Unexpected end of file from server
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:806)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:665)
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:803)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:665)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1230)
........
........

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:761)

为了解决该问题,折腾了好几个小时,总感觉是工程之间互访出了问题,由于整个工程有六七个工程,工程之间存在互访,查看后台日志确实是互访的问题。一开始还以为是工程代码问题,六七个工程部署在同一台机器的3个tomcat中,项目互访直接走内网即可。但是抛出上面错误,一下子懵了,外网访问都可以,为啥内网之间互访却不行了呢?

为了解决这个问题,重新检查了下配置,没有错,最终发现是因为tomcat环境配置的问题,之前部署走的是http协议,现在部署的tomcat是https协议,tomcat里的http和https协议有不一样的端口,

如下,我的tomcat https端口是8083

<Connector port="8083" protocol="org.apache.coyote.http11.Http11Protocol" SSLEnabled="true"
      maxThreads="150" scheme="https" secure="true"
      clientAuth="false" sslProtocol="TLS"
      keystoreFile="/u01/ssl/server.jks" keystorePass="password"
      truststoreFile="/u01/ssl/server.jks" truststorePass="password" />

http端口是8030

<Connector port="8030" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" />

一定要注意这个问题,然后在工程的web.xml文件中加入https的支持

<security-constraint>
    <web-resource-collection>
      <web-resource-name>SSL</web-resource-name>
      <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <user-data-constraint>
      <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
  </security-constraint>

如果存在通过获取数据库表中的地址来动态访问工程的话,使用https://ip:port这种方式,在我测试的时候会报连接超时的问题。

这里写图片描述

最终改用了https://localhost:port的访问方式成功把工程代码跑起来了。记录下心得,方便遇到同样问题的码农,提供一种解决方案或思路。

猜你喜欢

转载自blog.csdn.net/huangbaokang/article/details/80118481