我不熟悉哪里可以获得com.sun.net.httpserver包?我喜欢在Android中使用这个包.
谢谢!
我们使用HttpServer项目中的内部类通过HTTP在客户端和服务器之间交换数据.当我们切换到Java 7时,我们意识到结果交付的延迟.我们可以将问题减少到以下示例:
类EchoServer创建上下文/echo,该上下文仅在每个请求时返回当前日期和请求URI.然后,客户端在循环中调用此服务.
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.util.Date;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
public class EchoServer {
public static void main(String[] args) throws IOException {
HttpServer server = HttpServer.create(new InetSocketAddress(80), 0);
server.createContext("/echo", new EchoHandler());
server.start();
}
static class EchoHandler implements HttpHandler {
public void handle(HttpExchange httpExchange) throws IOException {
httpExchange.getResponseHeaders().add("Content-type", "text/html");
String response = "<b>" + new Date() + "</b> for " + httpExchange.getRequestURI();
httpExchange.sendResponseHeaders(200, response.length());
OutputStream os = httpExchange.getResponseBody(); …Run Code Online (Sandbox Code Playgroud) 嵌入在JDK 6中的Http Server是开发Web服务的一个很大的帮助,但是我遇到了我发布了一个Endpoint然后代码崩溃并让服务器运行的情况.
一旦丢失对它的引用(或已发布的端点),如何关闭嵌入式服务器?
套接字积压是什么意思?
例如我有网络服务
@WebService
public class Calculator {
public int sum(int a, int b) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return a + b;
}
public static final int threadCount = 10;
public static void main(String[] args) throws IOException {
Executor manyThreads = Executors.newFixedThreadPool(threadCount);
HttpServer server = HttpServer.create(new InetSocketAddress(8989), threadCount);
server.setExecutor(manyThreads);
server.start();
Endpoint ep = Endpoint.create(new Calculator());
HttpContext context = server.createContext("/calc");
ep.publish(context);
}
}
Run Code Online (Sandbox Code Playgroud)
和网络服务客户端
public static void main(String[] args) throws IOException {
CalculatorService service = …Run Code Online (Sandbox Code Playgroud) 我尝试使用 Sun JRE 的 HTTP 服务器进行一些操作。看了两遍文档,我还是一头雾水。
com.sun.net.httpserver.Filter javadoc表示以下内容
要求此过滤器对给定的交换进行预处理/后处理。该过滤器可以:
- 检查或修改请求标头
- 通过创建合适的过滤器流并调用 HttpExchange.setStreams(InputStream,OutputStream) 来过滤请求正文或响应正文
- 设置交换中的属性对象,其他过滤器或交换处理程序可以访问该对象。
决定:
- 通过调用 Filter.Chain.doFilter(HttpExchange) 调用链中的下一个过滤器
- 通过不调用 Filter.Chain.doFilter(HttpExchange) 来终止调用链
如果采用上述选项 1,则当 doFilter() 返回时,链中的所有后续过滤器都已被调用,并且可以检查或修改响应标头。如果采用上述选项 2,则此 Filter 必须使用 HttpExchange 发回适当的响应
我不清楚是什么,什么决定了过滤器是预处理过滤器还是后处理过滤器。正如我所假设的,后处理过滤器在HttpHandler之后运行,因此它可以与 HttpExchange 一起使用 HttpHandler 修改的内容。但是,过滤器仅被调用一次,因此必须有一个“魔法”来决定过滤器在处理程序之前或之后运行。
请帮我说清楚。
我无法在java 1.6的src.jar中找到com.sun.net.httpserver.HttpServer源代码.哪里有空位?
我正在使用Eclipse Indigo和Java jdk7.
我想创建一个小网络服务器,但我无法使用sun的网络服务器.
当我输入:
{
com.sun.net.httpserver.httpserver server;
}
Run Code Online (Sandbox Code Playgroud)
我得到以下Eclipse-Error-Message:
Description Resource Path Location Type
Access restriction: The type HttpServer is not accessible due to restriction
on required library C:\jdk1.7.0\jre\lib\rt.jar
Server.java /REST-Server/src/com/test/restserver line 7 Java Problem
Run Code Online (Sandbox Code Playgroud)
我在这做错了什么?我不需要包括任何其他罐子?我呢?
我有一个Java类用于JUnit 4.x. 在每个@Test方法中,我创建了一个新的HttpServer,使用了端口9090.第一个调用工作查找,但后续的错误与"地址已被使用:绑定".
这是一个例子:
@Test
public void testSendNoDataHasValidResponse() throws Exception {
InetSocketAddress address = new InetSocketAddress(9090);
HttpHandler handler = new HttpHandler() {
@Override
public void handle(HttpExchange exchange) throws IOException {
byte[] response = "Hello, world".getBytes();
exchange.sendResponseHeaders(HttpURLConnection.HTTP_OK, response.length);
exchange.getResponseBody().write(response);
exchange.close();
}
};
HttpServer server = HttpServer.create(address, 1);
server.createContext("/me.html", handler);
server.start();
Client client = new Client.Builder(new URL("http://localhost:9090/me.html"), 20, "mykey").build();
client.sync();
server.stop(1);
assertEquals(true, client.isSuccessfullySynchronized());
}
Run Code Online (Sandbox Code Playgroud)
很明显,HttpServer仅在每个方法中保存,并在结束前停止.我没有看到什么继续保持任何套接字打开.第一次测试通过,后续测试每次都失败.
有任何想法吗?
使用更正方法编辑:
@Test
public void testSendNoDataHasValidResponse() throws Exception {
server = HttpServer.create(new InetSocketAddress("127.0.0.1", 0), 1);
HttpHandler handler …Run Code Online (Sandbox Code Playgroud) 我使用Apache HttpClient和java.sun.net.httpserver作为Server.服务器处理Http-Get请求.首先,服务器使用set-cookie标头设置会话cookie,这是由apache httpclient接受的(根据日志),但问题是cookie永远不会存储,也不会被客户端发送回服务器.我已经使用一些Web浏览器测试了服务器应用程序,并且一切正常.因此问题似乎是在客户端,特别是考虑到所有cookie都被接受与log4j一起登录.
DEBUG [org.apache.http.impl.conn.SingleClientConnManager] Get connection for route HttpRoute[{}->http://localhost]
DEBUG [org.apache.http.impl.conn.DefaultClientConnectionOperator] Connecting to localhost/127.0.0.1:80
DEBUG [org.apache.http.client.protocol.RequestAddCookies] CookieSpec selected: best-match
DEBUG [org.apache.http.client.protocol.RequestAuthCache] Auth cache not set in the context
DEBUG [org.apache.http.impl.client.DefaultHttpClient] Attempt 1 to execute request
DEBUG [org.apache.http.impl.conn.DefaultClientConnection] Sending request: GET /login?pass=2Gi/Kzj9 HTTP/1.1
DEBUG [org.apache.http.headers] >> GET /login?pass=2Gi/Kzj9 HTTP/1.1
DEBUG [org.apache.http.headers] >> Host: localhost
DEBUG [org.apache.http.headers] >> Connection: Keep-Alive
DEBUG [org.apache.http.headers] >> User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
DEBUG [org.apache.http.impl.conn.DefaultClientConnection] Receiving response: HTTP/1.1 200 OK
DEBUG [org.apache.http.headers] << HTTP/1.1 200 OK
DEBUG …Run Code Online (Sandbox Code Playgroud) 我有java 6嵌入式HttpServer.它有一个句柄,允许客户下载一个大文本文件.问题是,当服务器有10个以上的同时客户端时,我会遇到内存异常.我很清楚问题出在Http Server周围.
HttpServer m_server = HttpServer.create(new InetSocketAddress(8080), 0);
m_server.createContext("/DownloadFile", new DownloadFileHandler() );
public class DownloadFileHandler implements HttpHandler {
private static byte[] myFile = new String("....................").getBytes(); //string about 8M
@Override
public void handle(HttpExchange exchange) throws IOException {
exchange.sendResponseHeaders(HTTP_OK, myFile .length); OutputStream responseBody = exchange.getResponseBody();
responseBody.write(myFile );
responseBody.close();
}
}
Run Code Online (Sandbox Code Playgroud)
现在我得到的例外是:
java.lang.OutOfMemoryError: Java heap space
at java.nio.HeapByteBuffer.<init>(Unknown Source)
at java.nio.ByteBuffer.allocate(Unknown Source)
at sun.net.httpserver.Request$WriteStream.write(Unknown Source)
at sun.net.httpserver.FixedLengthOutputStream.write(Unknown Source)
at java.io.FilterOutputStream.write(Unknown Source)
at sun.net.httpserver.PlaceholderOutputStream.write(Unknown Source)
at com.shunra.javadestination.webservices.DownloadFileHandler.handle(Unknown Source)
at com.sun.net.httpserver.Filter$Chain.doFilter(Unknown Source)
at sun.net.httpserver.AuthFilter.doFilter(Unknown …Run Code Online (Sandbox Code Playgroud)