gpt4 book ai didi

java - 为什么 com.sun.net.httpserver.HttpServer 挂了?

转载 作者:行者123 更新时间:2023-12-01 14:09:52 35 4
gpt4 key购买 nike

这个问题不太可能对 future 的访客有帮助;它只与一个小的地理区域、一个特定的时刻或一个非常狭窄的情况相关,通常不适用于互联网的全局受众。如需帮助使这个问题更广泛地适用,visit the help center .




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: *标题。与 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/

    35 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com