This question is unlikely to help any future visitors; it is only relevant to a small geographic area, a specific moment in time, or an extraordinarily narrow situation that is not generally applicable to the worldwide audience of the internet. For help making this question more broadly applicable, visit the help center 。
8年前关闭。
当我使用
当服务器不再响应时我看到的堆栈跟踪(通过“
我已经尝试过的: 发送
所以问题是:浏览器与我的代理有什么不同,为什么这会使我的服务器进程挂起?
来源: 这里是 the source of the HttpHandler,这里是 the source of the Server that uses that handler
背景: 我希望任何人都能够从他们的网页使用我的 REST 服务,而无需安装代理(需要绕过 Javascript 跨域策略)。为此,服务器发送一个 无代理的更多连接 现实世界的浏览器用户可以做一些有趣的事情,比如开始一个请求,然后取消/返回按钮/新请求。
您需要设置套接字超时。不幸的是,API 文档建议无法以编程方式执行此操作。
但是您可以通过 JVM 系统属性设置请求和响应超时:
http://www.javaworld.com/community/node/8424
http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/sun/net/httpserver/ServerConfig.java
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6563368
设置这些系统属性:
sun.net.httpserver.clockTick
sun.net.httpserver.timerMillis
sun.net.httpserver.maxReqTime
默认值 > 0 给出 timeout = default * (clockTick 或 timerMillis) 秒
sun.net.httpserver.maxRspTime
默认值 > 0 给出 timeout = default * (clockTick 或 timerMillis) 秒
显然,在您的 HttpHandler.handle() 方法中,请确保在响应 header 中设置响应代码:
8年前关闭。
当我使用
com.sun.net.httpserver.HttpServer
实现的简单 HTTPS 服务器通过 this PHP proxy(使用 curl)调用时,它工作正常。但是一旦我不使用代理而是更改我的网络表单以便浏览器直接将其请求发送到服务器,服务器就会变得不稳定并且有时会停止响应。然后客户端将等待响应,直到它超时。该问题很难重现,有时会在实时系统中数小时后发生。所有这些都是通过非标准端口(当前为 8081)上的 HTTPS 进行的。我的服务器返回 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 header - 没有帮助。编写一个使用多个线程并行查询服务器的 Java 测试用例 - 工作正常。所以问题是:浏览器与我的代理有什么不同,为什么这会使我的服务器进程挂起?
来源: 这里是 the source of the HttpHandler,这里是 the source of the Server that uses that handler
背景: 我希望任何人都能够从他们的网页使用我的 REST 服务,而无需安装代理(需要绕过 Javascript 跨域策略)。为此,服务器发送一个
Access-Control-Allow-Origin: *
header 。与 Jetty 或 Tomcat Embedded 相比,我使用 Java 提供的类具有最小的开销。 最佳答案
为什么代理和无代理的行为不同?
您需要设置套接字超时。不幸的是,API 文档建议无法以编程方式执行此操作。
但是您可以通过 JVM 系统属性设置请求和响应超时:
http://www.javaworld.com/community/node/8424
http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/sun/net/httpserver/ServerConfig.java
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6563368
设置这些系统属性:
sun.net.httpserver.clockTick
默认值 = 10000 即 10 秒sun.net.httpserver.timerMillis
默认值 = 1000 即 1 秒sun.net.httpserver.maxReqTime
默认值 = -1,即永远。默认值 > 0 给出 timeout = default * (clockTick 或 timerMillis) 秒
sun.net.httpserver.maxRspTime
默认值 = -1,即永远。默认值 > 0 给出 timeout = default * (clockTick 或 timerMillis) 秒
显然,在您的 HttpHandler.handle() 方法中,请确保在响应 header 中设置响应代码:
httpExchange.sendResponseHeaders(HttpURLConnection.HTTP_OK, response.length());
final OutputStream os = httpExchange.getResponseBody();
os.write( response.getBytes() );
os.close();
关于java - 为什么 com.sun.net.httpserver.HttpServer 挂了?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15173709/
10-11 20:53