一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

基于Mina的Http Server以及簡(jiǎn)單的Http請(qǐng)求客戶端

 ricosxf 2014-07-24
     目的:
    Java平臺(tái)下的內(nèi)部組件之間的通信。
    1.WebService 由于感覺本身Java平臺(tái)下的Web Service標(biāo)準(zhǔn)就不夠統(tǒng)一,相互之間的調(diào)用就會(huì)有一些問題,更不用說與.net等其他平臺(tái)了。而且WebService也是對(duì)HTTP請(qǐng)求的一次封裝,效率上肯定會(huì)有損失,所以就不考慮用WebService了。
    2.Socket,包括Java原生的Socket API和nio,本身都很好,效率也會(huì)不錯(cuò),它們之間的區(qū)別大概就是資源占用上了。但是使用Socket的通信,有幾個(gè)比較復(fù)雜的地方是:1)協(xié)議解析,要訂協(xié)議,解析及序列化2)粘包分包的處理(這個(gè)在長(zhǎng)連接的情況下才會(huì)出現(xiàn),可以不在考慮范圍內(nèi))3)資源的管理,弄不好的話會(huì)導(dǎo)致CPU占用較高或者內(nèi)存不知不覺泄露。
    3.HTTP通信。由于應(yīng)用是獨(dú)立的,不能依托于Web容器。Java原生的HttpServer API好像不推薦使用(藏在好深的一個(gè)包里com.sun.net.httpserver.*)。
    4.話說Mina的效率很高,是基于nio的異步通信,封裝簡(jiǎn)化了好多。通過比較簡(jiǎn)單的包裝就可以組成一個(gè)HTTP Server(下面例子中就是按照Mina官方提供的demo,自己改動(dòng)了幾點(diǎn)形成的)。然后HTTP的Client端也隨便封裝下就是了。

步驟
1.封裝HTTP請(qǐng)求消息類和響應(yīng)消息類
Java代碼  收藏代碼
  1. package com.ajita.httpserver;  
  2.   
  3. import java.util.Map;  
  4. import java.util.Map.Entry;  
  5.   
  6. /** 
  7.  * 使用Mina解析出的HTTP請(qǐng)求對(duì)象 
  8.  *  
  9.  * @author Ajita 
  10.  *  
  11.  */  
  12. public class HttpRequestMessage {  
  13.     /** 
  14.      * HTTP請(qǐng)求的主要屬性及內(nèi)容 
  15.      */  
  16.     private Map<String, String[]> headers = null;  
  17.   
  18.     public Map<String, String[]> getHeaders() {  
  19.         return headers;  
  20.     }  
  21.   
  22.     public void setHeaders(Map<String, String[]> headers) {  
  23.         this.headers = headers;  
  24.     }  
  25.   
  26.     /** 
  27.      * 獲取HTTP請(qǐng)求的Context信息 
  28.      */  
  29.     public String getContext() {  
  30.         String[] context = headers.get("Context");  
  31.         return context == null ? "" : context[0];  
  32.     }  
  33.   
  34.     /** 
  35.      * 根據(jù)屬性名稱獲得屬性值數(shù)組第一個(gè)值,用于在url中傳遞的參數(shù) 
  36.      */  
  37.     public String getParameter(String name) {  
  38.         String[] param = headers.get("@".concat(name));  
  39.         return param == null ? "" : param[0];  
  40.     }  
  41.   
  42.     /** 
  43.      * 根據(jù)屬性名稱獲得屬性值,用于在url中傳遞的參數(shù) 
  44.      */  
  45.     public String[] getParameters(String name) {  
  46.         String[] param = headers.get("@".concat(name));  
  47.         return param == null ? new String[] {} : param;  
  48.     }  
  49.   
  50.     /** 
  51.      * 根據(jù)屬性名稱獲得屬性值,用于請(qǐng)求的特征參數(shù) 
  52.      */  
  53.     public String[] getHeader(String name) {  
  54.         return headers.get(name);  
  55.     }  
  56.   
  57.     @Override  
  58.     public String toString() {  
  59.         StringBuilder str = new StringBuilder();  
  60.   
  61.         for (Entry<String, String[]> e : headers.entrySet()) {  
  62.             str.append(e.getKey() + " : " + arrayToString(e.getValue(), ',')  
  63.                     + "\n");  
  64.         }  
  65.         return str.toString();  
  66.     }  
  67.   
  68.     /** 
  69.      * 靜態(tài)方法,用來把一個(gè)字符串?dāng)?shù)組拼接成一個(gè)字符串 
  70.      *  
  71.      * @param s要拼接的字符串?dāng)?shù)組 
  72.      * @param sep數(shù)據(jù)元素之間的煩惱歌負(fù) 
  73.      * @return 拼接成的字符串 
  74.      */  
  75.     public static String arrayToString(String[] s, char sep) {  
  76.         if (s == null || s.length == 0) {  
  77.             return "";  
  78.         }  
  79.         StringBuffer buf = new StringBuffer();  
  80.         if (s != null) {  
  81.             for (int i = 0; i < s.length; i++) {  
  82.                 if (i > 0) {  
  83.                     buf.append(sep);  
  84.                 }  
  85.                 buf.append(s[i]);  
  86.             }  
  87.         }  
  88.         return buf.toString();  
  89.     }  
  90.   
  91. }  
  92.   
  93. package com.ajita.httpserver;  
  94.   
  95.   
  96. import java.io.ByteArrayOutputStream;  
  97. import java.io.IOException;  
  98. import java.text.SimpleDateFormat;  
  99. import java.util.Date;  
  100. import java.util.HashMap;  
  101. import java.util.Map;  
  102.   
  103. import org.apache.mina.core.buffer.IoBuffer;  
  104.   
  105. public class HttpResponseMessage {  
  106.     /** HTTP response codes */  
  107.     public static final int HTTP_STATUS_SUCCESS = 200;  
  108.   
  109.     public static final int HTTP_STATUS_NOT_FOUND = 404;  
  110.   
  111.     /** Map<String, String> */  
  112.     private final Map<String, String> headers = new HashMap<String, String>();  
  113.   
  114.     /** Storage for body of HTTP response. */  
  115.     private final ByteArrayOutputStream body = new ByteArrayOutputStream(1024);  
  116.   
  117.     private int responseCode = HTTP_STATUS_SUCCESS;  
  118.   
  119.     public HttpResponseMessage() {  
  120.         // headers.put("Server", "HttpServer (" + Server.VERSION_STRING + ')');  
  121.         headers.put("Server", "HttpServer (" + "Mina 2.0" + ')');  
  122.         headers.put("Cache-Control", "private");  
  123.         headers.put("Content-Type", "text/html; charset=iso-8859-1");  
  124.         headers.put("Connection", "keep-alive");  
  125.         headers.put("Keep-Alive", "200");  
  126.         headers.put("Date", new SimpleDateFormat(  
  127.                 "EEE, dd MMM yyyy HH:mm:ss zzz").format(new Date()));  
  128.         headers.put("Last-Modified", new SimpleDateFormat(  
  129.                 "EEE, dd MMM yyyy HH:mm:ss zzz").format(new Date()));  
  130.     }  
  131.   
  132.     public Map<String, String> getHeaders() {  
  133.         return headers;  
  134.     }  
  135.   
  136.     public void setContentType(String contentType) {  
  137.         headers.put("Content-Type", contentType);  
  138.     }  
  139.   
  140.     public void setResponseCode(int responseCode) {  
  141.         this.responseCode = responseCode;  
  142.     }  
  143.   
  144.     public int getResponseCode() {  
  145.         return this.responseCode;  
  146.     }  
  147.   
  148.     public void appendBody(byte[] b) {  
  149.         try {  
  150.             body.write(b);  
  151.         } catch (IOException ex) {  
  152.             ex.printStackTrace();  
  153.         }  
  154.     }  
  155.   
  156.     public void appendBody(String s) {  
  157.         try {  
  158.             body.write(s.getBytes());  
  159.         } catch (IOException ex) {  
  160.             ex.printStackTrace();  
  161.         }  
  162.     }  
  163.   
  164.     public IoBuffer getBody() {  
  165.         return IoBuffer.wrap(body.toByteArray());  
  166.     }  
  167.   
  168.     public int getBodyLength() {  
  169.         return body.size();  
  170.     }  
  171.   
  172. }  

2.封裝Mina的解析HTTP請(qǐng)求和發(fā)送HTTP響應(yīng)的編碼類和解碼類
Java代碼  收藏代碼
  1. package com.ajita.httpserver;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.IOException;  
  5. import java.io.StringReader;  
  6. import java.nio.charset.CharacterCodingException;  
  7. import java.nio.charset.Charset;  
  8. import java.nio.charset.CharsetDecoder;  
  9. import java.util.HashMap;  
  10. import java.util.Map;  
  11.   
  12. import org.apache.mina.core.buffer.IoBuffer;  
  13. import org.apache.mina.core.session.IoSession;  
  14. import org.apache.mina.filter.codec.ProtocolDecoderOutput;  
  15. import org.apache.mina.filter.codec.demux.MessageDecoderAdapter;  
  16. import org.apache.mina.filter.codec.demux.MessageDecoderResult;  
  17.   
  18. public class HttpRequestDecoder extends MessageDecoderAdapter {  
  19.     private static final byte[] CONTENT_LENGTH = new String("Content-Length:")  
  20.             .getBytes();  
  21.     static String defaultEncoding;  
  22.     private CharsetDecoder decoder;  
  23.   
  24.     public CharsetDecoder getDecoder() {  
  25.         return decoder;  
  26.     }  
  27.   
  28.     public void setEncoder(CharsetDecoder decoder) {  
  29.         this.decoder = decoder;  
  30.     }  
  31.   
  32.     private HttpRequestMessage request = null;  
  33.   
  34.     public HttpRequestDecoder() {  
  35.         decoder = Charset.forName(defaultEncoding).newDecoder();  
  36.     }  
  37.   
  38.     public MessageDecoderResult decodable(IoSession session, IoBuffer in) {  
  39.         try {  
  40.             return messageComplete(in) ? MessageDecoderResult.OK  
  41.                     : MessageDecoderResult.NEED_DATA;  
  42.         } catch (Exception ex) {  
  43.             ex.printStackTrace();  
  44.         }  
  45.   
  46.         return MessageDecoderResult.NOT_OK;  
  47.     }  
  48.   
  49.     public MessageDecoderResult decode(IoSession session, IoBuffer in,  
  50.             ProtocolDecoderOutput out) throws Exception {  
  51.         HttpRequestMessage m = decodeBody(in);  
  52.   
  53.         // Return NEED_DATA if the body is not fully read.  
  54.         if (m == null) {  
  55.             return MessageDecoderResult.NEED_DATA;  
  56.         }  
  57.   
  58.         out.write(m);  
  59.   
  60.         return MessageDecoderResult.OK;  
  61.   
  62.     }  
  63.   
  64.     /* 
  65.      * 判斷HTTP請(qǐng)求是否完整,若格式有錯(cuò)誤直接拋出異常 
  66.      */  
  67.     private boolean messageComplete(IoBuffer in) {  
  68.         int last = in.remaining() - 1;  
  69.         if (in.remaining() < 4) {  
  70.             return false;  
  71.         }  
  72.   
  73.         // to speed up things we check if the Http request is a GET or POST  
  74.         if (in.get(0) == (byte) 'G' && in.get(1) == (byte) 'E'  
  75.                 && in.get(2) == (byte) 'T') {  
  76.             // Http GET request therefore the last 4 bytes should be 0x0D 0x0A  
  77.             // 0x0D 0x0A  
  78.             return in.get(last) == (byte) 0x0A  
  79.                     && in.get(last - 1) == (byte) 0x0D  
  80.                     && in.get(last - 2) == (byte) 0x0A  
  81.                     && in.get(last - 3) == (byte) 0x0D;  
  82.         } else if (in.get(0) == (byte) 'P' && in.get(1) == (byte) 'O'  
  83.                 && in.get(2) == (byte) 'S' && in.get(3) == (byte) 'T') {  
  84.             // Http POST request  
  85.             // first the position of the 0x0D 0x0A 0x0D 0x0A bytes  
  86.             int eoh = -1;  
  87.             for (int i = last; i > 2; i--) {  
  88.                 if (in.get(i) == (byte) 0x0A && in.get(i - 1) == (byte) 0x0D  
  89.                         && in.get(i - 2) == (byte) 0x0A  
  90.                         && in.get(i - 3) == (byte) 0x0D) {  
  91.                     eoh = i + 1;  
  92.                     break;  
  93.                 }  
  94.             }  
  95.             if (eoh == -1) {  
  96.                 return false;  
  97.             }  
  98.             for (int i = 0; i < last; i++) {  
  99.                 boolean found = false;  
  100.                 for (int j = 0; j < CONTENT_LENGTH.length; j++) {  
  101.                     if (in.get(i + j) != CONTENT_LENGTH[j]) {  
  102.                         found = false;  
  103.                         break;  
  104.                     }  
  105.                     found = true;  
  106.                 }  
  107.                 if (found) {  
  108.                     // retrieve value from this position till next 0x0D 0x0A  
  109.                     StringBuilder contentLength = new StringBuilder();  
  110.                     for (int j = i + CONTENT_LENGTH.length; j < last; j++) {  
  111.                         if (in.get(j) == 0x0D) {  
  112.                             break;  
  113.                         }  
  114.                         contentLength.append(new String(  
  115.                                 new byte[] { in.get(j) }));  
  116.                     }  
  117.                     // if content-length worth of data has been received then  
  118.                     // the message is complete  
  119.                     return Integer.parseInt(contentLength.toString().trim())  
  120.                             + eoh == in.remaining();  
  121.                 }  
  122.             }  
  123.         }  
  124.   
  125.         // the message is not complete and we need more data  
  126.         return false;  
  127.   
  128.     }  
  129.   
  130.     private HttpRequestMessage decodeBody(IoBuffer in) {  
  131.         request = new HttpRequestMessage();  
  132.         try {  
  133.             request.setHeaders(parseRequest(new StringReader(in  
  134.                     .getString(decoder))));  
  135.             return request;  
  136.         } catch (CharacterCodingException ex) {  
  137.             ex.printStackTrace();  
  138.         }  
  139.   
  140.         return null;  
  141.   
  142.     }  
  143.   
  144.     private Map<String, String[]> parseRequest(StringReader is) {  
  145.         Map<String, String[]> map = new HashMap<String, String[]>();  
  146.         BufferedReader rdr = new BufferedReader(is);  
  147.   
  148.         try {  
  149.             // Get request URL.  
  150.             String line = rdr.readLine();  
  151.             String[] url = line.split(" ");  
  152.             if (url.length < 3) {  
  153.                 return map;  
  154.             }  
  155.   
  156.             map.put("URI", new String[] { line });  
  157.             map.put("Method", new String[] { url[0].toUpperCase() });  
  158.             map.put("Context", new String[] { url[1].substring(1) });  
  159.             map.put("Protocol", new String[] { url[2] });  
  160.             // Read header  
  161.             while ((line = rdr.readLine()) != null && line.length() > 0) {  
  162.                 String[] tokens = line.split(": ");  
  163.                 map.put(tokens[0], new String[] { tokens[1] });  
  164.             }  
  165.   
  166.             // If method 'POST' then read Content-Length worth of data  
  167.             if (url[0].equalsIgnoreCase("POST")) {  
  168.                 int len = Integer.parseInt(map.get("Content-Length")[0]);  
  169.                 char[] buf = new char[len];  
  170.                 if (rdr.read(buf) == len) {  
  171.                     line = String.copyValueOf(buf);  
  172.                 }  
  173.             } else if (url[0].equalsIgnoreCase("GET")) {  
  174.                 int idx = url[1].indexOf('?');  
  175.                 if (idx != -1) {  
  176.                     map.put("Context",  
  177.                             new String[] { url[1].substring(1, idx) });  
  178.                     line = url[1].substring(idx + 1);  
  179.                 } else {  
  180.                     line = null;  
  181.                 }  
  182.             }  
  183.             if (line != null) {  
  184.                 String[] match = line.split("\\&");  
  185.                 for (String element : match) {  
  186.                     String[] params = new String[1];  
  187.                     String[] tokens = element.split("=");  
  188.                     switch (tokens.length) {  
  189.                     case 0:  
  190.                         map.put("@".concat(element), new String[] {});  
  191.                         break;  
  192.                     case 1:  
  193.                         map.put("@".concat(tokens[0]), new String[] {});  
  194.                         break;  
  195.                     default:  
  196.                         String name = "@".concat(tokens[0]);  
  197.                         if (map.containsKey(name)) {  
  198.                             params = map.get(name);  
  199.                             String[] tmp = new String[params.length + 1];  
  200.                             for (int j = 0; j < params.length; j++) {  
  201.                                 tmp[j] = params[j];  
  202.                             }  
  203.                             params = null;  
  204.                             params = tmp;  
  205.                         }  
  206.                         params[params.length - 1] = tokens[1].trim();  
  207.                         map.put(name, params);  
  208.                     }  
  209.                 }  
  210.             }  
  211.         } catch (IOException ex) {  
  212.             ex.printStackTrace();  
  213.         }  
  214.   
  215.         return map;  
  216.     }  
  217.   
  218. }  
  219. package com.ajita.httpserver;  
  220.   
  221.   
  222. import java.io.ByteArrayOutputStream;  
  223. import java.io.IOException;  
  224. import java.text.SimpleDateFormat;  
  225. import java.util.Date;  
  226. import java.util.HashMap;  
  227. import java.util.Map;  
  228.   
  229. import org.apache.mina.core.buffer.IoBuffer;  
  230.   
  231. public class HttpResponseMessage {  
  232.     /** HTTP response codes */  
  233.     public static final int HTTP_STATUS_SUCCESS = 200;  
  234.   
  235.     public static final int HTTP_STATUS_NOT_FOUND = 404;  
  236.   
  237.     /** Map<String, String> */  
  238.     private final Map<String, String> headers = new HashMap<String, String>();  
  239.   
  240.     /** Storage for body of HTTP response. */  
  241.     private final ByteArrayOutputStream body = new ByteArrayOutputStream(1024);  
  242.   
  243.     private int responseCode = HTTP_STATUS_SUCCESS;  
  244.   
  245.     public HttpResponseMessage() {  
  246.         // headers.put("Server", "HttpServer (" + Server.VERSION_STRING + ')');  
  247.         headers.put("Server", "HttpServer (" + "Mina 2.0" + ')');  
  248.         headers.put("Cache-Control", "private");  
  249.         headers.put("Content-Type", "text/html; charset=iso-8859-1");  
  250.         headers.put("Connection", "keep-alive");  
  251.         headers.put("Keep-Alive", "200");  
  252.         headers.put("Date", new SimpleDateFormat(  
  253.                 "EEE, dd MMM yyyy HH:mm:ss zzz").format(new Date()));  
  254.         headers.put("Last-Modified", new SimpleDateFormat(  
  255.                 "EEE, dd MMM yyyy HH:mm:ss zzz").format(new Date()));  
  256.     }  
  257.   
  258.     public Map<String, String> getHeaders() {  
  259.         return headers;  
  260.     }  
  261.   
  262.     public void setContentType(String contentType) {  
  263.         headers.put("Content-Type", contentType);  
  264.     }  
  265.   
  266.     public void setResponseCode(int responseCode) {  
  267.         this.responseCode = responseCode;  
  268.     }  
  269.   
  270.     public int getResponseCode() {  
  271.         return this.responseCode;  
  272.     }  
  273.   
  274.     public void appendBody(byte[] b) {  
  275.         try {  
  276.             body.write(b);  
  277.         } catch (IOException ex) {  
  278.             ex.printStackTrace();  
  279.         }  
  280.     }  
  281.   
  282.     public void appendBody(String s) {  
  283.         try {  
  284.             body.write(s.getBytes());  
  285.         } catch (IOException ex) {  
  286.             ex.printStackTrace();  
  287.         }  
  288.     }  
  289.   
  290.     public IoBuffer getBody() {  
  291.         return IoBuffer.wrap(body.toByteArray());  
  292.     }  
  293.   
  294.     public int getBodyLength() {  
  295.         return body.size();  
  296.     }  
  297.   
  298. }  

3.封裝HTTP的Server類及HTTP的Handler處理接口,其中HttpHandler接口是要暴露給外部就行自定義處理的。
Java代碼  收藏代碼
  1. package com.ajita.httpserver;  
  2.   
  3. import java.io.IOException;  
  4. import java.net.InetSocketAddress;  
  5.   
  6. import org.apache.mina.filter.codec.ProtocolCodecFilter;  
  7. import org.apache.mina.filter.logging.LoggingFilter;  
  8. import org.apache.mina.transport.socket.nio.NioSocketAcceptor;  
  9.   
  10. public class HttpServer {  
  11.     /** Default HTTP port */  
  12.     private static final int DEFAULT_PORT = 8080;  
  13.     private NioSocketAcceptor acceptor;  
  14.     private boolean isRunning;  
  15.   
  16.     private String encoding;  
  17.     private HttpHandler httpHandler;  
  18.   
  19.     public String getEncoding() {  
  20.         return encoding;  
  21.     }  
  22.   
  23.     public void setEncoding(String encoding) {  
  24.         this.encoding = encoding;  
  25.         HttpRequestDecoder.defaultEncoding = encoding;  
  26.         HttpResponseEncoder.defaultEncoding = encoding;  
  27.     }  
  28.   
  29.     public HttpHandler getHttpHandler() {  
  30.         return httpHandler;  
  31.     }  
  32.   
  33.     public void setHttpHandler(HttpHandler httpHandler) {  
  34.         this.httpHandler = httpHandler;  
  35.     }  
  36.   
  37.     /** 
  38.      * 啟動(dòng)HTTP服務(wù)端箭筒HTTP請(qǐng)求 
  39.      *  
  40.      * @param port要監(jiān)聽的端口號(hào) 
  41.      * @throws IOException 
  42.      */  
  43.     public void run(int port) throws IOException {  
  44.         synchronized (this) {  
  45.             if (isRunning) {  
  46.                 System.out.println("Server is already running.");  
  47.                 return;  
  48.             }  
  49.             acceptor = new NioSocketAcceptor();  
  50.             acceptor.getFilterChain().addLast(  
  51.                     "protocolFilter",  
  52.                     new ProtocolCodecFilter(  
  53.                             new HttpServerProtocolCodecFactory()));  
  54.             // acceptor.getFilterChain().addLast("logger", new LoggingFilter());  
  55.             ServerHandler handler = new ServerHandler();  
  56.             handler.setHandler(httpHandler);  
  57.             acceptor.setHandler(handler);  
  58.             acceptor.bind(new InetSocketAddress(port));  
  59.             isRunning = true;  
  60.             System.out.println("Server now listening on port " + port);  
  61.         }  
  62.     }  
  63.   
  64.     /** 
  65.      * 使用默認(rèn)端口8080 
  66.      *  
  67.      * @throws IOException 
  68.      */  
  69.     public void run() throws IOException {  
  70.         run(DEFAULT_PORT);  
  71.     }  
  72.   
  73.     /** 
  74.      * 停止監(jiān)聽HTTP服務(wù) 
  75.      */  
  76.     public void stop() {  
  77.         synchronized (this) {  
  78.             if (!isRunning) {  
  79.                 System.out.println("Server is already stoped.");  
  80.                 return;  
  81.             }  
  82.             isRunning = false;  
  83.             try {  
  84.                 acceptor.unbind();  
  85.                 acceptor.dispose();  
  86.                 System.out.println("Server is stoped.");  
  87.             } catch (Exception e) {  
  88.                 e.printStackTrace();  
  89.             }  
  90.         }  
  91.     }  
  92.   
  93.     public static void main(String[] args) {  
  94.         int port = DEFAULT_PORT;  
  95.   
  96.         for (int i = 0; i < args.length; i++) {  
  97.             if (args[i].equals("-port")) {  
  98.                 port = Integer.parseInt(args[i + 1]);  
  99.             }  
  100.         }  
  101.   
  102.         try {  
  103.             // Create an acceptor  
  104.             NioSocketAcceptor acceptor = new NioSocketAcceptor();  
  105.   
  106.             // Create a service configuration  
  107.             acceptor.getFilterChain().addLast(  
  108.                     "protocolFilter",  
  109.                     new ProtocolCodecFilter(  
  110.                             new HttpServerProtocolCodecFactory()));  
  111.             acceptor.getFilterChain().addLast("logger", new LoggingFilter());  
  112.             acceptor.setHandler(new ServerHandler());  
  113.             acceptor.bind(new InetSocketAddress(port));  
  114.   
  115.             System.out.println("Server now listening on port " + port);  
  116.         } catch (Exception ex) {  
  117.             ex.printStackTrace();  
  118.         }  
  119.     }  
  120. }  
  121.   
  122. package com.ajita.httpserver;  
  123.   
  124. import org.apache.mina.filter.codec.demux.DemuxingProtocolCodecFactory;  
  125.   
  126. public class HttpServerProtocolCodecFactory extends  
  127.         DemuxingProtocolCodecFactory {  
  128.     public HttpServerProtocolCodecFactory() {  
  129.         super.addMessageDecoder(HttpRequestDecoder.class);  
  130.         super.addMessageEncoder(HttpResponseMessage.class,  
  131.                 HttpResponseEncoder.class);  
  132.     }  
  133.   
  134. }  
  135.   
  136. package com.ajita.httpserver;  
  137.   
  138. import org.apache.mina.core.future.IoFutureListener;  
  139. import org.apache.mina.core.service.IoHandlerAdapter;  
  140. import org.apache.mina.core.session.IdleStatus;  
  141. import org.apache.mina.core.session.IoSession;  
  142.   
  143. public class ServerHandler extends IoHandlerAdapter {  
  144.     private HttpHandler handler;  
  145.   
  146.     public HttpHandler getHandler() {  
  147.         return handler;  
  148.     }  
  149.   
  150.     public void setHandler(HttpHandler handler) {  
  151.         this.handler = handler;  
  152.     }  
  153.   
  154.     @Override  
  155.     public void sessionOpened(IoSession session) {  
  156.         // set idle time to 60 seconds  
  157.         session.getConfig().setIdleTime(IdleStatus.BOTH_IDLE, 60);  
  158.     }  
  159.   
  160.     @Override  
  161.     public void messageReceived(IoSession session, Object message) {  
  162.         // Check that we can service the request context  
  163.         HttpRequestMessage request = (HttpRequestMessage) message;  
  164.         HttpResponseMessage response = handler.handle(request);  
  165.         // HttpResponseMessage response = new HttpResponseMessage();  
  166.         // response.setContentType("text/plain");  
  167.         // response.setResponseCode(HttpResponseMessage.HTTP_STATUS_SUCCESS);  
  168.         // response.appendBody("CONNECTED");  
  169.   
  170.         // msg.setResponseCode(HttpResponseMessage.HTTP_STATUS_SUCCESS);  
  171.         // byte[] b = new byte[ta.buffer.limit()];  
  172.         // ta.buffer.rewind().get(b);  
  173.         // msg.appendBody(b);  
  174.         // System.out.println("####################");  
  175.         // System.out.println("  GET_TILE RESPONSE SENT - ATTACHMENT GOOD DIAMOND.SI="+d.si+  
  176.         // ", "+new  
  177.         // java.text.SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss.SSS").format(new  
  178.         // java.util.Date()));  
  179.         // System.out.println("#################### - status="+ta.state+", index="+message.getIndex());  
  180.   
  181.         // // Unknown request  
  182.         // response = new HttpResponseMessage();  
  183.         // response.setResponseCode(HttpResponseMessage.HTTP_STATUS_NOT_FOUND);  
  184.         // response.appendBody(String.format(  
  185.         // "<html><body><h1>UNKNOWN REQUEST %d</h1></body></html>",  
  186.         // HttpResponseMessage.HTTP_STATUS_NOT_FOUND));  
  187.   
  188.         if (response != null) {  
  189.             session.write(response).addListener(IoFutureListener.CLOSE);  
  190.         }  
  191.     }  
  192.   
  193.     @Override  
  194.     public void sessionIdle(IoSession session, IdleStatus status) {  
  195.         session.close(false);  
  196.     }  
  197.   
  198.     @Override  
  199.     public void exceptionCaught(IoSession session, Throwable cause) {  
  200.         session.close(false);  
  201.     }  
  202. }  
  203.   
  204. package com.ajita.httpserver;  
  205.   
  206. /** 
  207.  * HTTP請(qǐng)求的處理接口 
  208.  *  
  209.  * @author Ajita 
  210.  *  
  211.  */  
  212. public interface HttpHandler {  
  213.     /** 
  214.      * 自定義HTTP請(qǐng)求處理需要實(shí)現(xiàn)的方法 
  215.      * @param request 一個(gè)HTTP請(qǐng)求對(duì)象 
  216.      * @return HTTP請(qǐng)求處理后的返回結(jié)果 
  217.      */  
  218.     HttpResponseMessage handle(HttpRequestMessage request);  
  219. }  


4.HTTP Client端,網(wǎng)上一抓一大把,就不說了

5.測(cè)試
建立測(cè)試類如下
Java代碼  收藏代碼
  1. package com.jita;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import com.ajita.httpserver.HttpHandler;  
  6. import com.ajita.httpserver.HttpRequestMessage;  
  7. import com.ajita.httpserver.HttpResponseMessage;  
  8. import com.ajita.httpserver.HttpServer;  
  9.   
  10. public class TestHttpServer {  
  11.     public static void main(String[] args) throws IOException,  
  12.             InterruptedException {  
  13.         HttpServer server = new HttpServer();  
  14.         server.setEncoding("GB2312");  
  15.         server.setHttpHandler(new HttpHandler() {  
  16.             public HttpResponseMessage handle(HttpRequestMessage request) {  
  17.                 String level = request.getParameter("level");  
  18.                 System.out.println(request.getParameter("level"));  
  19.                 System.out.println(request.getContext());  
  20.                 HttpResponseMessage response = new HttpResponseMessage();  
  21.                 response.setContentType("text/plain");  
  22.                 response.setResponseCode(HttpResponseMessage.HTTP_STATUS_SUCCESS);  
  23.                 response.appendBody("CONNECTED\n");  
  24.                 response.appendBody(level);  
  25.                 return response;  
  26.             }  
  27.         });  
  28.         server.run();  
  29.   
  30.         //Thread.sleep(10000);  
  31.         // server.stop();  
  32.     }  
  33. }  


啟動(dòng),在瀏覽器中輸入HTTP請(qǐng)求如:http://192.168.13.242:8080/test.do?level=aaa


附件是完整的代碼。 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    久久国产亚洲精品赲碰热| 欧美大胆美女a级视频| 在线九月婷婷丁香伊人| 久久国产成人精品国产成人亚洲| 日韩中文高清在线专区| 日韩aa一区二区三区| 日本不卡一本二本三区| 东京热男人的天堂久久综合| 日本不卡在线视频你懂的| 加勒比人妻精品一区二区| 麻豆在线观看一区二区| 日本欧美视频在线观看免费| 久久福利视频视频一区二区| 蜜桃av人妻精品一区二区三区| 空之色水之色在线播放| 国产成人精品视频一区二区三区| 国产永久免费高清在线精品| 国产一级不卡视频在线观看| 正在播放玩弄漂亮少妇高潮| 亚洲一区二区精品免费| 亚洲av熟女一区二区三区蜜桃| 中文字幕精品一区二区年下载| 一本久道久久综合中文字幕| 不卡一区二区高清视频| 国产精品成人免费精品自在线观看| 91熟女大屁股偷偷对白| 国产精品伦一区二区三区在线| 国产又粗又猛又大爽又黄| 精品久久av一二三区| 日韩一区二区三区嘿嘿| 日韩精品免费一区二区三区| 翘臀少妇成人一区二区| 一区二区福利在线视频| 国产熟女一区二区三区四区| 手机在线不卡国产视频| 成人日韩在线播放视频| 在线日韩欧美国产自拍| 91精品国产综合久久不卡| 一区二区三区亚洲国产| 国产户外勾引精品露出一区 | 免费亚洲黄色在线观看|