Java HTTP通讯

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属性):

 

 

猜你喜欢

转载自blog.csdn.net/zhangwenchao0814/article/details/108822320
今日推荐