日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java—手写服务器

發布時間:2023/12/15 java 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java—手写服务器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.預備知識_Socket知識回顧

1.1編寫服務器用到的知識點

1)Socket編程
2)HTML
3)HTTP協議
4)反射
5)XML解析
6)服務器編寫

1.2復習Socket編程

1)C/S結構:客戶端與服務器端一次雙向通信
2)B/S結構:瀏覽器與服務器

httpClient_1

Client.java

package com.bjsxt.test;import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException;public class Client {public static void main(String[] args) {//(1)創建Socket對象Socket client=null;//(2)獲取輸出流-->請求DataOutputStream dos=null;DataInputStream dis=null;try {client = new Socket("localhost", 8888);dos = new DataOutputStream(client.getOutputStream());dos.writeUTF("我是客戶端:服務器你好!");//(3)獲取輸入流-->響應dis = new DataInputStream(client.getInputStream());System.out.println(dis.readUTF());} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{//(4)關閉流IOClose.closeAll(dis,dos,client);}} }

IOClose.java

package com.bjsxt.test;import java.io.Closeable; import java.io.IOException;public class IOClose {//關閉全部的工具類public static void closeAll(Closeable...c){for (Closeable closeable : c) {if (closeable!=null) {try {closeable.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}} }

httpServer_1

Server.java

package com.bjsxt.server;import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket;public class Server {public static void main(String[] args) {//(1)創建ServerSocket對象ServerSocket server=null;//(2)監聽是否有客戶端發送請求Socket client=null;//(3)獲取Scoket對象//(4)獲取輸入流 -->得到客戶端的請求DataInputStream dis=null;DataOutputStream dos=null;try {server = new ServerSocket(8888);client = server.accept();dis = new DataInputStream(client.getInputStream());System.out.println(dis.readUTF());//(5)獲取輸出流-->給客戶端響應結果dos = new DataOutputStream(client.getOutputStream());dos.writeUTF("客戶端您好:我是服務器,我收到了你的信息");} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{//(6)關閉流IOClose.closeAll(dos,dis,client,server);}} }

IOClose.java

package com.bjsxt.server;import java.io.Closeable; import java.io.IOException;public class IOClose {//關閉全部的工具類public static void closeAll(Closeable...c){for (Closeable closeable : c) {if (closeable!=null) {try {closeable.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}} }

Server2.java

package com.bjsxt.server;import java.io.BufferedReader; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket;public class Server2 {public static void main(String[] args) {//(1)創建ServerSocket對象ServerSocket server=null;//(2)監聽是否有客戶端發送請求Socket client=null;BufferedReader br=null;try {server = new ServerSocket(8888);client = server.accept();//獲取來自瀏覽器的請求信息br=new BufferedReader(new InputStreamReader(client.getInputStream(), "utf-8"));String str=null;while((str=br.readLine()).length()>0){System.out.println(str);}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{//(6)關閉流IOClose.closeAll(br,client,server);}} }

2. 預備知識_HTML 簡單入門

2.1HTML

HTML: HyperText Markup Language 超文本標記語言用于描述網頁文檔的一種標記語言

2.2 第一個 HTML 文檔

<html><head><title>第一個 HTML</title></head><body><h1>hello world</h1></body> </html>

2.3 表單 form

作用:與用戶之間進行交互
method:請求方式 get/post
get 數據量小,安全性低,默認方式
post 數據量大,安全性高
action:請求的服務器路徑

<form action="http://localhost:8888/index.html" method="post"><p>用戶名:<input type="text" name="uname" id="name"/></p><p>密碼 :<input type="password" name="pwd" id="pass"/></p><p><input type="submit" value="登錄" /> </p> </form>

id : (用戶的的瀏覽器在文檔里區分唯一性)前端區分唯一性,js 中
name:名稱,后端(服務器)區分唯一性,獲取值,只要提交數據
給后臺(服務器)必須存在 name

httpServer_2

Server.java

package com.bjsxt.server;import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket;public class Server {public static void main(String[] args) {//(1)創建ServerSocket對象ServerSocket server=null;//(2)監聽是否有客戶端發送請求Socket client=null;//(3)獲取Scoket對象//(4)獲取輸入流 -->得到客戶端的請求DataInputStream dis=null;DataOutputStream dos=null;try {server = new ServerSocket(8888);client = server.accept();dis = new DataInputStream(client.getInputStream());System.out.println(dis.readUTF());//(5)獲取輸出流-->給客戶端響應結果dos = new DataOutputStream(client.getOutputStream());dos.writeUTF("客戶端您好:我是服務器,我收到了你的信息");} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{//(6)關閉流IOClose.closeAll(dos,dis,client,server);}} }

Server2.java

package com.bjsxt.server;import java.io.BufferedReader; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket;public class Server2 {public static void main(String[] args) {//(1)創建ServerSocket對象ServerSocket server=null;//(2)監聽是否有客戶端發送請求Socket client=null;BufferedReader br=null;try {server = new ServerSocket(8888);client = server.accept();//獲取來自瀏覽器的請求信息br=new BufferedReader(new InputStreamReader(client.getInputStream(), "utf-8"));String str=null;while((str=br.readLine()).length()>0){System.out.println(str);}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{//(6)關閉流IOClose.closeAll(br,client,server);}} }

Server3.java

package com.bjsxt.server;import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket;public class Server3 {public static void main(String[] args) {//(1)創建ServerSocket對象ServerSocket server=null;//(2)監聽是否有客戶端發送請求Socket client=null;InputStream is=null;try {server = new ServerSocket(8888);client = server.accept();//獲取來自瀏覽器的請求信息is=client.getInputStream();byte [] buf=new byte[20480];int len=is.read(buf);System.out.println(new String(buf,0,len));} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{//(6)關閉流IOClose.closeAll(is,client,server);}} }

IOClose.java

package com.bjsxt.server;import java.io.Closeable; import java.io.IOException;public class IOClose {//關閉全部的工具類public static void closeAll(Closeable...c){for (Closeable closeable : c) {if (closeable!=null) {try {closeable.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}} }

index.html

<html><head><title>我的第一個html</title></head><body><h1>hello world</h1><form action="http://localhost:8888/log" method="get"><p>用戶名:<input type="text" id="uname" name="username" /></p><p>密碼:<input type="password" id="pwd" name="password"/></p><p>興趣愛好<input type="checkbox" name="hobby" value="ball"/><input type="checkbox" name="hobby" value="read"/>讀書<input type="checkbox" name="hobby" value="paint"/>畫畫</p><p><input type="submit" value="登錄"/></p></form></body></html>

3.預備知識_HTTP協議入門

3.1協議

1)應用層:HTTP、FTP、TELNET、SNMP、DNS
2)傳輸層:TCP、UDP
3) 網絡層:IP

3.2HTTP協議簡介

HTTP:Hypertext Transfer Protocol超文本傳輸協議,是網絡應用層的協議,建立在TCP/IP協議基礎上,HTTP使用可靠的TCP連接,默認端口為80.
用戶打開web瀏覽器(常見的HTTP客戶端),輸入URL地址,就能接收到遠程HTTP服務器端發送過來的網頁,即HTTP遵循請求(Request)/應答(Response)模型。web瀏覽器向web服務器發送請求,web服務器處理請求并返回適當的應答,所有HTTP連接都被構造成一套請求與應答。

HTTP客戶端和服務器分別由不同的軟件開發商提供,它們都可以用任意的編程語言編寫,如用.NET 編寫的客戶程序與用Java編寫的服務器程序順利通信,就必須遵守HTTP協議,這樣才能彼此都懂對方發送的消息,HTTP協議嚴格規定了HTTP請求和HTTP響應的數據格式。

3.3HTTP請求格式

1)請求方式、URL(統一資源定位符)、HTTP協議/版本
2)請求頭 Request Header
a)請求頭包含許多有關客戶端環境和請求正文的有用信息。例如,請求頭可以聲明瀏覽器所有的語言,請求正文的長度等。
3)請求正文 Requet Content (只有在 post 方式才有)
請求頭和請求正文之間必須有符號行(回車符或行結束符),將請求頭與請求正文分開,這個行非常重要,它表示 請求頭已結束,接下來的是請求正文。通常post方式的數據存放于此,請求正文中可以包含客戶提交的查詢字符串等信息。在實際應用中,HTTP請求正文可以包含更多的內容。

3.4HTTP 響應格式

  • HTTP 協議版本、狀態代碼、描述
  • 響應頭(Response Head)
  • 響應正文(Respose Content)
  • httpServer_2

    Server.java

    package com.bjsxt.server;import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket;public class Server {public static void main(String[] args) {//(1)創建ServerSocket對象ServerSocket server=null;//(2)監聽是否有客戶端發送請求Socket client=null;//(3)獲取Scoket對象//(4)獲取輸入流 -->得到客戶端的請求DataInputStream dis=null;DataOutputStream dos=null;try {server = new ServerSocket(8888);client = server.accept();dis = new DataInputStream(client.getInputStream());System.out.println(dis.readUTF());//(5)獲取輸出流-->給客戶端響應結果dos = new DataOutputStream(client.getOutputStream());dos.writeUTF("客戶端您好:我是服務器,我收到了你的信息");} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{//(6)關閉流IOClose.closeAll(dos,dis,client,server);}} }

    Server2.java

    package com.bjsxt.server;import java.io.BufferedReader; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket;public class Server2 {public static void main(String[] args) {//(1)創建ServerSocket對象ServerSocket server=null;//(2)監聽是否有客戶端發送請求Socket client=null;BufferedReader br=null;try {server = new ServerSocket(8888);client = server.accept();//獲取來自瀏覽器的請求信息br=new BufferedReader(new InputStreamReader(client.getInputStream(), "utf-8"));String str=null;while((str=br.readLine()).length()>0){System.out.println(str);}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{//(6)關閉流IOClose.closeAll(br,client,server);}} }

    Server3.java

    package com.bjsxt.server;import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket;public class Server3 {public static void main(String[] args) {String CRLF="\r\n";//換行String BLANK=" ";//空格//(1)創建ServerSocket對象ServerSocket server=null;//(2)監聽是否有客戶端發送請求Socket client=null;InputStream is=null;try {server = new ServerSocket(8888);client = server.accept();//獲取來自瀏覽器的請求信息is=client.getInputStream();byte [] buf=new byte[20480];int len=is.read(buf);System.out.println(new String(buf,0,len));/**對Web瀏覽器的請求作出響應*/StringBuilder sb=new StringBuilder();StringBuilder sbContent=new StringBuilder();//響應的文本sbContent.append("<html><head><title>響應結果</title></head>");sbContent.append("<body>登錄成功</body></html>");//(1)拼接響應頭sb.append("HTTP/1.1").append(BLANK).append(200).append(BLANK).append("OK");sb.append(CRLF);//換行sb.append("Content-Type: text/html;charset=utf-8");sb.append(CRLF);//換行sb.append("Content-Length:").append(sbContent.toString().getBytes().length).append(CRLF);sb.append(CRLF);//換行,代表響應頭與響應的正文部門之間的空行sb.append(sbContent);//通過流輸出 BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(client.getOutputStream(),"utf-8"));bw.write(sb.toString());bw.flush();bw.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{//(6)關閉流IOClose.closeAll(is,client,server);}} }

    IOClose.java

    package com.bjsxt.server;import java.io.Closeable; import java.io.IOException;public class IOClose {//關閉全部的工具類public static void closeAll(Closeable...c){for (Closeable closeable : c) {if (closeable!=null) {try {closeable.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}} }

    4.Tomcat服務器的快速使用

    4.1Tomcat簡介

    Tomcat是在SUN公司的JSWDK( JavaServer Web
    DevelopmentKit ,是 SUN 公司推出的小型 Servlet/JSP 調試工
    具)的基礎上發展起來的一個優秀的Servlet容器,Tomcat本身完全用Java語言編寫。

    4.2Tomcat使用

    1)配置Tomcat
    a) JAVA_HOME Java JDK 的根目錄

    b) CATALINA_HOME Tomcat 根目錄

    bin:存放Tomcat腳本目錄

  • 啟動和關閉 Tomcat
    啟動 Tomcat 服務器:startup.bat
    關閉 Tomcat 服務器:shutdown.bat

    conf:存放配置文件

  • conf—>server.xml:存放配置信息
    存放配置端口信息


    lib:存放Tomcat運行所需要的jar包

    logs:存放日志文件

    temp:存放Tomcat臨時文件

    webapps:部署項目到服務器
    在 webapps 目錄下新建目錄存放.html 面頁
    訪問頁面

    **work:**工作目錄,將JSP文件的Java文件轉換為class文件的工作目錄。

    部署項目到Tomcat
    在webapps目錄下創建自己的文件夾

    在該文件夾下新建一個HTML文檔

    index.html

    <html><head><title>發布到Tomcat中的項目的主頁</title></head><body><h1>hello tomcat</h1></body> </html>

    bin目錄下雙擊

    啟動Tomcat服務

    在地址欄輸入http://locathost:8080/myfirst/index.html

    5.Tomcat服務器運行原理

    5.1Tomcat的運行原理

    客戶瀏覽器發出要求訪問特定德Servlet的請求。
    1)Tomcat服務器接收到客戶請求并解析
    2)Tomcat服務器創建一個ServletRequest對象,在ServletRequest對象中包含了客戶請求信息及其他關于客戶的信息,如請求頭,請求正文,以及客戶機的IP地址等。
    3)Tomcat服務器創建一個ServletResponse 對象
    4)Tomcat服務器調用客戶所請求的Servlet的service服務方法,并且把ServletRequest對象和ServletResponse對象做為參數傳給該服務方法。
    5) Servlet 從 ServletRequest 對象中可獲取客戶的請求信息。
    6) Servlet 利用 ServletResponse 對象來生成響應結果。
    7) Tomcat 服務器把 Servlet 生成的響應結果發送給客戶。
    8)

    6.預備_http工具查看網絡交互過程

    6.1下載并安裝

    httpwatch安裝包:https://pan.baidu.com/s/1ogcMmZSutx6WvIvh2VNpGg 密碼:ggv4

    6.2HttpWatch 的使用

  • IE 瀏覽器?查看?瀏覽器欄?HttpWatch Professional

    最新版已經可以支持Google、Microsoft Edge等瀏覽器了下面是官方使用文檔

  • 輸入網址

  • 分析數據

  • 來源:https://blog.csdn.net/cldsj

    HttpWatch學習筆記一
    HttpWatch學習筆記二
    HttpWatch學習筆記三

    HttpWatch功能詳細介紹
    來源:https://www.cnblogs.com/Chilam007/p/6947235.html

    7. 手寫服務器_ 整體架構和接口_ 編寫 XML配置文件

    7.1 搭建項目框架

    7.2 編寫 XML 文檔

    <?xml version="1.0" encoding="UTF-8"?> <web-app><servlet><servlet-name>login</servlet-name><serlvet-class>com.bjsxt.servlet.LoginServlet</serlvet-class></servlet><servlet-mapping><serlvet-name>login</serlvet-name><url-pattern>/login</url-pattern></servlet-mapping><servlet-mapping><serlvet-name>login</serlvet-name><url-pattern>/log</url-pattern></servlet-mapping> </web-app>

    7.3 編寫 IOCloseUtil 類

    package com.bjsxt.util;import java.io.Closeable; import java.io.IOException;public class IOCloseUtil {//用于關系流public static void closeAll(Closeable...close){for (Closeable closeable : close) {if (closeable!=null) {try {closeable.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}} }

    8.DOM4J 解析 XML 配置文件

    8.1Entity 實體類的編寫

    package com.bjsxt.server; /*** <servlet><servlet-name>login</servlet-name><serlvet-class>com.bjsxt.servlet.LoginServlet</serlvet-class></servlet>* @author Administrator**/ public class Entity { /**servlet-name和一個servlet-name所對應的一個實體類*/private String name;//servlet-nameprivate String clazz;//servlet-classpublic String getName() {return name;}public void setName(String name) {this.name = name;}public String getClazz() {return clazz;}public void setClazz(String clazz) {this.clazz = clazz;}public Entity(String name, String clazz) {super();this.name = name;this.clazz = clazz;}public Entity() {super();}}

    8.2Mapping 實體類的編寫

    package com.bjsxt.server;import java.util.ArrayList; import java.util.List;/*** <servlet-mapping><serlvet-name>login</serlvet-name><url-pattern>/login</url-pattern><url-pattern>/log</url-pattern></servlet-mapping>* @author Administrator**/ public class Mapping {//映射關系,多個路徑訪問共享資源private String name;//servlet-nameprivate List<String> urlPattern;//url-patternpublic String getName() {return name;}public void setName(String name) {this.name = name;}public List<String> getUrlPattern() {return urlPattern;}public void setUrlPattern(List<String> urlPattern) {this.urlPattern = urlPattern;}public Mapping(){urlPattern=new ArrayList<String>();}public Mapping(String name, List<String> urlPattern) {super();this.name = name;this.urlPattern = urlPattern;}}

    8.3 解析 XML 文件

    package com.bjsxt.server;import java.io.File; import java.util.ArrayList; import java.util.Iterator; import java.util.List;import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader;public class WebDom4j {//用于解析XMLprivate List<Entity> entityList;//用于存儲是N多Entity,而每一個Entity都是servlet-name與servlet-classprivate List<Mapping> mappingList;//用于存儲N多Mapping,而每一個Mapping都是一個servlet-name與N多個url-patternpublic List<Entity> getEntityList() {return entityList;}public void setEntityList(List<Entity> entityList) {this.entityList = entityList;}public List<Mapping> getMappingList() {return mappingList;}public void setMappingList(List<Mapping> mappingList) {this.mappingList = mappingList;}//構造方法public WebDom4j() {entityList=new ArrayList<Entity>();mappingList=new ArrayList<Mapping>();}//獲取Document對象的方法private Document getDocument(){try {//(1)創建SAXReader對象SAXReader reader=new SAXReader();//(2)調用read方法return reader.read(new File("src/WEB_INFO/web.xml"));} catch (DocumentException e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}public void parse(Document doc){//(1)獲取根元素Element root=doc.getRootElement(); //web-app//(2)獲取servlet子元素for(Iterator<Element> ite=root.elementIterator("servlet");ite.hasNext();){Element subElement=ite.next();//得到每一個servlet//創建一個實體類Entity ent=new Entity(); //用于存儲servlet-name與servlet-classfor(Iterator<Element> subIte=subElement.elementIterator();subIte.hasNext();){Element ele=subIte.next(); //可能是servlet-name,也可能是servlet-classif("servlet-name".equals(ele.getName())){ent.setName(ele.getText()); //給實體類中的name賦值}else if("serlvet-class".equals(ele.getName())){ent.setClazz(ele.getText());}}//將Entity添加到集合中entityList.add(ent);}//測試/**for (Entity entity : entityList) {System.out.println(entity.getName()+"\t"+entity.getClazz());}*///解析servlet-mappingfor(Iterator<Element> ite=root.elementIterator("servlet-mapping");ite.hasNext();){Element subEle=ite.next();//得到每一個servlet-mapping//創建一個Mapping類的對象Mapping map=new Mapping();//解析servlet-mapping下的子元素for(Iterator<Element> subIte=subEle.elementIterator();subIte.hasNext();){Element ele=subIte.next(); //servlet-name,也有可能是url-patternif("serlvet-name".equals(ele.getName())){map.setName(ele.getText());}else if("url-pattern".equals(ele.getName())){//獲取集合對象,調用集合對象的添加方法,添加元素素map.getUrlPattern().add(ele.getText());}}//Mapping添加到集合中mappingList.add(map);}//測試for (Mapping m : mappingList) {System.out.println(m.getName());for(String s:m.getUrlPattern()){System.out.println(s);}}}//用于測試public static void main(String[] args) {WebDom4j web=new WebDom4j();web.parse(web.getDocument());} }

    9. 反射創建 Servlet 對象

    9.1 編寫 ServletContext 類

    Servlet 上下文,就是一個容器,用于存儲映射關系

    package com.bjsxt.server;import java.util.HashMap; import java.util.Map;/*** Servlet上下用,就是一個容器,* @author Administrator**/ public class ServletContext { //Entity與Mapping的映射關系private Map<String,String> servlet;//key是servlet-name (Entity中的name),值serlvet-class Entity中的clazzprivate Map<String,String> mapping;//key是url-pattern (Mapping中的List集合中的每一個元素),value是serlvet-name,是Mapping中的namepublic Map<String, String> getServlet() {return servlet;}public void setServlet(Map<String, String> servlet) {this.servlet = servlet;}public Map<String, String> getMapping() {return mapping;}public void setMapping(Map<String, String> mapping) {this.mapping = mapping;}public ServletContext() {servlet=new HashMap<String,String>();mapping=new HashMap<String,String>();} }

    9.2 編寫 WebApp 類

  • 初始化程序運行的數據
  • 根據不同的 url 創建所請求的 Servlet 對象
  • package com.bjsxt.server;import java.util.List; import java.util.Map;import com.bjsxt.servlet.Servlet;public class WebApp {//App的意思是應用程序private static ServletContext contxt;static{contxt=new ServletContext();//分別獲取對應關系的Map集合Map<String,String> servlet=contxt.getServlet();Map<String,String> mapping=contxt.getMapping();//創建解析XML文件對象WebDom4j web=new WebDom4j();web.parse(web.getDocument());//解析xml//獲取解析XML之后的List集合List<Entity> entityList=web.getEntityList();List<Mapping> mappingList=web.getMappingList();//將List集合中的數據存儲到Map集合for (Entity entity : entityList) {servlet.put(entity.getName(), entity.getClazz());}// System.out.println(servlet);for( Mapping map:mappingList){//遍歷url-pattern的集合List<String> urlPattern=map.getUrlPattern();for(String s:urlPattern){mapping.put(s, map.getName());}}//System.out.println(mapping);}/*** 根據url創建不同的Servlet對象* @param url* @return*/public static Servlet getServlet(String url){if (url==null||url.trim().equals("")) {return null;}//調用無參構造方法創建Servlet對象try {//如果url正確//根據url的key獲取servlet-name的值 /log=login, /reg=registerString servletName=contxt.getMapping().get(url);//根據servletName得到對應的servlet-classString servletClass=contxt.getServlet().get(servletName); //得到的是一個完整個的包名+類的字符串//使用反射創建 Servlet對象Class<?> clazz=Class.forName(servletClass);Servlet servlet = (Servlet) clazz.newInstance();return servlet;} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InstantiationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}//測試public static void main(String[] args) {System.out.println(getServlet("/log"));System.out.println(getServlet("/login"));} }

    10. 封裝 Request_method_url

    10.1 編寫 Server

  • 啟動服務
  • 關閉服務
  • package com.bjsxt.server;import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket;public class Server {//服務器,用于啟動和停止服務private ServerSocket server;public static void main(String[] args) {Server server=new Server();//創建服務器對象server.start();}public void start(){this.start(8888);}public void start(int port){try {server=new ServerSocket(port);this.receive(); //調用接收請求信息的方法} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}private void receive() {try {//(1)監聽Socket client=server.accept();//獲取用戶的請求/**InputStream is=client.getInputStream();byte []buf =new byte [20480];int len=is.read(buf);System.out.println(new String(buf,0,len));*///封裝請求信息Request req=new Request(client.getInputStream());//req.show();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void stop(){} }

    10.2 編寫 HTML

    login.html

    <html><head><title>登錄</title></head><body><form action="http://localhost:8888/log" method="post"><p>用戶名:<input type="text" name="username" id="username"/></p><p>密碼:<input type="password" name="pwd" id="password"/></p><p>愛好:<input type="checkbox" name="hobby" value="ball"/>足球<input type="checkbox" name="hobby" value="read"/>讀書<input type="checkbox" name="hobby" value="paint"/>畫畫</p><p><input type="submit" value="登錄"/></p></form></body> </html>

    10.3 封裝 Request_method_url

    package com.bjsxt.server;import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map;public class Request {/*請求*/private InputStream is;//輸入流private String requestInfo;//請求字符串,請求方式,請求的路徑,參數,協議,協議版本,請求的正文。。。private String method;//請求的方式private String url;//請求的url//輸入框的name為key,值為value/** key: username value :bjsxt* key:pwd value:123* key:hobby value :read,ball* */private Map<String,List<String>> parametermapValues;//參數private static final String CRLF="\r\n";//換行private static final String BLANK=" ";//空格//構造方法,初始化屬性public Request() {parametermapValues=new HashMap<String,List<String>>();method="";url="";requestInfo="";}public Request(InputStream is){this();//調用本類無參的構造方法this.is=is;try {byte [] buf=new byte[20480];int len=this.is.read(buf);requestInfo=new String(buf,0,len);} catch (IOException e) {return;}//調用本類中的分解請求信息的方法this.parseRequestInfo();}//分解請求信息的方法/*** 請求方式* 請求路徑* 請求的參數* */private void parseRequestInfo(){String paraString="";//用于存儲請求參數//獲取請求參數的第一行String firstLine=requestInfo.substring(0, requestInfo.indexOf(CRLF)).trim();//從0開始,到第一個換行的位置//分解出請求方式int index=firstLine.indexOf("/");this.method=firstLine.substring(0, index).trim();//分解url ,get可能包含參數,也可能不包含參數postString urlString= firstLine.substring(index,firstLine.indexOf("HTTP/")).trim();//判斷請求方式是GET還 是POSTif("get".equalsIgnoreCase(this.method)){ //包含請求參數if (urlString.contains("?")) {String [] urlArray=urlString.split("\\?");this.url=urlArray[0];paraString=urlArray[1];}else{this.url=urlString;}}else{//post不包含請求參數this.url=urlString;paraString=requestInfo.substring(requestInfo.lastIndexOf(CRLF)).trim();}if (paraString.equals("")) {return;}//請求參數//System.out.println(paraString);}//用于測試/*public void show(){System.out.println(this.url);System.out.println(this.method);}*/ }

    11. 封裝 Request_ 存儲參數_ 處理中文

    11.1 編寫分解參數的方法

    package com.bjsxt.server;import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map;public class Request {/*請求*/private InputStream is;//輸入流private String requestInfo;//請求字符串,請求方式,請求的路徑,參數,協議,協議版本,請求的正文。。。private String method;//請求的方式private String url;//請求的url//輸入框的name為key,值為value/** key: username value :bjsxt* key:pwd value:123* key:hobby value :read,ball* */private Map<String,List<String>> parametermapValues;//參數private static final String CRLF="\r\n";//換行private static final String BLANK=" ";//空格//構造方法,初始化屬性public Request() {parametermapValues=new HashMap<String,List<String>>();method="";url="";requestInfo="";}public Request(InputStream is){this();//調用本類無參的構造方法this.is=is;try {byte [] buf=new byte[20480];int len=this.is.read(buf);requestInfo=new String(buf,0,len);} catch (IOException e) {return;}//調用本類中的分解請求信息的方法this.parseRequestInfo();}//分解請求信息的方法/*** 請求方式* 請求路徑* 請求的參數* */private void parseRequestInfo(){String paraString="";//用于存儲請求參數//獲取請求參數的第一行String firstLine=requestInfo.substring(0, requestInfo.indexOf(CRLF)).trim();//從0開始,到第一個換行的位置//分解出請求方式int index=firstLine.indexOf("/");this.method=firstLine.substring(0, index).trim();//分解url ,get可能包含參數,也可能不包含參數postString urlString= firstLine.substring(index,firstLine.indexOf("HTTP/")).trim();//判斷請求方式是GET還 是POSTif("get".equalsIgnoreCase(this.method)){ //包含請求參數if (urlString.contains("?")) {String [] urlArray=urlString.split("\\?");this.url=urlArray[0];paraString=urlArray[1];}else{this.url=urlString;}}else{//post不包含請求參數this.url=urlString;paraString=requestInfo.substring(requestInfo.lastIndexOf(CRLF)).trim();}if (paraString.equals("")) {return;}//請求參數//System.out.println(paraString);//調用本類中分解請求參數的方法this.parseParam(paraString);}//用于測試/*public void show(){System.out.println(this.url);System.out.println(this.method);}*///username=bjsxt&pwd=123&hobby=ball&hobby=paint/*** username=bjsxt* pwd=123* hobby=ball* hobby=paint* * username=* @param prarString*/private void parseParam(String prarString){String [] token=prarString.split("&");for(int i=0;i<token.length;i++){String keyValues=token[i];String []keyValue=keyValues.split("="); //username bjsxt pwd 123if (keyValue.length==1) { //username=keyValue=Arrays.copyOf(keyValue, 2);keyValue[1]=null;}//將 表單元素的name與name對應的值存儲到Map集合String key=keyValue[0].trim();String value=keyValue[1]==null?null:decode(keyValue[1].trim(), "utf-8");//放到集合中存儲if (!parametermapValues.containsKey(key)) {parametermapValues.put(key, new ArrayList<String>());}List<String> values=parametermapValues.get(key);values.add(value);}}//根據表單元素的name獲取多個值private String [] getParamterValues(String name){//根據key獲取valueList<String> values=parametermapValues.get(name);if (values==null) {return null;}else{return values.toArray(new String [0] );}}private String getParamter(String name){//調用本類中根據name獲取多個值的方法String [] values=this.getParamterValues(name);if (values==null) {return null;}else{return values[0];}}//處理中文,因類瀏覽器對中文進行了編碼,進行解碼private String decode(String value,String code){try {return URLDecoder.decode(value, code);} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}public static void main(String[] args) {Request req=new Request();//調用分解參數的方法req.parseParam("username=%E5%8C%97%E4%BA%AC%E5%B0%9A%E5%AD%A6%E5%A0%82&pwd=123&hobby=ball&hobby=paint");System.out.println(req.parametermapValues);//調用獲取多個值的方法String [] str=req.getParamterValues("hobby");for (String string : str) {System.out.println(string);}//調用獲取單個值的方法System.out.println(req.getParamter("pwd"));}}

    11.2 編寫根據頁面上的 name 獲取多個值的方法

    11.3 編寫根據頁面上的 name 獲取單個值的方法

    11.4 編寫解碼的方法 1

    1.5 測試

    https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=%E5%8C%97%E
    4%BA%AC%E5%B0%9A%E5%AD%A6%E5%A0%82&rsv_pq=f65f15f40003a658&rsv_t=d74
    7OilFeeFkf73QkinDYpKiB4y%2Ffj3mxWfE865IJ0VxoTk5Obwtc4z41pM&rqlang=cn&rsv_ente
    r=1&rsv_sug3=19&rsv_sug1=21&rsv_sug7=101

    12. 封裝 Response

    12.1 封裝 Response

  • 構造響應頭
  • 推送到客戶端
  • package com.bjsxt.server;import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException;import com.bjsxt.util.IOCloseUtil;public class Response {//響應private StringBuilder headInfo;//響應頭private StringBuilder content;//響應內容private int length;//響應內容的長度//流private BufferedWriter bw;//兩個常量,換行和空格private static final String CRLF="\r\n";//換行private static final String BLANK=" ";//空格//構造方法public Response() {headInfo=new StringBuilder();content=new StringBuilder();}//帶參構造方法public Response(OutputStream os){this();//調用本類的無參構造方法try {bw=new BufferedWriter(new OutputStreamWriter(os, "utf-8"));} catch (UnsupportedEncodingException e) {headInfo=null;}}//構造正文部分public Response print(String info){content.append(info);try {length+=info.getBytes("utf-8").length;} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}return this;}public Response println(String info){content.append(info).append(CRLF);try {length+=(info+CRLF).getBytes("utf-8").length;} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}return this;}//構造響應頭private void createHeadInfo(int code){headInfo.append("HTTP/1.1").append(BLANK).append(code).append(BLANK);switch (code) {case 200:headInfo.append("OK");break;case 500:headInfo.append("SERVER ERROR");break;default:headInfo.append("NOT FOUND");break;}headInfo.append(CRLF);headInfo.append("Content-Type:text/html;charset=utf-8").append(CRLF);headInfo.append("Content-Length:"+length).append(CRLF);headInfo.append(CRLF);}/*** 推送到客戶機的瀏覽器* @param code*/public void pushToClient(int code){if (headInfo==null) {code=500;}try {//調用本類中的構造響應頭this.createHeadInfo(code);bw.write(headInfo.toString());bw.write(content.toString());bw.flush();this.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void close(){IOCloseUtil.closeAll(bw);} }

    12.2 編寫相應的 Servlet 構造響應內容

    package com.bjsxt.servlet;import com.bjsxt.server.Request; import com.bjsxt.server.Response;public abstract class Servlet { //是所有的請求的Servlet的父類public void service(Request req,Response rep) throws Exception{this.doGet( req, rep);this.doPost( req, rep);}public abstract void doGet(Request req,Response rep) throws Exception;public abstract void doPost(Request req,Response rep) throws Exception; }

    LogServlet.java

    package com.bjsxt.servlet;import com.bjsxt.server.Request; import com.bjsxt.server.Response;public class LoginServlet extends Servlet {@Overridepublic void doGet(Request req, Response rep) throws Exception {//獲取請求參數String name=req.getParameter("username");String pwd=req.getParameter("pwd");if(this.login(name, pwd)){//調用響應中的構建內容的方rep.println(name+"登錄成功");}else{rep.println(name+"登錄失敗,對不起,賬號或密碼不正確");}}private boolean login(String name,String pwd){if ("bjsxt".equals(name)&&"123".equals(pwd)) {return true;}return false;}@Overridepublic void doPost(Request req, Response rep) throws Exception {// TODO Auto-generated method stub} }

    12.3 啟動服務器進行測試

    13. 封裝分發器_實現多線程

    Dispatcher.java

    package com.bjsxt.server;import java.io.IOException; import java.net.Socket;import com.bjsxt.servlet.Servlet; import com.bjsxt.util.IOCloseUtil;/*** 一個請求與響應就是一個Dispatcher* @author Administrator**/ public class Dispatcher implements Runnable {private Request req;private Response rep;private Socket client;private int code=200;//狀態碼//構造方法初始化屬性public Dispatcher(Socket client) {//將局部變量的值賦給成員變量this.client=client;try {req=new Request(this.client.getInputStream());rep=new Response(this.client.getOutputStream());} catch (IOException e) {code=500;return ;}}@Overridepublic void run() {//根據不同的url創建指定的Servlet對象System.out.println(req.getUrl());Servlet servlet=WebApp.getServlet(req.getUrl());if (servlet==null) {this.code=404;}else{//調用相應的Servlet中的service方法try {servlet.service(req,rep);} catch (Exception e) {this.code=500;}}//將響應結果推送到客戶機的瀏覽器rep.pushToClient(code);IOCloseUtil.closeAll(client);}}

    14. 整合最終版

    14.1 查缺補漏完善項目

    FaviconServlet.java

    package com.bjsxt.servlet;import com.bjsxt.server.Request; import com.bjsxt.server.Response;public class FaviconServlet extends Servlet {@Overridepublic void doGet(Request req, Response rep) throws Exception {// TODO Auto-generated method stub}@Overridepublic void doPost(Request req, Response rep) throws Exception {// TODO Auto-generated method stub}}

    15. 總結和期望

    15.1 項目總結

    涉及知識點

  • 集合
  • IO
  • 多線程
  • 網絡編程
  • 面向對象
  • 反射
  • XML
  • HTML
  • 15.2 項目思路

  • 先分析
  • 搭建項目框架
  • 一步一步實現,先從會的開始實現
  • 整體思路,宏觀使用面向對象,微觀使用面向過程
  • 注重代碼的調試
  • 15.3 思想是從鍵盤中敲出來的

  • 多注重實戰
  • 學知識不是目的,目的是對知識的綜合運用,才能將知識
    轉化為能力
  • 不要氣餒,每天進步一點點,人最大的敵人是自己,今天
    的自己比昨天的自己有進步,就是成功。
  • 今天所有的付出,都會在明天以 RMB 的形式還給你。
  • 加油!!!
  • 附源碼:
    鏈接:https://pan.baidu.com/s/1upUHY0bGXmLfLZKOt5ICxg
    提取碼:pfz1

    總結

    以上是生活随笔為你收集整理的Java—手写服务器的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    在线免费高清 | 99精品乱码国产在线观看 | 狠狠躁夜夜躁人人爽超碰91 | 久久久久久高清 | 肉色欧美久久久久久久免费看 | 国产理论一区二区三区 | 国产不卡免费视频 | 亚洲成a人片在线观看网站口工 | 国产精品久久久久永久免费观看 | 婷婷香蕉 | 伊人狠狠操| 亚洲综合视频在线 | 91热精品| 最近中文字幕高清字幕免费mv | 久久1区 | 国产69精品久久99的直播节目 | 国产亚洲一区二区三区 | 欧美三级高清 | 在线 视频 一区二区 | 在线国产专区 | 亚洲美女在线国产 | 亚洲少妇自拍 | 在线观看日韩免费视频 | 黄网站免费看 | 日韩欧美aaa | 欧美日韩一区二区免费在线观看 | 黄毛片在线观看 | a级片在线播放 | 国产精成人品免费观看 | av电影在线免费 | 久久国产精品一国产精品 | 国产在线久草 | 色综合久久88色综合天天人守婷 | 18av在线视频 | 亚洲黄色免费观看 | 色婷婷激情综合 | 色欲综合视频天天天 | 日韩欧美在线一区二区 | 狠狠色丁香婷婷综合橹88 | 国产码电影 | 九九久久久久久久久激情 | 久久久久福利视频 | 久草在线免 | 在线国产99 | 蜜臀久久99精品久久久久久网站 | 在线观看 国产 | 亚洲成人av在线电影 | 亚洲视频免费在线观看 | 中文字幕av免费在线观看 | 色99久久| 人人插人人插 | 9在线观看免费高清完整版在线观看明 | 成人久久久久久久久 | 日韩精品一区二区三区在线视频 | 日韩极品视频在线观看 | 国产亚洲精品久久19p | 欧美日韩在线精品 | 国产精品久久久影视 | 91精品国产99久久久久久红楼 | 欧美小视频在线观看 | 青青河边草免费观看完整版高清 | 99精品免费在线 | 国产91精品欧美 | 亚洲一级国产 | 亚洲国产中文字幕 | 色婷婷亚洲婷婷 | 中文字幕 成人 | 国产午夜精品久久久久久久久久 | 欧美日韩一区二区三区在线观看视频 | 亚洲日本精品视频 | 国产精品亚洲成人 | 97人人模人人爽人人少妇 | 高清av网站 | 精品91久久久久 | 国产69精品久久久久久 | www久久久久| 精品久久中文 | 91av在线免费观看 | 人人干在线 | 成人欧美日韩国产 | 免费一级片观看 | 国产日韩视频在线播放 | 不卡视频在线看 | 亚洲区另类春色综合小说校园片 | 婷婷四房综合激情五月 | 四虎影视成人永久免费观看亚洲欧美 | 亚洲欧洲一区二区在线观看 | 又色又爽又黄 | 九色视频网 | av成人黄色 | 国内精品久久久久久久久久久久 | 国产精品乱码久久久久久1区2区 | 国产黄色免费在线观看 | 色综合久久久久综合 | 成年人在线免费视频观看 | 免费黄在线看 | 亚洲综合色站 | 亚洲成人黄色在线观看 | 91视频这里只有精品 | 亚洲无人区小视频 | 天天操天天色天天 | 午夜精品av在线 | 成年人免费在线观看网站 | 在线免费视 | 久草视频99 | 亚州日韩中文字幕 | 久久精品网站视频 | bbbbb女女女女女bbbbb国产 | 精品一区二区免费视频 | 成人毛片在线视频 | 黄色免费大片 | 狠狠色狠狠色综合日日92 | 国产伦理久久精品久久久久_ | 国产精品久久电影网 | 四虎国产精品永久在线国在线 | 岛国大片免费视频 | 精品视频999 | 91麻豆视频网站 | 国产一区欧美日韩 | 天天爽天天爽夜夜爽 | 97精品国产一二三产区 | 香蕉在线影院 | 国产啊v在线观看 | 久一久久 | 亚洲精品裸体 | 又黄又爽又刺激视频 | 在线看黄色的网站 | 欧美日韩国产一区二区三区 | 久草在线精品观看 | 国产视频一区二区三区在线 | 久久精品国产第一区二区三区 | 午夜色影院 | 天天操天天玩 | 欧美色综合天天久久综合精品 | 国产精品久久久久久久电影 | 91丨九色丨蝌蚪丨老版 | 国产一级黄色电影 | 国产手机视频精品 | 久久免费精品国产 | 国际精品久久 | av网站播放 | 欧美日本啪啪无遮挡网站 | 狠狠色丁香九九婷婷综合五月 | 日韩中文字幕免费在线观看 | 成人av电影在线观看 | 久久婷婷一区二区三区 | 欧美日韩99| 六月丁香激情综合色啪小说 | 日本久久久久久科技有限公司 | 99精品欧美一区二区三区 | 黄色精品久久 | 国产福利中文字幕 | 视频三区在线 | 色婷婷www | 99热九九这里只有精品10 | 亚洲三级视频 | www.99热精品 | 午夜精品一区二区三区在线 | 亚洲三级黄色 | 国产精品久久久久av免费 | 91九色网站 | 色婷婷成人 | 国产精品永久免费视频 | 国产拍揄自揄精品视频麻豆 | 丝袜美女在线观看 | 亚洲精品黄色 | 日韩视频在线观看视频 | 日本中文乱码卡一卡二新区 | 国产一区观看 | 国产 日韩 在线 亚洲 字幕 中文 | 久久久久亚洲精品中文字幕 | 又黄又爽的免费高潮视频 | 国产高清在线a视频大全 | 五月婷婷婷婷婷 | 91av99| 日韩欧美大片免费观看 | 国产精品久久久区三区天天噜 | 99r精品视频在线观看 | 天天躁天天操 | 精品一区91| 色婷婷av一区二 | 看国产黄色片 | 久久久久亚洲精品国产 | 中文字幕在线播放第一页 | 国产精品午夜久久久久久99热 | 又污又黄的网站 | 亚洲免费a | 五月婷婷电影网 | 福利电影一区二区 | av在线播放中文字幕 | 成人理论在线观看 | 特黄特色特刺激视频免费播放 | 99精品国产兔费观看久久99 | 久久天堂精品视频 | 亚洲精区二区三区四区麻豆 | 欧美一级黄色视屏 | 精品视频国产一区 | 国产高h视频 | 中文伊人 | 91精品天码美女少妇 | 一级a性色生活片久久毛片波多野 | 亚洲日本va午夜在线电影 | 视频国产精品 | av永久网址 | 精品国产乱码久久久久久天美 | 欧美成人亚洲成人 | 欧美va天堂va视频va在线 | 黄色软件在线观看免费 | 99久久久成人国产精品 | 亚洲精品美女在线观看 | 午夜精品一区二区三区免费视频 | 中文字幕在线播放第一页 | 亚洲视频在线观看免费 | 亚洲欧美在线观看视频 | www毛片com| 又黄又爽又无遮挡的视频 | 91片黄在线观 | 天天激情| 欧美日韩一级久久久久久免费看 | 亚洲精品在线观看的 | 91在线播放视频 | 成人一级免费电影 | 欧美久久久久久久久 | 天天草天天干天天射 | 美女视频国产 | 久久国产精品99久久久久久老狼 | 国产精品视频免费观看 | 欧美日韩视频免费 | 波多野结衣久久资源 | 97碰碰视频| 99性视频| 亚洲欧美激情精品一区二区 | 极品美女被弄高潮视频网站 | 国产精久久久久久久 | 91亚洲精| 亚洲国产一二三 | 天天拍天天草 | www.五月天婷婷 | 狠狠色婷婷丁香六月 | 中文字幕日韩无 | 午夜91在线 | 久久久麻豆精品一区二区 | 欧美日韩高清一区二区 国产亚洲免费看 | 欧美精品在线观看免费 | www色com| 婷婷六月激情 | 日韩欧美亚州 | 99视频+国产日韩欧美 | 国产亚洲欧美一区 | 久久好看免费视频 | 色综合天天色综合 | 天天色天天艹 | 天天干天天操天天操 | 全久久久久久久久久久电影 | 正在播放亚洲精品 | 日韩在线观看三区 | 国产一级大片免费看 | 手机成人在线 | 一区二区三区在线免费观看 | 欧美精彩视频在线观看 | 97av色| 中文电影网 | 国产精品免费一区二区三区在线观看 | 激情欧美一区二区免费视频 | 久久精品美女 | 玖玖视频精品 | 亚洲影院色 | 91精品网站在线观看 | 欧美国产精品一区二区 | 中文字幕丝袜 | 色网址99 | av韩国在线 | 九九99视频 | 成人av高清在线 | 91色视频 | 91精品国产乱码在线观看 | 色在线免费视频 | 久久www免费视频 | 天天天天天天天天操 | 久久精品香蕉 | 国产免费不卡 | 激情五月婷婷 | 最新高清无码专区 | 亚洲日本精品视频 | 激情欧美丁香 | 香蕉视频91 | 亚洲免费视频观看 | 欧美二区三区91 | 99久久这里有精品 | 中文字幕资源在线 | 中文日韩在线 | 亚洲综合婷婷 | 日韩视频一区二区三区 | av五月婷婷 | 久久精品亚洲精品国产欧美 | 欧美在线18 | 五月天激情电影 | 特级大胆西西4444www | www亚洲精品 | 五月婷婷另类国产 | 国产淫片免费看 | 韩国av免费观看 | 三级黄色在线观看 | 天天天综合 | 亚洲精品永久免费视频 | 99精品免费网 | 国产精品久久久久久久久久ktv | 国产视频在线观看一区 | 超碰资源在线 | 五月情婷婷| 亚洲精品在线视频观看 | 久久久久久久久黄色 | 亚洲国产精品成人va在线观看 | 国产一级在线播放 | 日本精品午夜 | 午夜精品99久久免费 | av在线播放免费 | 亚洲欧美日韩不卡 | 国产精品99久久久精品 | 在线免费91 | 狠狠操导航| 国产一级电影免费观看 | 97精品国产 | 激情影音 | av片在线观看 | 国产精品亚洲成人 | 成年人国产视频 | 久久久私人影院 | 日韩在线观看你懂得 | 久久热亚洲 | 久久久国产一区二区 | 狠狠色丁香久久综合网 | 国产自在线 | 国产成人精品久 | 久久的色| 天天干夜夜爱 | 中文字幕乱码视频 | 亚洲国产影院av久久久久 | 国产成人在线免费观看 | 色婷婷狠狠五月综合天色拍 | 9草在线 | 99亚洲国产 | 免费在线观看日韩欧美 | 亚洲欧美视频 | 激情黄色av | 免费观看国产成人 | 久综合网 | 亚洲综合视频在线 | 日韩av中文在线观看 | 九九热精品在线 | 高清国产午夜精品久久久久久 | 国产小视频你懂的 | 日韩毛片在线免费观看 | 中文字幕成人在线 | 麻豆91精品 | 国产在线毛片 | 欧美在线观看视频一区二区三区 | www.亚洲视频.com | 免费精品国产va自在自线 | 国产一区二区三区久久久 | 免费视频一区 | 亚洲最新av在线网站 | 在线视频在线观看 | 日韩av在线资源 | 精品国产伦一区二区三区免费 | 国产精品欧美日韩 | 五月开心激情网 | 91成品人影院 | 国产福利不卡视频 | 日本中文字幕在线电影 | 色爱成人网 | 久久艹艹 | 一级做a爱片性色毛片www | 国产91精品一区二区绿帽 | 午夜精品一区二区三区在线视频 | 日本深夜福利视频 | 色婷婷狠狠五月综合天色拍 | 久久婷婷一区二区三区 | 日韩欧美视频在线免费观看 | 精品国产资源 | 久久99久久99久久 | 亚洲精选久久 | 亚洲免费公开视频 | 麻豆视频在线免费观看 | 黄网站www| av三区在线 | 女人18毛片a级毛片一区二区 | 五月天亚洲综合小说网 | 大荫蒂欧美视频另类xxxx | 日韩免费电影一区二区三区 | 伊人五月在线 | 久久99国产综合精品免费 | 国产精品一区二区av影院萌芽 | 久久精品视频在线 | 国产一级二级在线 | 日韩中文字幕免费电影 | 中文字幕综合在线 | 成人在线免费观看视视频 | 97色婷婷| 国产99久久九九精品 | 久久国产欧美日韩 | 欧美日本中文字幕 | 91在线视频在线 | 欧美污在线观看 | 国语麻豆 | 婷婷成人综合 | 亚洲另类在线视频 | 国产成在线观看免费视频 | 免费观看www视频 | 久久在线精品 | 在线视频麻豆 | 国产精品黄色av | 久草视频国产 | 免费99精品国产自在在线 | 男女精品久久 | 久久久999 | av资源免费在线观看 | 亚洲在线a | 一区二区三区免费看 | 91久久精品一区二区二区 | 亚洲高清av在线 | 久久伊人精品天天 | 久久99国产精品久久 | 欧美淫视频 | 热久久国产 | 九九综合九九 | 日本精品视频免费观看 | 99中文字幕视频 | 国产在线精品一区二区不卡了 | 特级黄色片免费看 | av高清网站在线观看 | 狠狠躁日日躁狂躁夜夜躁 | 国产一区二区精品在线 | 国产97视频 | 免费观看mv大片高清 | 一区二区久久久久 | 欧美精品网站 | 国产精品久久久久一区二区 | 久久99电影 | 成人午夜免费福利 | 国产精品伦一区二区三区视频 | 亚洲欧洲av在线 | 五月婷婷丁香在线观看 | 亚洲国产三级在线 | 国产精彩在线视频 | www.com.黄 | 亚洲永久精品国产 | 久久黄色免费观看 | 精品a级片 | 国产亚洲精品中文字幕 | 成人在线一区二区 | 在线天堂8√| 99在线免费观看视频 | 丁香综合激情 | 国产精品久久久久久久久费观看 | 国产精品成人自产拍在线观看 | 日韩在线观看网站 | 日日操夜夜操狠狠操 | 久久精品久久99精品久久 | 久久久久精 | 91在线看视频免费 | 国产精品久久一区二区三区不卡 | 亚洲精品乱码久久久久久写真 | 午夜精品福利一区二区 | 日韩欧美一区二区三区免费观看 | 欧美巨大荫蒂茸毛毛人妖 | 天天搞夜夜骑 | 国产亚洲精品久久久久久电影 | 黄色软件在线观看免费 | 国内精品中文字幕 | 在线观看完整版 | 欧美久草视频 | 中文av一区二区 | 中文字幕在线观看完整版 | 中文字幕av网站 | 欧美a视频 | 成人三级网站在线观看 | 日韩二区三区在线观看 | 久久久久免费电影 | 国产专区在线看 | 丁香久久久 | 久久99国产精品久久99 | 亚洲视频aaa | 亚洲国产欧洲综合997久久, | 人人模人人爽 | 精品国产一区二区三区四区vr | 天天激情天天干 | 免费福利在线 | 欧美成人黄色片 | 久久激情五月婷婷 | 亚州国产视频 | 精品国产自在精品国产精野外直播 | 97av影院| 五月天婷婷免费视频 | 性色视频在线 | 国产免费嫩草影院 | 精品久久影院 | 不卡视频在线看 | www色| 国产精品国产三级国产专区53 | 成人激情开心网 | 91看毛片 | 精品国内 | 亚洲激情电影在线 | 国产精品 9999 | 美女黄频在线观看 | 午夜精品久久久久久久99水蜜桃 | 99tvdz@gmail.com| 久久精品成人欧美大片古装 | 日韩二区在线 | 国产精品av久久久久久无 | 国产成人99久久亚洲综合精品 | 国产精品爽爽久久久久久蜜臀 | 狠狠操狠狠干2017 | 韩日三级在线 | 欧美91精品久久久久国产性生爱 | 国产精品第10页 | 日韩字幕 | 久久色在线播放 | 有没有在线观看av | 91香蕉亚洲精品 | 国产精品伦一区二区三区视频 | 天天艹天天操 | 99精品在这里 | 免费成人av | 天天搞夜夜骑 | 国产一级视频 | 国产精品久久嫩一区二区免费 | 国产精品美女久久久久aⅴ 干干夜夜 | 日本在线观看一区二区三区 | 中文字幕免费观看全部电影 | 97电影在线观看 | 免费高清在线视频一区· | 欧美精品二 | 香蕉成人在线视频 | 日韩在线视频网站 | 午夜av剧场| 日本公妇在线观看 | 欧美精品久久久久久久久久 | 国产美女在线免费观看 | 免费黄色在线网站 | 精品视频9999 | 探花视频在线观看免费 | 99这里只有精品视频 | 亚洲一区二区麻豆 | 国产免费精彩视频 | 综合网伊人 | 天天干夜夜擦 | 九九色在线观看 | 久久一区二区三区国产精品 | 特黄特色特刺激视频免费播放 | av片一区 | 久久99热国产 | 五月香视频在线观看 | 97狠狠干| 欧美视频二区 | 日韩精品中字 | 日韩色综合网 | 久草在线免费看视频 | 探花视频在线版播放免费观看 | 久久久久久激情 | 麻豆国产网站入口 | 免费99| 天天爱天天射天天干天天 | 色综合久久悠悠 | 亚洲午夜av | 久久精品视频99 | 亚洲无线视频 | 国产黄色资源 | 婷婷激情av | 欧美精品久久久久久久久久 | 精品欧美日韩 | 精品不卡av | 97超碰在线久草超碰在线观看 | 99热精品在线 | 欧美日韩国产一区二区在线观看 | 超碰在线97国产 | 99re热精品视频 | 国产精品激情偷乱一区二区∴ | 亚洲精品91天天久久人人 | 在线你懂 | 天天摸夜夜添 | 国产一区二区三区久久久 | 国产免费三级在线观看 | 国产亚洲精品成人av久久影院 | 激情 亚洲 | 中文字幕一区在线 | avlulu久久精品 | 国产一二区精品 | 人人澡澡人人 | 久久成人福利 | 天天狠狠 | 久久亚洲热 | 日日骑 | 最新午夜| 97电影在线观看 | 99久久婷婷国产一区二区三区 | 91丨九色丨蝌蚪丨老版 | 97超碰网| 色多多视频在线 | 天天躁日日| 91免费版在线 | 在线成人欧美 | 网站免费黄 | 在线一区二区三区 | 天天操欧美 | 丁香花在线观看视频在线 | 国产一区二区网址 | 婷婷深爱网 | 在线免费视频你懂的 | 成人av片免费看 | 激情五月婷婷激情 | 久久久久久免费视频 | 蜜臀久久99精品久久久无需会员 | 国产精品精品国产婷婷这里av | 久久观看免费视频 | 久久精品视频免费 | 在线观看国产区 | a级国产乱理伦片在线播放 久久久久国产精品一区 | 午夜av大片 | www免费视频com━ | 色搞搞 | 国产综合激情 | 欧美色综合天天久久综合精品 | 青青河边草免费直播 | 国产69久久 | 操操操日日 | 国产成人一区二区三区影院在线 | 精品欧美乱码久久久久久 | 欧美性生活小视频 | 狠狠狠色丁香综合久久天下网 | 久久久国产精品一区二区中文 | 国产精品久久久久久久久岛 | 日韩在线视频观看免费 | 久久亚洲国产精品 | 福利片视频区 | 在线观看免费黄视频 | 亚洲影视九九影院在线观看 | 日韩免费电影网站 | 黄p网站在线观看 | 国偷自产中文字幕亚洲手机在线 | 香蕉影视app | 成人污视频在线观看 | 一级免费av | 免费看特级毛片 | 日韩在线电影观看 | 久久久久久久久影视 | 成人在线观看影院 | 国产美女精品人人做人人爽 | 久草在线免费色站 | 九九免费在线观看视频 | 九九久久婷婷 | 久久免费精品一区二区三区 | 久久9999久久免费精品国产 | 成人久久 | 亚洲一区二区精品在线 | www.天天射 | 久草观看视频 | 日本在线观看一区二区三区 | 久草资源在线 | 久久这里只有精品视频首页 | 美女一级毛片视频 | 亚洲亚洲精品在线观看 | 国产视频亚洲精品 | 亚洲精品在线播放视频 | 国产精品久久久久久久午夜 | 在线观看国产亚洲 | 日日夜夜添| 亚洲精品一区中文字幕乱码 | 亚洲精品美女 | 国产一区91 | bbbb操bbbb | 久久久久久久久久久久影院 | 亚洲免费a | 亚洲综合一区二区精品导航 | 久久a热6 | 五月婷婷视频在线 | 精品一区中文字幕 | 久久精品视频3 | 午夜美女福利 | 久久视频网 | 久久精品视频中文字幕 | 久草视频观看 | 日韩一区二区在线免费观看 | 99精品国产99久久久久久福利 | 免费观看成年人视频 | 婷婷视频 | 亚洲免费观看在线视频 | 97精品国产91久久久久久 | 久久在线精品视频 | 中日韩男男gay无套 日韩精品一区二区三区高清免费 | 久久精品4| 91精品高清| 国产不卡精品 | 久久99精品国产麻豆婷婷 | 91精品视频在线看 | 久久99久国产精品黄毛片入口 | 狠狠操综合 | 免费日韩一级片 | 午夜丰满寂寞少妇精品 | 看全黄大色黄大片 | 人人爱夜夜操 | 亚洲最大免费成人网 | 丝袜网站在线观看 | 深爱五月网 | 久久在视频| 美女搞黄国产视频网站 | 一级片视频免费观看 | 欧美午夜寂寞影院 | 91精品黄色| 亚洲精品乱码久久久一二三 | 精品视频久久久久久 | 欧美成人精品欧美一级乱黄 | 98福利在线| 精品爱爱 | 国产在线国偷精品产拍免费yy | 成人国产网址 | 国产在线播放一区二区三区 | 精品主播网红福利资源观看 | 99性视频 | 亚洲午夜久久久综合37日本 | 久久乐九色婷婷综合色狠狠182 | av五月婷婷| 美女很黄免费网站 | 国内精品久久久久久 | 中文字幕国产精品 | 久久电影国产免费久久电影 | 久久综合狠狠综合久久狠狠色综合 | 91精品国自产拍天天拍 | 夜夜视频 | 久久综合在线 | 成人小视频在线观看免费 | 日韩1页 | 在线观看911视频 | 欧美一级电影免费观看 | 一区二区三区四区在线免费观看 | 久久国产精品一国产精品 | 激情视频免费观看 | 亚洲无吗av | 97超碰网 | 97超碰超碰久久福利超碰 | 成人黄色在线电影 | 97人人模人人爽人人少妇 | 高清中文字幕 | 国产成人亚洲精品自产在线 | 91精品久久久久久久99蜜桃 | 日韩黄色影院 | 婷婷精品视频 | 久久er99热精品一区二区三区 | 国产精品一区专区欧美日韩 | 欧美日韩在线免费观看视频 | 人人干人人超 | 国产精品一区久久久久 | 日韩视频在线不卡 | 99精品视频在线播放观看 | japanesefreesexvideo高潮 | 黄网站app在线观看免费视频 | 成人一级片视频 | 国内精品久久久久影院日本资源 | 国产精品久久久av | 免费看十八岁美女 | 久久久九九 | 国产免费激情久久 | 四虎在线视频 | 日韩在线视频免费看 | 欧美日韩xxx| 开心色婷婷 | 日韩成人邪恶影片 | 热久久99这里有精品 | 日韩欧美国产精品 | 欧美日韩综合在线观看 | 啪啪av在线 | 亚洲电影一区二区 | av日韩精品 | 国产成人av电影 | 国产在线高清视频 | 天天躁日日躁狠狠躁 | 成人国产电影在线观看 | 国产精品不卡在线观看 | 69欧美视频 | 视频在线在亚洲 | 国产无套一区二区三区久久 | 日本激情动作片免费看 | 国产理论在线 | 91久久久久久国产精品 | 波多野结衣在线视频免费观看 | 激情网在线观看 | 黄色一级在线免费观看 | 欧美 亚洲 另类 激情 另类 | 亚洲五月婷婷 | 91成熟丰满女人少妇 | 国产精久久久久久久 | 国产精品扒开做爽爽的视频 | 丁香婷婷激情五月 | 日韩av中文在线观看 | 久久精品看 | 久久久男人的天堂 | 亚洲第一区在线播放 | 中文字幕av最新 | 亚洲精品日韩在线观看 | a在线一区| 欧美一区三区四区 | 国模视频一区二区三区 | 久久久国产一区二区 | 五月婷婷综合在线观看 | 久久婷婷亚洲 | 国产精品99在线播放 | 91社区国产高清 | 成人黄色免费在线观看 | 黄网站色成年免费观看 | 日韩av电影国产 | 亚洲网站在线看 | 久久精品视频在线观看免费 | 欧美日韩另类在线 | 激情综合五月婷婷 | 狠狠操狠狠干天天操 | 激情久久一区二区三区 | 国产精品18久久久久久久久久久久 | 91精品国产成人www | 91超级碰 | 国产黄a三级三级三级三级三级 | 精品一区二区免费 | 久草视频国产 | 国产亚洲成人网 | 久久精品99 | 91精品国产一区二区在线观看 | 亚洲国产97在线精品一区 | 最近日本字幕mv免费观看在线 | 婷婷国产v亚洲v欧美久久 | 日韩,精品电影 | 日本精品中文字幕 | 国产一二三四在线观看视频 | 欧美激情精品久久久久久 | 亚洲精品国产成人av在线 | 亚洲 欧美变态 另类 综合 | 99精品国产高清在线观看 | av片在线看| 国产日韩一区在线 | 69视频国产 | 中文字幕在线观看网址 | 91久久奴性调教 | 免费日韩一区二区 | 日韩在线视| av黄网站 | 久久视频在线观看免费 | 日韩久久视频 | 天天综合网天天综合色 | 成人一级电影在线观看 | 亚洲婷婷综合色高清在线 | 综合天天| 日韩免费在线一区 | 亚洲夜夜网 | 91超国产| 国产亚洲精品久久网站 | 午夜美女福利直播 | 婷婷色中文字幕 | 在线观影网站 | 国产精品高清一区二区三区 | 在线观看视频免费大全 | 亚洲人天堂 | 黄色精品一区 | 亚洲国产精品激情在线观看 | 日本精品va在线观看 | wwwwww国产 | 激情久久伊人 | 中文字幕精品一区二区精品 | 99久久www| 人人爱人人爽 | 激情小说网站亚洲综合网 | 天天综合网 天天 | 国产中文字幕在线视频 | 国产视频2021 | 91精品秘密在线观看 | 欧美一二三区在线观看 | 亚洲综合欧美激情 | 又爽又黄在线观看 | 97电影网站 | 国产一级黄大片 | 在线视频久 | 国产精品久久久免费看 | 中文字幕在线高清 | 婷婷激情网站 | 韩国av一区二区 | 成人久久久电影 | 精品国自产在线观看 | 久久综合色播五月 | 99精品免费视频 | 成年人网站免费在线观看 | 亚洲免费视频观看 | 91 中文字幕 | 黄色毛片观看 | 欧美成人亚洲成人 | 精品久久久成人 | 久久在线精品视频 | 日韩理论电影在线观看 | 天天爽天天射 | 国产成人三级在线 | www.日日操.com | 久久人人爽人人片av | 日韩xxxx视频 | 色综合婷婷 | 色婷婷国产精品一区在线观看 | 永久免费的av电影 | 中文字幕一区二区三区视频 | 亚洲五月综合 | 久久电影日韩 | 免费视频网 | 亚洲精品66 | 在线观看亚洲精品 | 美女激情影院 | 99高清视频有精品视频 | 啪一啪在线 | 亚洲综合情 | 亚洲在线网址 | 在线观看91 | 精品在线观看一区二区 | 亚洲欧美国内爽妇网 | 国产黄色片在线 | 亚洲五月婷 | 中文字幕在线播放av | 精品播放 | 欧美一区日韩精品 | 国产二区视频在线观看 | 国产一区视频免费在线观看 | 亚洲视频网站在线观看 | 免费黄色av | 制服丝袜欧美 | 99视频在线免费看 | 久久视频一区二区 | 色资源二区在线视频 | 狠狠躁天天躁综合网 | 99精品免费久久久久久日本 | 国产午夜三级一二三区 | www.五月婷婷 | 五月婷婷天堂 | 国际精品久久久 | 国产成人61精品免费看片 | 亚洲欧美日韩一区二区三区在线观看 | 少妇自拍av | 中文字幕在线观看1 | 亚洲欧美日本一区二区三区 | 欧美天堂视频在线 | 国产小视频免费在线网址 | 1000部国产精品成人观看 | 久久er99热精品一区二区三区 | 韩国三级一区 | 日韩天天干| 国产成人不卡 | 天天操天天舔天天爽 | 欧美最猛性xxxxx免费 | 亚洲韩国一区二区三区 | 91av在线电影 | 国产96在线视频 | 久久 亚洲视频 | 一区二区三区免费在线播放 | 色av色av色av | 国产精品久久久久一区二区三区 | 国产一区二区视频在线播放 | 男女全黄一级一级高潮免费看 | 日韩欧美精品在线观看视频 | 黄色一级大片在线免费看产 | 久久天天躁狠狠躁夜夜不卡公司 | 亚洲激情综合 | 激情五月婷婷激情 | 国产成人精品一区二区在线观看 | 国产区精品区 | 欧美国产日韩一区 | 69国产盗摄一区二区三区五区 | 国产91精品一区二区麻豆亚洲 | 一级黄色片网站 | av不卡网站| 四虎影视精品成人 | 精品视频亚洲 | 亚洲欧美日韩国产一区二区 | 亚洲成人av在线 | 久久精品国产免费 | 一区二区三区免费在线播放 | 五月开心六月伊人色婷婷 | 狠狠色丁香婷婷综合久小说久 | 国产精品二区在线观看 | 国产又粗又长的视频 | 人人舔人人爱 | av福利免费 | 精品国内| 国产伦理久久精品久久久久_ | www.久久久精品 | 国模视频一区二区三区 | 亚洲视频在线观看网站 | 亚洲乱亚洲乱妇 | 精品欧美日韩 | 亚洲a成人v | a黄色影院| 久久精品美女 | 亚洲欧洲一区二区在线观看 | 区一区二在线 | 九九在线播放 | 国产亚洲情侣一区二区无 | 永久精品视频 |