首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么com.sun.net.httpserver.HttpServer要挂?

为什么com.sun.net.httpserver.HttpServer要挂?
EN

Stack Overflow用户
提问于 2013-03-02 11:03:52
回答 1查看 5.8K关注 0票数 4

当我使用com.sun.net.httpserver.HttpServer实现的简单HTTPS服务器通过此PHP代理 (它使用curl)调用时,它可以正常工作。但是,只要我不使用代理,而是更改我的web表单,以便浏览器直接将它们的请求发送到服务器,服务器就会变得不稳定,有时停止响应。然后,客户端将等待响应,直到超时。这个问题很难重现,有时在直播系统中的几个小时后就会发生。所有这些都是通过HTTPS,在一个非标准端口(目前8081).我的服务器返回XML。

当服务器不再响应时,我看到的堆栈跟踪(通过"kill -QUIT [pid]"):

代码语言:javascript
复制
"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提供的类具有最小的开销。

EN

回答 1

Stack Overflow用户

发布于 2013-04-18 02:51:09

为什么代理和没有代理的行为不同?

  • 没有代理的更多连接
  • 现实世界的浏览器用户可以做一些有趣的事情,比如启动一个请求,然后取消/后退按钮/新请求。

您需要设置套接字超时。不幸的是,API文档表明没有办法以编程方式这样做。

但是,您可以通过JVM系统属性设置resquest和响应超时:

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

id=6563368

设置以下系统属性:

sun.net.httpserver.clockTick默认值= 10000,即10秒

sun.net.httpserver.timerMillis默认值= 1000,即1秒

sun.net.httpserver.maxReqTime默认值= -1,即永远。

默认值>0给出超时=默认*( clockTick ot timerMillis)秒

sun.net.httpserver.maxRspTime默认值= -1,即永远。

默认值>0给出超时=默认*( clockTick ot timerMillis)秒

显然,在HttpHandler.handle()方法中,请确保在响应头中设置响应代码:

代码语言:javascript
复制
  httpExchange.sendResponseHeaders(HttpURLConnection.HTTP_OK, response.length());  
  final OutputStream os = httpExchange.getResponseBody();  
  os.write( response.getBytes() );  
  os.close(); 
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15173709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档