HttpServer服务端处理Http请求:
package http;
import com.sun.net.httpserver.HttpContext;
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;
import java.io.*;
import java.net.InetSocketAddress;
import java.net.URI;
import java.util.concurrent.Executors;
public class HttpServerStudy {
private static HttpServer httpserver = null;
public static void main(String[] args) throws IOException {
HttpServerProvider provider = HttpServerProvider.provider();
httpserver = provider.createHttpServer(new InetSocketAddress("127.0.0.1", 8887), 10);
HttpContext context = httpserver.createContext("/zwc/HttpTest", new DyanHttpHandler());
// 线程池
httpserver.setExecutor(Executors.newCachedThreadPool());
httpserver.start();
System.out.println(String.format("--------------启动完毕,监听IP:[%S]端口:[%s]", "127.0.0.1", "8887"));
}
}
class DyanHttpHandler implements HttpHandler {
private static int bufferSize = 1024;
private static long maxMessageLength = 8589934592L;
@Override
public void handle(HttpExchange arg0) throws IOException {
System.out.println("getProtocol:" + arg0.getProtocol());//协议版本
System.out.println("getRequestMethod:" + arg0.getRequestMethod());//请求方法GET、POST
System.out.println("getResponseCode:" + arg0.getResponseCode());//返回已经设置的响应code,还没设置返回-1
HttpContext context = arg0.getHttpContext();
System.out.println("context.getPath:" + context.getPath());
System.out.println("context.toString:" + context.toString());
System.out.println("context.getAttributes:" + context.getAttributes());
System.out.println("context.getAuthenticator:" + context.getAuthenticator());
System.out.println("context.getFilters:" + context.getFilters());
System.out.println("context.getHandler:" + context.getHandler());
System.out.println("context.getServer:" + context.getServer());
System.out.println("getLocalAddress:" + arg0.getLocalAddress());
System.out.println("getPrincipal:" + arg0.getPrincipal());
System.out.println("getRemoteAddress:" + arg0.getRemoteAddress());
URI uri = arg0.getRequestURI();
System.out.println("getRequestURI:" + arg0.getRequestURI());
System.out.println("uri.getAuthority:" + uri.getAuthority());
System.out.println("uri.getFragment:" + uri.getFragment());
System.out.println("uri.getHost:" + uri.getHost());
System.out.println("uri.getPath:" + uri.getPath());
System.out.println("uri.getQuery:" + uri.getQuery());//url里get请求的参数
System.out.println("uri.getRawAuthority:" + uri.getRawAuthority());
System.out.println("uri.getRawFragment:" + uri.getRawFragment());
System.out.println("uri.getRawPath:" + uri.getRawPath());
System.out.println("uri.getRawQuery:" + uri.getRawQuery());
System.out.println("uri.getRawSchemeSpecificPart:" + uri.getRawSchemeSpecificPart());
System.out.println("uri.getRawUserInfo:" + uri.getRawUserInfo());
System.out.println("uri.getScheme:" + uri.getScheme());
System.out.println("uri.getSchemeSpecificPart:" + uri.getSchemeSpecificPart());
System.out.println("uri.getUserInfo:" + uri.getUserInfo());
System.out.println("uri.getPort:" + uri.getPort());
System.out.println("getRequestBody:" + arg0.getRequestBody());
System.out.println("getResponseBody:" + arg0.getResponseBody());
System.out.println("getResponseHeaders:" + arg0.getResponseHeaders());
byte[] bytes;
ByteArrayOutputStream os = new ByteArrayOutputStream();
InputStream requestBody = null;
BufferedReader br = null;
OutputStream out = null;
String resp = "响应数据";
try {
requestBody = arg0.getRequestBody();
// 读取方式一:
br = new BufferedReader(new InputStreamReader(requestBody, "utf-8"));
StringBuilder stringBuilder = new StringBuilder();
String retStr;
while((retStr = br.readLine()) != null){
stringBuilder.append(retStr);
}
System.out.println("响应数据1:" + stringBuilder.toString());
// 读取方式二:
bytes = new byte[bufferSize];
long messageLength = 0L;
int len;
while((len = requestBody.read(bytes)) > 0) {
os.write(bytes, 0, len);
messageLength += (long)len;
if (messageLength > maxMessageLength) {
System.out.println("报文长度[" + messageLength + "]大于最大长度[" + maxMessageLength + "]");
}
}
String str = new String(os.toByteArray(), "UTF-8");
System.out.println("响应数据2: " + str);
// 设置服务端响应的编码格式,否则在客户端收到的可能是乱码
if ("GET".equals(arg0.getRequestMethod())) {
arg0.getResponseHeaders().set("Content-Type", String.valueOf(arg0.getRequestHeaders().get("Content-Type")));
}
arg0.sendResponseHeaders(200, resp.getBytes("UTF-8").length);
out = arg0.getResponseBody();
out.write(resp.getBytes());
out.flush();
} catch (Exception e) {
System.out.println("HttpSvr处理失败["+ e.getMessage() +"]");
throw e;
} finally {
if (null != out) {
arg0.close();
}
if (null != br) {
br.close();
}
if (null != requestBody) {
requestBody.close();
}
}
}
}
Http Cli端:
package http;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpCliStudy {
public static void main(String[] args) throws IOException {
URL url = null;
HttpURLConnection urlConnection = null;
InputStream in = null;
OutputStream os = null;
BufferedReader bufferedReader = null;
try {
url = new URL("http://localhost:8887/zwc/HttpTest");
urlConnection = (HttpURLConnection)url.openConnection();
// 设置请求方法(POST or GET)
urlConnection.setRequestMethod("POST");
// 设置数据格式
urlConnection.setRequestProperty("Content-Type", "application/json");
urlConnection.setDoInput(true);
urlConnection.setDoOutput(true);
urlConnection.setUseCaches(false);
os = urlConnection.getOutputStream();
os.write("请求数据".getBytes());
os.flush();
in = urlConnection.getInputStream();
bufferedReader = new BufferedReader(new InputStreamReader(in));
StringBuilder stringBuilder = new StringBuilder();
String retStr;
while((retStr = bufferedReader.readLine()) != null){
stringBuilder.append(retStr);
}
System.out.println("响应数据:" + stringBuilder.toString());
} catch (Exception e) {
System.out.println("HttpCli处理失败["+ e.getMessage() +"]");
throw e;
} finally {
if (null != bufferedReader) {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != os) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != urlConnection) {
urlConnection.disconnect();
}
}
}
}
Postman测试(使用Postman测试需要注意,请求头中必须要有Content-Length属性):