当通过这个 PHP 代理(使用 curl)com.sun.net.httpserver.HttpServer
调用我实现的简单 HTTPS 服务器时,它工作正常。但是一旦我不使用代理而是更改我的 Web 表单以便浏览器直接将其请求发送到服务器,服务器就会变得不稳定并且有时会停止响应。然后客户端将等待响应,直到超时。该问题难以重现,有时会在实时系统中数小时后发生。所有这些都是通过 HTTPS 在非标准端口(当前为 8081)上进行的。我的服务器返回 XML。
当服务器不再响应时我看到的堆栈跟踪(通过“ kill -QUIT [pid]
”):
"Thread-2" prio=10 tid=0x0000000017fc4800 nid=0x1c2b runnable
[0x00002ba5ec97c000]
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.FileDispatcherImpl.read0(Native Method)
at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:39)
at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:218)
at sun.nio.ch.IOUtil.read(IOUtil.java:191)
at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:359)
- locked <0x00000000fd1e4b98> (a java.lang.Object)
at sun.net.httpserver.SSLStreams$EngineWrapper.recvAndUnwrap(SSLStreams.java:334)
- locked <0x00000000fd1e4c58> (a java.lang.Object)
at sun.net.httpserver.SSLStreams.recvData(SSLStreams.java:409)
at sun.net.httpserver.SSLStreams$InputStream.read(SSLStreams.java:524)
at sun.net.httpserver.SSLStreams$InputStream.read(SSLStreams.java:593)
at sun.net.httpserver.Request.readLine(Request.java:84)
at sun.net.httpserver.Request.<init>(Request.java:54)
at sun.net.httpserver.ServerImpl$Exchange.run(ServerImpl.java:529)
at sun.net.httpserver.ServerImpl$DefaultExecutor.execute(ServerImpl.java:156)
at sun.net.httpserver.ServerImpl$Dispatcher.handle(ServerImpl.java:424)
at sun.net.httpserver.ServerImpl$Dispatcher.run(ServerImpl.java:389)
at java.lang.Thread.run(Thread.java:722)
我已经尝试过:发送Connection: close
http 标头 - 没有帮助。编写一个使用多个线程并行查询服务器的 Java 测试用例 - 工作正常。
所以问题是:浏览器和我的代理有什么不同,为什么这会让我的服务器进程挂起?
来源:这是 HttpHandler的来源,这是使用该处理程序的服务器的来源
背景:我希望任何人都能够从他们的网页使用我的 REST 服务,而无需安装代理(需要规避 Javascript 跨域策略)。为此,服务器发送一个Access-Control-Allow-Origin: *
标头。与 Jetty 或 Tomcat Embedded 相比,我使用 Java 提供的类具有最小的开销。