介紹摘自網絡:
JDK6提供了一個簡單的Http Server API,據此我們可以構建自己的嵌入式Http Server,它支持Http和Https協議,提供了HTTP1.1的部分實現,沒有被實現的那部分可以通過擴展已有的Http Server API來實現,程序員必須自己實現HttpHandler接口,HttpServer會調用HttpHandler實現類的回調方法來處理客戶端請求,在這裏,我們把一個Http請求和它的響應稱爲一個交換,包裝成HttpExchange類,HttpServer負責將HttpExchange傳給HttpHandler實現類的回調方法
我想開發一個j2se的小程序,它能接受網頁傳來的參數,並對傳來參數做些處理。我希望這個小程序即可能接受網頁傳過來的參數,也能接受OutputStream流傳來參數,JDK6新特性能夠實現。
一、提供http服務的類
- package com.tdt.server.httpserver;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.io.OutputStream;
- import java.net.InetSocketAddress;
- import com.sun.net.httpserver.HttpExchange;
- import com.sun.net.httpserver.HttpHandler;
- import com.sun.net.httpserver.HttpServer;
- import com.sun.net.httpserver.spi.HttpServerProvider;
- /**
- * @project SimpleHttpServer
- * @author sunnylocus
- * @vresion 1.0 2009-9-2
- * @description 自定義的http服務器
- */
- public class MyHttpServer {
- //啓動服務,監聽來自客戶端的請求
- public static void httpserverService() throws IOException {
- HttpServerProvider provider = HttpServerProvider.provider();
- HttpServer httpserver =provider.createHttpServer(new InetSocketAddress(6666), 100);//監聽端口6666,能同時接 受100個請求
- httpserver.createContext("/myApp", new MyHttpHandler());
- httpserver.setExecutor(null);
- httpserver.start();
- System.out.println("server started");
- }
- //Http請求處理類
- static class MyHttpHandler implements HttpHandler {
- public void handle(HttpExchange httpExchange) throws IOException {
- String responseMsg = "ok"; //響應信息
- InputStream in = httpExchange.getRequestBody(); //獲得輸入流
- BufferedReader reader = new BufferedReader(new InputStreamReader(in));
- String temp = null;
- while((temp = reader.readLine()) != null) {
- System.out.println("client request:"+temp);
- }
- httpExchange.sendResponseHeaders(200, responseMsg.length()); //設置響應頭屬性及響應信息的長度
- OutputStream out = httpExchange.getResponseBody(); //獲得輸出流
- out.write(responseMsg.getBytes());
- out.flush();
- httpExchange.close();
- }
- }
- public static void main(String[] args) throws IOException {
- httpserverService();
- }
- }
package com.tdt.server.httpserver;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
import com.sun.net.httpserver.spi.HttpServerProvider;
/**
* @project SimpleHttpServer
* @author sunnylocus
* @vresion 1.0 2009-9-2
* @description 自定義的http服務器
*/
public class MyHttpServer {
//啓動服務,監聽來自客戶端的請求
public static void httpserverService() throws IOException {
HttpServerProvider provider = HttpServerProvider.provider();
HttpServer httpserver =provider.createHttpServer(new InetSocketAddress(6666), 100);//監聽端口6666,能同時接 受100個請求
httpserver.createContext("/myApp", new MyHttpHandler());
httpserver.setExecutor(null);
httpserver.start();
System.out.println("server started");
}
//Http請求處理類
static class MyHttpHandler implements HttpHandler {
public void handle(HttpExchange httpExchange) throws IOException {
String responseMsg = "ok"; //響應信息
InputStream in = httpExchange.getRequestBody(); //獲得輸入流
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String temp = null;
while((temp = reader.readLine()) != null) {
System.out.println("client request:"+temp);
}
httpExchange.sendResponseHeaders(200, responseMsg.length()); //設置響應頭屬性及響應信息的長度
OutputStream out = httpExchange.getResponseBody(); //獲得輸出流
out.write(responseMsg.getBytes());
out.flush();
httpExchange.close();
}
}
public static void main(String[] args) throws IOException {
httpserverService();
}
}
二、測試類
- package com.tdt.server.test;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.io.OutputStream;
- import java.net.HttpURLConnection;
- import java.net.URL;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- /**
- * @project SimpleHttpServer
- * @author sunnylocus
- * @vresion 1.0 2009-9-2
- * @description 測試類
- */
- public class Test {
- public static void main(String[] args) {
- ExecutorService exec = Executors.newCachedThreadPool();
- // 測試併發對MyHttpServer的影響
- for (int i = 0; i < 20; i++) {
- Runnable run = new Runnable() {
- public void run() {
- try {
- startWork();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- };
- exec.execute(run);
- }
- exec.shutdown();// 關閉線程池
- }
- public static void startWork() throws IOException {
- URL url = new URL("http://127.0.0.1:6666/myApp");
- HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
- urlConn.setDoOutput(true);
- urlConn.setDoInput(true);
- urlConn.setRequestMethod("POST");
- // 測試內容包
- String teststr = "this is a test message";
- OutputStream out = urlConn.getOutputStream();
- out.write(teststr.getBytes());
- out.flush();
- while (urlConn.getContentLength() != -1) {
- if (urlConn.getResponseCode() == 200) {
- InputStream in = urlConn.getInputStream();
- BufferedReader reader = new BufferedReader(new InputStreamReader(in));
- String temp = "";
- while ((temp = reader.readLine()) != null) {
- System.err.println("server response:" + temp);// 打印收到的信息
- }
- reader.close();
- in.close();
- urlConn.disconnect();
- }
- }
- }
- }
package com.tdt.server.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @project SimpleHttpServer
* @author sunnylocus
* @vresion 1.0 2009-9-2
* @description 測試類
*/
public class Test {
public static void main(String[] args) {
ExecutorService exec = Executors.newCachedThreadPool();
// 測試併發對MyHttpServer的影響
for (int i = 0; i < 20; i++) {
Runnable run = new Runnable() {
public void run() {
try {
startWork();
} catch (IOException e) {
e.printStackTrace();
}
}
};
exec.execute(run);
}
exec.shutdown();// 關閉線程池
}
public static void startWork() throws IOException {
URL url = new URL("http://127.0.0.1:6666/myApp");
HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
urlConn.setDoOutput(true);
urlConn.setDoInput(true);
urlConn.setRequestMethod("POST");
// 測試內容包
String teststr = "this is a test message";
OutputStream out = urlConn.getOutputStream();
out.write(teststr.getBytes());
out.flush();
while (urlConn.getContentLength() != -1) {
if (urlConn.getResponseCode() == 200) {
InputStream in = urlConn.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String temp = "";
while ((temp = reader.readLine()) != null) {
System.err.println("server response:" + temp);// 打印收到的信息
}
reader.close();
in.close();
urlConn.disconnect();
}
}
}
}
注意:經過我測試發現httpExchange.sendResponseHeaders(200, responseMsg.length())有bug,如果responseMsg裏面包含中文的話,客戶端不會收到任何信息,因爲一個漢字用二個字節表示。
應修改爲:
httpExchange.sendResponseHeaders(HttpURLConnection.HTTP_OK, responseMsg.getBytes().length);