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

歡迎訪問 生活随笔!

生活随笔

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

java

JavaSE聊天室

發布時間:2024/4/15 java 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaSE聊天室 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天學習了一下簡單聊天程序(類似QQ那種)的編寫過程,從最初的0.1版本到最后的1.3版本,功能不斷地增強,下面對一天的學習內容進行梳理。

版本0.1

我們的需求是顯示一個窗體,其他什么也不用做,其他功能逐步添加,我們這里用的就是AWT中的Frame;

具體代碼實現:

1 import java.awt.*; 2 3 public class ChatClient extends Frame{ 4 5 /** 6 * @param args 7 */ 8 public static void main(String[] args) { 9 new ChatClient().launchFrame(); 10 } 11 12 /** 13 * Version 0.1 14 */ 15 public void launchFrame(){ 16 //設置Frame位置 17 setLocation(400, 300); 18 //設置Frame大小 19 this.setSize(300, 300); 20 //窗口可見 21 setVisible(true); 22 } 23 }

版本0.2

我們的需求是在我們的Frame中添加兩個部件TextField(用于輸入)和TextArea(用于顯示獲取的內容),此時我們可以在輸入框輸入內容,但是顯示框無法顯示我們輸入的內容.

1 import java.awt.*; 2 3 public class ChatClient extends Frame { 4 5 TextField tfTxt = new TextField(); 6 TextArea taContent = new TextArea(); 7 8 public static void main(String[] args) { 9 new ChatClient().launchFrame(); 10 } 11 12 /** 13 * Version 0.2 14 */ 15 public void launchFrame() { 16 // 設置Frame位置 17 setLocation(400, 300); 18 // 設置Frame大小 19 this.setSize(300, 300); 20 // 將輸入框TextField加到Frame中,并放置到Frame布局的上面 21 add(tfTxt, BorderLayout.SOUTH); 22 // 將顯示框TextArea加到Frame中,并放置到Frame布局的下面 23 add(taContent, BorderLayout.NORTH); 24 // 調整布局,處理多余空白框 25 pack(); 26 // 窗口可見 27 setVisible(true); 28 } 29 }

版本0.3

因為我們的版本0.2中,顯示的窗體無法關閉(除非把程序停掉,我們這里不考慮這種做法),我們添加窗口監聽,使我們可以通過點擊窗體的(X)符號進行關閉;

1 import java.awt.*; 2 import java.awt.event.*; 3 4 public class ChatClient extends Frame { 5 6 TextField tfTxt = new TextField(); 7 TextArea taContent = new TextArea(); 8 9 public static void main(String[] args) { 10 new ChatClient().launchFrame(); 11 } 12 13 /** 14 * Version 0.3:添加窗口關閉的功能 15 */ 16 public void launchFrame() { 17 // 設置Frame位置 18 setLocation(400, 300); 19 // 設置Frame大小 20 this.setSize(300, 300); 21 // 將輸入框TextField加到Frame中,并放置到Frame布局的上面 22 add(tfTxt, BorderLayout.SOUTH); 23 // 將顯示框TextArea加到Frame中,并放置到Frame布局的下面 24 add(taContent, BorderLayout.NORTH); 25 // 調整布局,處理多余空白框 26 pack(); 27 //添加窗口監聽 28 this.addWindowListener(new WindowAdapter() { 29 30 @Override 31 public void windowClosing(WindowEvent e) { 32 System.exit(0); 33 } 34 }); 35 36 // 窗口可見 37 setVisible(true); 38 } 39 }

版本0.4

我們實現的功能是將輸入框輸入的內容顯示到顯示框TextArea中,

1 import java.awt.*; 2 import java.awt.event.*; 3 4 public class ChatClient extends Frame { 5 6 TextField tfTxt = new TextField(); 7 TextArea taContent = new TextArea(); 8 9 public static void main(String[] args) { 10 new ChatClient().launchFrame(); 11 } 12 13 /** 14 * Version 0.4 15 */ 16 public void launchFrame() { 17 // 設置Frame位置 18 setLocation(400, 300); 19 // 設置Frame大小 20 this.setSize(300, 300); 21 // 將輸入框TextField加到Frame中,并放置到Frame布局的上面 22 add(tfTxt, BorderLayout.SOUTH); 23 // 將顯示框TextArea加到Frame中,并放置到Frame布局的下面 24 add(taContent, BorderLayout.NORTH); 25 // 調整布局,處理多余空白框 26 pack(); 27 // 添加窗口監聽 28 this.addWindowListener(new WindowAdapter() { 29 30 @Override 31 public void windowClosing(WindowEvent e) { 32 System.exit(0); 33 } 34 }); 35 36 // 將監聽器類TFListener添加到輸入框TextField中 37 tfTxt.addActionListener(new TFListener()); 38 // 窗口可見 39 setVisible(true); 40 } 41 42 // 建立私有的監聽器類,TextField監聽:將TextField內容放置到TextArea 43 private class TFListener implements ActionListener { 44 45 @Override 46 public void actionPerformed(ActionEvent e) { 47 //獲得輸入框的內容,并去除兩端的空格 48 String s = tfTxt.getText().trim(); 49 //將獲取的輸入內容放置到TextArea中 50 taContent.setText(s); 51 //每次輸入結束,將輸入框置空 52 tfTxt.setText(""); 53 } 54 } 55 }

版本0.5

相比版本0.4,我們添加了Server端,使得Server作為中轉站,把我們輸入的內容顯示在其他連接到Server端的客戶端的的顯示框中;

ChatClient

1 import java.awt.*; 2 import java.awt.event.*; 3 4 public class ChatClient extends Frame { 5 6 TextField tfTxt = new TextField(); 7 TextArea taContent = new TextArea(); 8 9 public static void main(String[] args) { 10 new ChatClient().launchFrame(); 11 } 12 13 /** 14 * Version 0.5:處理輸入框 15 */ 16 public void launchFrame() { 17 // 設置Frame位置 18 setLocation(400, 300); 19 // 設置Frame大小 20 this.setSize(300, 300); 21 // 將輸入框TextField加到Frame中,并放置到Frame布局的上面 22 add(tfTxt, BorderLayout.SOUTH); 23 // 將顯示框TextArea加到Frame中,并放置到Frame布局的下面 24 add(taContent, BorderLayout.NORTH); 25 // 調整布局,處理多余空白框 26 pack(); 27 // 添加窗口監聽 28 this.addWindowListener(new WindowAdapter() { 29 30 @Override 31 public void windowClosing(WindowEvent e) { 32 System.exit(0); 33 } 34 }); 35 36 // 將監聽器類TFListener添加到輸入框TextField中 37 tfTxt.addActionListener(new TFListener()); 38 // 窗口可見 39 setVisible(true); 40 } 41 42 // 建立私有的監聽器類,TextField監聽:將TextField內容放置到TextArea 43 private class TFListener implements ActionListener { 44 45 @Override 46 public void actionPerformed(ActionEvent e) { 47 // 獲得輸入框的內容,并去除兩端的空格 48 String s = tfTxt.getText().trim(); 49 // 將獲取的輸入內容放置到TextArea中 50 taContent.setText(s); 51 // 每次輸入結束,將輸入框置空 52 tfTxt.setText(""); 53 } 54 } 55 } View Code

Server

1 import java.io.IOException; 2 import java.net.*; 3 4 //server端 5 public class ChatServer { 6 7 /** 8 * @param args 9 */ 10 public static void main(String[] args) { 11 try { 12 ServerSocket ss = new ServerSocket(8888); 13 while(true){ 14 Socket s=ss.accept(); 15 System.out.println("a clint connected"); 16 } 17 } catch (IOException e) { 18 e.printStackTrace(); 19 } 20 } 21 } View Code

此時,我們可以運行多個客戶端,但是每個客戶端輸入的內容在其他客戶端都無法顯示,他們都是孤立的,還沒有與Server端建立連接;

版本0.6

ChatClient

1 import java.awt.*; 2 import java.awt.event.*; 3 import java.io.*; 4 import java.net.*; 5 6 public class ChatClient extends Frame { 7 Socket s = null; 8 9 TextField tfTxt = new TextField(); 10 11 TextArea taContent = new TextArea(); 12 13 public static void main(String[] args) { 14 new ChatClient().launchFrame(); 15 } 16 17 /** 18 * Version 0.6 19 */ 20 public void launchFrame() { 21 setLocation(400, 300); 22 this.setSize(300, 300); 23 add(tfTxt, BorderLayout.SOUTH); 24 add(taContent, BorderLayout.NORTH); 25 pack(); 26 this.addWindowListener(new WindowAdapter() { 27 28 @Override 29 public void windowClosing(WindowEvent arg0) { 30 System.exit(0); 31 } 32 33 }); 34 tfTxt.addActionListener(new TFListener()); 35 setVisible(true); 36 connect(); 37 } 38 39 public void connect() { 40 try { 41 s = new Socket("127.0.0.1", 8888); 42 System.out.println("connected!"); 43 } catch (UnknownHostException e) { 44 e.printStackTrace(); 45 } catch (IOException e) { 46 e.printStackTrace(); 47 } 48 49 } 50 51 private class TFListener implements ActionListener { 52 53 public void actionPerformed(ActionEvent e) { 54 String str = tfTxt.getText().trim(); 55 taContent.setText(str); 56 tfTxt.setText(""); 57 58 try { 59 DataOutputStream dos = new DataOutputStream(s.getOutputStream()); 60 dos.writeUTF(str); 61 dos.flush(); 62 dos.close(); 63 } catch (IOException e1) { 64 e1.printStackTrace(); 65 } 66 67 } 68 69 } 70 71 } View Code

Server

1 import java.io.*; 2 import java.net.*; 3 4 public class ChatServer { 5 6 public static void main(String[] args) { 7 try { 8 // 服務器端需要創建監聽端口的 ServerSocket, ServerSocket 負責接收客戶連接請求 9 ServerSocket ss = new ServerSocket(8888); 10 while (true) { 11 //服務器端應對客戶端的每一個連接建立一個新的Socket(重要) 12 Socket s = ss.accept(); 13 // 當有客戶端連接上時,打印連接信息 14 System.out.println("a client connected!"); 15 16 //獲取Socket s的輸入流 17 DataInputStream dis = new DataInputStream(s.getInputStream()); 18 //獲取輸入流中的信息 19 String str = dis.readUTF(); 20 System.out.println(str); 21 //關閉流操作 22 dis.close(); 23 } 24 } catch (IOException e) { 25 e.printStackTrace(); 26 } 27 } 28 29 } View Code

我們此時客戶端輸入的內容可以顯示在Server端的控制臺上,每個連接上的Client的輸入只有第一次輸入可以顯示在控制臺,每個客戶端不可以接收其他客戶端的信息。并且當我們某些關閉處于連接狀態的客戶端的時候Server端會報Socket異常;

版本0.7

ChatClient

1 import java.awt.*; 2 import java.awt.event.*; 3 import java.io.DataOutputStream; 4 import java.io.IOException; 5 import java.net.*; 6 7 public class ChatClient extends Frame { 8 9 // 暴露Socket 10 Socket s = null; 11 TextField tfTxt = new TextField(); 12 TextArea taContent = new TextArea(); 13 14 public static void main(String[] args) { 15 new ChatClient().launchFrame(); 16 } 17 18 /** 19 * Version 0.7 20 */ 21 public void launchFrame() { 22 // 設置Frame位置 23 setLocation(400, 300); 24 // 設置Frame大小 25 this.setSize(300, 300); 26 // 將輸入框TextField加到Frame中,并放置到Frame布局的上面 27 add(tfTxt, BorderLayout.SOUTH); 28 // 將顯示框TextArea加到Frame中,并放置到Frame布局的下面 29 add(taContent, BorderLayout.NORTH); 30 // 調整布局,處理多余空白框 31 pack(); 32 // 添加窗口監聽 33 this.addWindowListener(new WindowAdapter() { 34 35 @Override 36 public void windowClosing(WindowEvent e) { 37 System.exit(0); 38 } 39 }); 40 41 // 將監聽器類TFListener添加到輸入框TextField中 42 tfTxt.addActionListener(new TFListener()); 43 // 窗口可見 44 setVisible(true); 45 connect(); 46 } 47 48 // 建立連接的方法 49 public void connect() { 50 try { 51 s = new Socket("127.0.0.1", 8888); 52 System.out.println("connected!"); 53 } catch (UnknownHostException e) { 54 e.printStackTrace(); 55 } catch (IOException e) { 56 e.printStackTrace(); 57 } 58 } 59 60 // 建立私有的監聽器類,TextField監聽:將TextField內容放置到TextArea 61 private class TFListener implements ActionListener { 62 63 @Override 64 public void actionPerformed(ActionEvent e) { 65 // 獲得輸入框的內容,并去除兩端的空格 66 String string = tfTxt.getText().trim(); 67 // 將獲取的輸入內容放置到TextArea中 68 taContent.setText(string); 69 // 每次輸入結束,將輸入框置空 70 tfTxt.setText(""); 71 try { 72 System.out.println(s); 73 DataOutputStream dos = new DataOutputStream(s.getOutputStream()); 74 dos.writeUTF(string); 75 dos.flush(); 76 dos.close(); 77 } catch (IOException e1) { 78 e1.printStackTrace(); 79 } 80 81 } 82 } 83 } View Code

Server

1 import java.io.DataInputStream; 2 import java.io.IOException; 3 import java.net.*; 4 5 //server端 6 public class ChatServer { 7 8 /** 9 * @param args 10 */ 11 public static void main(String[] args) { 12 try { 13 ServerSocket ss = new ServerSocket(8888); 14 while(true){ 15 Socket s=ss.accept(); 16 System.out.println("a clint connected"); 17 DataInputStream dis=new DataInputStream(s.getInputStream()); 18 String str=dis.readUTF(); 19 System.out.println(str); 20 dis.close(); 21 } 22 } catch (IOException e) { 23 e.printStackTrace(); 24 } 25 } 26 27 } View Code

相較于版本0.6,做了一些調試工作,每次打印System.out.println(s);觀察出錯信息,關閉客戶端時,仍然會出現Socket is closed異常

版本0.8

ChatClient

1 import java.awt.*; 2 import java.awt.event.*; 3 import java.io.DataOutputStream; 4 import java.io.IOException; 5 import java.net.*; 6 public class ChatClient extends Frame { 7 8 //暴露Socket 9 Socket s=null; 10 DataOutputStream dos=null; 11 TextField tfTxt = new TextField(); 12 TextArea taContent = new TextArea(); 13 14 public static void main(String[] args) { 15 new ChatClient().launchFrame(); 16 } 17 18 /** 19 * Version 0.8 20 */ 21 public void launchFrame() { 22 // 設置Frame位置 23 setLocation(400, 300); 24 // 設置Frame大小 25 this.setSize(300, 300); 26 // 將輸入框TextField加到Frame中,并放置到Frame布局的上面 27 add(tfTxt, BorderLayout.SOUTH); 28 // 將顯示框TextArea加到Frame中,并放置到Frame布局的下面 29 add(taContent, BorderLayout.NORTH); 30 // 調整布局,處理多余空白框 31 pack(); 32 // 添加窗口監聽 33 this.addWindowListener(new WindowAdapter() { 34 35 @Override 36 public void windowClosing(WindowEvent e) { 37 //窗口關閉的時候釋放連接資源 38 disconnect(); 39 System.exit(0); 40 } 41 }); 42 43 // 將監聽器類TFListener添加到輸入框TextField中 44 tfTxt.addActionListener(new TFListener()); 45 // 窗口可見 46 setVisible(true); 47 connect(); 48 } 49 //建立連接的方法 50 public void connect(){ 51 try { 52 s=new Socket("127.0.0.1",8888); 53 dos=new DataOutputStream(s.getOutputStream()); 54 System.out.println("connected!"); 55 } catch (UnknownHostException e) { 56 e.printStackTrace(); 57 } catch (IOException e) { 58 e.printStackTrace(); 59 } 60 } 61 public void disconnect(){ 62 try { 63 dos.close(); 64 s.close(); 65 } catch (Exception e) { 66 e.printStackTrace(); 67 } 68 } 69 70 // 建立私有的監聽器類,TextField監聽:將TextField內容放置到TextArea 71 private class TFListener implements ActionListener { 72 73 @Override 74 public void actionPerformed(ActionEvent e) { 75 // 獲得輸入框的內容,并去除兩端的空格 76 String string = tfTxt.getText().trim(); 77 // 將獲取的輸入內容放置到TextArea中 78 taContent.setText(string); 79 // 每次輸入結束,將輸入框置空 80 tfTxt.setText(""); 81 try { 82 System.out.println(s); 83 //不同每次都獲取一次連接 84 // DataOutputStream dos=new DataOutputStream(s.getOutputStream()); 85 dos.writeUTF(string); 86 dos.flush(); 87 // dos.close(); 88 } catch (IOException e1) { 89 e1.printStackTrace(); 90 } 91 92 } 93 } 94 } View Code

Server

1 import java.io.DataInputStream; 2 import java.io.IOException; 3 import java.net.*; 4 5 //server端 6 public class ChatServer { 7 8 public static void main(String[] args) { 9 //服務器端是否已經啟動 10 boolean started=false; 11 try { 12 ServerSocket ss = new ServerSocket(8888); 13 //服務器端啟動以后,started=true 14 started=true; 15 //服務器端啟動以后才能不斷接收客戶端的連接 16 while(started){ 17 //定義boolean類型的變量,客戶端時候建立連接 18 boolean bConnected; 19 Socket s=ss.accept(); 20 System.out.println("a clint connected"); 21 //客戶端時候建立連接以后,bConnected=true; 22 bConnected=true; 23 DataInputStream dis=new DataInputStream(s.getInputStream()); 24 //客戶端建立連接以后,不斷的接收寫來的數據 25 while(bConnected){ 26 String str=dis.readUTF(); 27 System.out.println(str); 28 } 29 //沒有連接上,關閉dis,釋放資源 30 dis.close(); 31 } 32 } catch (IOException e) { 33 e.printStackTrace(); 34 } 35 } 36 37 } View Code

我們在這一版本中添加了連接標志,運行測試發現Server端可以接收多個客戶端的連接,但是只能將第一個連接的客戶端的輸入顯示在控制臺,其他客戶端依然無法獲取到其他客戶端的內容,仍會出現異常

版本0.9

ChatClient

1 import java.awt.*; 2 import java.awt.event.*; 3 import java.io.DataOutputStream; 4 import java.io.IOException; 5 import java.net.*; 6 public class ChatClient extends Frame { 7 8 //暴露Socket 9 Socket s=null; 10 DataOutputStream dos=null; 11 TextField tfTxt = new TextField(); 12 TextArea taContent = new TextArea(); 13 14 public static void main(String[] args) { 15 new ChatClient().launchFrame(); 16 } 17 18 /** 19 * Version 0.9 20 */ 21 public void launchFrame() { 22 // 設置Frame位置 23 setLocation(400, 300); 24 // 設置Frame大小 25 this.setSize(300, 300); 26 // 將輸入框TextField加到Frame中,并放置到Frame布局的上面 27 add(tfTxt, BorderLayout.SOUTH); 28 // 將顯示框TextArea加到Frame中,并放置到Frame布局的下面 29 add(taContent, BorderLayout.NORTH); 30 // 調整布局,處理多余空白框 31 pack(); 32 // 添加窗口監聽 33 this.addWindowListener(new WindowAdapter() { 34 35 @Override 36 public void windowClosing(WindowEvent e) { 37 //窗口關閉的時候釋放連接資源 38 disconnect(); 39 System.exit(0); 40 } 41 }); 42 43 // 將監聽器類TFListener添加到輸入框TextField中 44 tfTxt.addActionListener(new TFListener()); 45 // 窗口可見 46 setVisible(true); 47 connect(); 48 } 49 //建立連接的方法 50 public void connect(){ 51 try { 52 s=new Socket("127.0.0.1",8888); 53 dos=new DataOutputStream(s.getOutputStream()); 54 System.out.println("connected!"); 55 } catch (UnknownHostException e) { 56 e.printStackTrace(); 57 } catch (IOException e) { 58 e.printStackTrace(); 59 } 60 } 61 public void disconnect(){ 62 try { 63 dos.close(); 64 s.close(); 65 } catch (Exception e) { 66 e.printStackTrace(); 67 } 68 } 69 70 // 建立私有的監聽器類,TextField監聽:將TextField內容放置到TextArea 71 private class TFListener implements ActionListener { 72 73 @Override 74 public void actionPerformed(ActionEvent e) { 75 // 獲得輸入框的內容,并去除兩端的空格 76 String string = tfTxt.getText().trim(); 77 // 將獲取的輸入內容放置到TextArea中 78 taContent.setText(string); 79 // 每次輸入結束,將輸入框置空 80 tfTxt.setText(""); 81 try { 82 System.out.println(s); 83 //不同每次都獲取一次連接 84 // DataOutputStream dos=new DataOutputStream(s.getOutputStream()); 85 dos.writeUTF(string); 86 dos.flush(); 87 // dos.close(); 88 } catch (IOException e1) { 89 e1.printStackTrace(); 90 } 91 92 } 93 } 94 } View Code

Server

1 import java.io.DataInputStream; 2 import java.io.EOFException; 3 import java.io.IOException; 4 import java.net.*; 5 6 //server端 7 public class ChatServer { 8 9 public static void main(String[] args) { 10 //服務器端是否已經啟動 11 boolean started=false; 12 ServerSocket ss = null; 13 Socket s=null; 14 DataInputStream dis=null; 15 try { 16 //可能會產生端口綁定異常 17 ss = new ServerSocket(8888); 18 }catch(BindException e){ 19 System.out.println("端口使用中"); 20 System.out.println("關閉相關程序,并重新運行"); 21 System.exit(0); 22 }catch(IOException e){ 23 e.printStackTrace(); 24 } 25 try { 26 //服務器端啟動以后,started=true 27 started=true; 28 //服務器端啟動以后才能不斷接收客戶端的連接 29 while(started){ 30 //定義boolean類型的變量,客戶端時候建立連接 31 boolean bConnected; 32 s=ss.accept(); 33 System.out.println("a clint connected"); 34 //客戶端時候建立連接以后,bConnected=true; 35 bConnected=true; 36 dis=new DataInputStream(s.getInputStream()); 37 //客戶端建立連接以后,不斷的接收寫來的數據 38 while(bConnected){ 39 //readUTF是阻塞式的 40 String str=dis.readUTF(); 41 System.out.println(str); 42 } 43 //沒有連接上,關閉dis,釋放資源 44 // dis.close(); 45 } 46 //如果是因為客戶端的關閉而導致的連接中斷,則做這樣的處理 47 }catch(EOFException e){ 48 System.out.println("Client closed"); 49 //其他異常,直接打印異常信息 50 }catch (IOException e) { 51 e.printStackTrace(); 52 }finally{ 53 try { 54 if(dis!=null){ 55 dis.close(); 56 } 57 if(s!=null){ 58 s.close(); 59 } 60 } catch (IOException e1) { 61 e1.printStackTrace(); 62 } 63 } 64 } 65 66 } View Code

之前的版本,當我們關閉客戶端的時候都會發生異常,在這個版本中我們做了相應的處理,去捕獲這個異常,并將連接資源的關閉工作進行細化;這里我們在客戶端進行了處理:將DataOutputStream提到了全局變量的位置。不用每次都去獲取一次Socket的輸出流;

版本1.0

ChatClient

1 import java.awt.*; 2 import java.awt.event.*; 3 import java.io.DataOutputStream; 4 import java.io.IOException; 5 import java.net.*; 6 7 public class ChatClient extends Frame { 8 9 // 暴露Socket 10 Socket s = null; 11 DataOutputStream dos = null; 12 TextField tfTxt = new TextField(); 13 TextArea taContent = new TextArea(); 14 15 public static void main(String[] args) { 16 new ChatClient().launchFrame(); 17 } 18 19 /** 20 * Version 1.0 21 */ 22 public void launchFrame() { 23 // 設置Frame位置 24 setLocation(400, 300); 25 // 設置Frame大小 26 this.setSize(300, 300); 27 // 將輸入框TextField加到Frame中,并放置到Frame布局的上面 28 add(tfTxt, BorderLayout.SOUTH); 29 // 將顯示框TextArea加到Frame中,并放置到Frame布局的下面 30 add(taContent, BorderLayout.NORTH); 31 // 調整布局,處理多余空白框 32 pack(); 33 // 添加窗口監聽 34 this.addWindowListener(new WindowAdapter() { 35 36 @Override 37 public void windowClosing(WindowEvent e) { 38 // 窗口關閉的時候釋放連接資源 39 disconnect(); 40 System.exit(0); 41 } 42 }); 43 44 // 將監聽器類TFListener添加到輸入框TextField中 45 tfTxt.addActionListener(new TFListener()); 46 // 窗口可見 47 setVisible(true); 48 connect(); 49 } 50 51 // 建立連接的方法 52 public void connect() { 53 try { 54 s = new Socket("127.0.0.1", 8888); 55 dos = new DataOutputStream(s.getOutputStream()); 56 System.out.println("connected!"); 57 } catch (UnknownHostException e) { 58 e.printStackTrace(); 59 } catch (IOException e) { 60 e.printStackTrace(); 61 } 62 } 63 64 public void disconnect() { 65 try { 66 dos.close(); 67 s.close(); 68 } catch (Exception e) { 69 e.printStackTrace(); 70 } 71 } 72 73 // 建立私有的監聽器類,TextField監聽:將TextField內容放置到TextArea 74 private class TFListener implements ActionListener { 75 76 @Override 77 public void actionPerformed(ActionEvent e) { 78 // 獲得輸入框的內容,并去除兩端的空格 79 String string = tfTxt.getText().trim(); 80 // 將獲取的輸入內容放置到TextArea中 81 taContent.setText(string); 82 // 每次輸入結束,將輸入框置空 83 tfTxt.setText(""); 84 try { 85 System.out.println(s); 86 // 不同每次都獲取一次連接 87 // DataOutputStream dos=new 88 // DataOutputStream(s.getOutputStream()); 89 dos.writeUTF(string); 90 dos.flush(); 91 // dos.close(); 92 } catch (IOException e1) { 93 e1.printStackTrace(); 94 } 95 96 } 97 } 98 } View Code

Server

1 import java.io.DataInputStream; 2 import java.io.EOFException; 3 import java.io.IOException; 4 import java.net.*; 5 import java.security.Principal; 6 7 //server端 8 public class ChatServer { 9 10 boolean started = false; 11 ServerSocket ss = null; 12 13 public static void main(String[] args) { 14 new ChatServer().start(); 15 } 16 17 public void start() { 18 19 try { 20 // 可能會產生端口綁定異常 21 ss = new ServerSocket(8888); 22 // 服務器端啟動以后,started=true 23 started = true; 24 } catch (BindException e) { 25 System.out.println("端口使用中"); 26 System.out.println("關閉相關程序,并重新運行"); 27 System.exit(0); 28 } catch (IOException e) { 29 e.printStackTrace(); 30 } 31 try { 32 // 服務器端啟動以后才能不斷接收客戶端的連接 33 while (started) { 34 Socket s = ss.accept(); 35 // 不能在靜態方法里new一個動態的類 36 Client c = new Client(s); 37 System.out.println("a clint connected"); 38 new Thread(c).start(); 39 } 40 // 如果是因為客戶端的關閉而導致的連接中斷,則做這樣的處理 41 } catch (IOException e) { 42 e.printStackTrace(); 43 44 } finally { 45 try { 46 ss.close(); 47 } catch (IOException e) { 48 e.printStackTrace(); 49 } 50 } 51 } 52 53 } 54 55 class Client implements Runnable { 56 private Socket s; 57 private DataInputStream dis = null; 58 private boolean bConnected = false; 59 60 public Client(Socket s) { 61 this.s = s; 62 try { 63 dis = new DataInputStream(s.getInputStream()); 64 bConnected = true; 65 }catch (IOException e) { 66 e.printStackTrace(); 67 68 } 69 } 70 71 @Override 72 public void run() { 73 try { 74 while (bConnected) { 75 String str = dis.readUTF(); 76 System.out.println(str); 77 } 78 } catch (EOFException e) { 79 System.out.println("Client closed"); 80 } catch (IOException e) { 81 e.printStackTrace(); 82 } finally { 83 try { 84 if (dis != null) { 85 dis.close(); 86 } 87 if (s != null) { 88 s.close(); 89 } 90 } catch (Exception e2) { 91 e2.printStackTrace(); 92 } 93 } 94 95 } 96 97 } View Code

版本1.0可以處理多個客戶端同時連接并顯示其輸入內容的效果;將每個客戶端封裝到一個獨立的線程中;

版本1.1

ChatClient

1 import java.awt.*; 2 import java.awt.event.*; 3 import java.io.DataOutputStream; 4 import java.io.IOException; 5 import java.net.*; 6 import java.util.*; 7 import java.util.List; 8 //轉發給 9 public class ChatClient extends Frame { 10 11 // 暴露Socket 12 Socket s = null; 13 DataOutputStream dos = null; 14 TextField tfTxt = new TextField(); 15 TextArea taContent = new TextArea(); 16 17 public static void main(String[] args) { 18 new ChatClient().launchFrame(); 19 } 20 21 /** 22 * Version 1.1:轉發給其他客戶端,保存socket連接,用集合 23 */ 24 public void launchFrame() { 25 // 設置Frame位置 26 setLocation(400, 300); 27 // 設置Frame大小 28 this.setSize(300, 300); 29 // 將輸入框TextField加到Frame中,并放置到Frame布局的上面 30 add(tfTxt, BorderLayout.SOUTH); 31 // 將顯示框TextArea加到Frame中,并放置到Frame布局的下面 32 add(taContent, BorderLayout.NORTH); 33 // 調整布局,處理多余空白框 34 pack(); 35 // 添加窗口監聽 36 this.addWindowListener(new WindowAdapter() { 37 38 @Override 39 public void windowClosing(WindowEvent e) { 40 // 窗口關閉的時候釋放連接資源 41 disconnect(); 42 System.exit(0); 43 } 44 }); 45 46 // 將監聽器類TFListener添加到輸入框TextField中 47 tfTxt.addActionListener(new TFListener()); 48 // 窗口可見 49 setVisible(true); 50 connect(); 51 } 52 53 // 建立連接的方法 54 public void connect() { 55 try { 56 s = new Socket("127.0.0.1", 8888); 57 dos = new DataOutputStream(s.getOutputStream()); 58 System.out.println("connected!"); 59 } catch (UnknownHostException e) { 60 e.printStackTrace(); 61 } catch (IOException e) { 62 e.printStackTrace(); 63 } 64 } 65 66 public void disconnect() { 67 try { 68 dos.close(); 69 s.close(); 70 } catch (Exception e) { 71 e.printStackTrace(); 72 } 73 } 74 75 // 建立私有的監聽器類,TextField監聽:將TextField內容放置到TextArea 76 private class TFListener implements ActionListener { 77 78 @Override 79 public void actionPerformed(ActionEvent e) { 80 // 獲得輸入框的內容,并去除兩端的空格 81 String string = tfTxt.getText().trim(); 82 // 將獲取的輸入內容放置到TextArea中 83 taContent.setText(string); 84 // 每次輸入結束,將輸入框置空 85 tfTxt.setText(""); 86 try { 87 System.out.println(s); 88 // 不同每次都獲取一次連接 89 // DataOutputStream dos=new 90 // DataOutputStream(s.getOutputStream()); 91 dos.writeUTF(string); 92 dos.flush(); 93 // dos.close(); 94 } catch (IOException e1) { 95 e1.printStackTrace(); 96 } 97 98 } 99 } 100 } View Code

Server

1 import java.io.DataInputStream; 2 import java.io.DataOutputStream; 3 import java.io.EOFException; 4 import java.io.IOException; 5 import java.net.*; 6 import java.security.Principal; 7 import java.util.ArrayList; 8 import java.util.List; 9 10 //server端 11 public class ChatServer { 12 13 boolean started = false; 14 ServerSocket ss = null; 15 List<Client> clients = new ArrayList<Client>(); 16 17 public static void main(String[] args) { 18 new ChatServer().start(); 19 } 20 21 public void start() { 22 23 try { 24 // 可能會產生端口綁定異常 25 ss = new ServerSocket(8888); 26 // 服務器端啟動以后,started=true 27 started = true; 28 } catch (BindException e) { 29 System.out.println("端口使用中"); 30 System.out.println("關閉相關程序,并重新運行"); 31 System.exit(0); 32 } catch (IOException e) { 33 e.printStackTrace(); 34 } 35 try { 36 // 服務器端啟動以后才能不斷接收客戶端的連接 37 while (started) { 38 Socket s = ss.accept(); 39 // 不能在靜態方法里new一個動態的類 40 Client c = new Client(s); 41 System.out.println("a clint connected"); 42 new Thread(c).start(); 43 clients.add(c); 44 } 45 // 如果是因為客戶端的關閉而導致的連接中斷,則做這樣的處理 46 } catch (IOException e) { 47 e.printStackTrace(); 48 49 } finally { 50 try { 51 ss.close(); 52 } catch (IOException e) { 53 e.printStackTrace(); 54 } 55 } 56 } 57 58 class Client implements Runnable { 59 private Socket s; 60 private DataInputStream dis = null; 61 private DataOutputStream dos = null; 62 private boolean bConnected = false; 63 64 public Client(Socket s) { 65 this.s = s; 66 try { 67 dis = new DataInputStream(s.getInputStream()); 68 dos = new DataOutputStream(s.getOutputStream()); 69 bConnected = true; 70 } catch (IOException e) { 71 e.printStackTrace(); 72 73 } 74 } 75 76 // 發送的方法 77 public void send(String str) { 78 try { 79 dos.writeUTF(str); 80 } catch (IOException e) { 81 e.printStackTrace(); 82 } 83 } 84 85 @Override 86 public void run() { 87 try { 88 while (bConnected) { 89 String str = dis.readUTF(); 90 System.out.println(str); 91 for(int i=0;i<clients.size();i++){ 92 Client c=clients.get(i); 93 c.send(str); 94 } 95 } 96 } catch (EOFException e) { 97 System.out.println("Client closed"); 98 } catch (IOException e) { 99 e.printStackTrace(); 100 } finally { 101 try { 102 if (dis != null) { 103 dis.close(); 104 } 105 if (s != null) { 106 s.close(); 107 } 108 if(dos!=null){ 109 dos.close(); 110 } 111 } catch (Exception e2) { 112 e2.printStackTrace(); 113 } 114 } 115 116 } 117 } 118 } View Code

將每個連接上的客戶端Client添加到我們的List集合中,方便我們將我們的輸入內容發送到List集合保存的Client;

版本1.2

ChatClient

1 import java.awt.BorderLayout; 2 import java.awt.Frame; 3 import java.awt.TextArea; 4 import java.awt.TextField; 5 import java.awt.event.ActionEvent; 6 import java.awt.event.ActionListener; 7 import java.awt.event.WindowAdapter; 8 import java.awt.event.WindowEvent; 9 import java.io.DataInputStream; 10 import java.io.DataOutputStream; 11 import java.io.IOException; 12 import java.net.Socket; 13 import java.net.SocketException; 14 import java.net.UnknownHostException; 15 16 //轉發給 17 public class ChatClient extends Frame { 18 19 // 暴露Socket 20 Socket s = null; 21 DataOutputStream dos = null; 22 DataInputStream dis = null; 23 private boolean bConnected = false; 24 TextField tfTxt = new TextField(); 25 TextArea taContent = new TextArea(); 26 27 Thread tRecv=new Thread(new RecvThread()); 28 public static void main(String[] args) { 29 new ChatClient().launchFrame(); 30 } 31 32 /** 33 * Version 1.2 34 */ 35 public void launchFrame() { 36 // 設置Frame位置 37 setLocation(400, 300); 38 // 設置Frame大小 39 this.setSize(300, 300); 40 // 將輸入框TextField加到Frame中,并放置到Frame布局的上面 41 add(tfTxt, BorderLayout.SOUTH); 42 // 將顯示框TextArea加到Frame中,并放置到Frame布局的下面 43 add(taContent, BorderLayout.NORTH); 44 // 調整布局,處理多余空白框 45 pack(); 46 // 添加窗口監聽 47 this.addWindowListener(new WindowAdapter() { 48 49 @Override 50 public void windowClosing(WindowEvent e) { 51 // 窗口關閉的時候釋放連接資源 52 disconnect(); 53 System.exit(0); 54 } 55 }); 56 57 // 將監聽器類TFListener添加到輸入框TextField中 58 tfTxt.addActionListener(new TFListener()); 59 // 窗口可見 60 setVisible(true); 61 connect(); 62 63 tRecv.start(); 64 } 65 66 // 建立連接的方法 67 public void connect() { 68 try { 69 s = new Socket("127.0.0.1", 8888); 70 dos = new DataOutputStream(s.getOutputStream()); 71 dis = new DataInputStream(s.getInputStream()); 72 System.out.println("connected!"); 73 bConnected = true; 74 } catch (UnknownHostException e) { 75 e.printStackTrace(); 76 } catch (IOException e) { 77 e.printStackTrace(); 78 } 79 } 80 81 public void disconnect() { 82 try { 83 dos.close(); 84 dis.close(); 85 s.close(); 86 } catch (IOException e) { 87 e.printStackTrace(); 88 } 89 /* try { 90 bConnected=false; 91 tRecv.join(); 92 } catch(InterruptedException e){ 93 e.printStackTrace(); 94 } finally{ 95 try { 96 dos.close(); 97 dis.close(); 98 s.close(); 99 } catch (IOException e) { 100 e.printStackTrace(); 101 } 102 103 }*/ 104 } 105 106 private class RecvThread implements Runnable { 107 108 @Override 109 public void run() { 110 try { 111 while (bConnected) { 112 String str = dis.readUTF(); 113 // System.out.println(str); 114 taContent.setText(taContent.getText()+str+"\n"); 115 } 116 }catch(SocketException e){ 117 System.out.println("退出!over"); 118 }catch (IOException e) { 119 e.printStackTrace(); 120 } 121 } 122 } 123 124 // 建立私有的監聽器類,TextField監聽:將TextField內容放置到TextArea 125 private class TFListener implements ActionListener { 126 127 @Override 128 public void actionPerformed(ActionEvent e) { 129 // 獲得輸入框的內容,并去除兩端的空格 130 String string = tfTxt.getText().trim(); 131 // 將獲取的輸入內容放置到TextArea中 132 taContent.setText(string); 133 // 每次輸入結束,將輸入框置空 134 tfTxt.setText(""); 135 try { 136 System.out.println(s); 137 // 不同每次都獲取一次連接 138 // DataOutputStream dos=new 139 // DataOutputStream(s.getOutputStream()); 140 dos.writeUTF(string); 141 dos.flush(); 142 // dos.close(); 143 } catch (IOException e1) { 144 e1.printStackTrace(); 145 } 146 147 } 148 } 149 } View Code

Server

1 import java.io.DataInputStream; 2 import java.io.DataOutputStream; 3 import java.io.EOFException; 4 import java.io.IOException; 5 import java.net.BindException; 6 import java.net.ServerSocket; 7 import java.net.Socket; 8 import java.util.ArrayList; 9 import java.util.List; 10 11 //server端 12 public class ChatServer { 13 14 boolean started = false; 15 ServerSocket ss = null; 16 List<Client> clients = new ArrayList<Client>(); 17 18 public static void main(String[] args) { 19 new ChatServer().start(); 20 } 21 22 public void start() { 23 24 try { 25 // 可能會產生端口綁定異常 26 ss = new ServerSocket(8888); 27 // 服務器端啟動以后,started=true 28 started = true; 29 } catch (BindException e) { 30 System.out.println("端口使用中"); 31 System.out.println("關閉相關程序,并重新運行"); 32 System.exit(0); 33 } catch (IOException e) { 34 e.printStackTrace(); 35 } 36 try { 37 // 服務器端啟動以后才能不斷接收客戶端的連接 38 while (started) { 39 Socket s = ss.accept(); 40 // 不能在靜態方法里new一個動態的類 41 Client c = new Client(s); 42 System.out.println("a clint connected"); 43 new Thread(c).start(); 44 clients.add(c); 45 } 46 // 如果是因為客戶端的關閉而導致的連接中斷,則做這樣的處理 47 } catch (IOException e) { 48 e.printStackTrace(); 49 50 } finally { 51 try { 52 ss.close(); 53 } catch (IOException e) { 54 e.printStackTrace(); 55 } 56 } 57 } 58 59 class Client implements Runnable { 60 private Socket s; 61 private DataInputStream dis = null; 62 private DataOutputStream dos = null; 63 private boolean bConnected = false; 64 65 public Client(Socket s) { 66 this.s = s; 67 try { 68 dis = new DataInputStream(s.getInputStream()); 69 dos = new DataOutputStream(s.getOutputStream()); 70 bConnected = true; 71 } catch (IOException e) { 72 e.printStackTrace(); 73 74 } 75 } 76 77 // 發送的方法 78 public void send(String str) { 79 try { 80 dos.writeUTF(str); 81 } catch (IOException e) { 82 e.printStackTrace(); 83 } 84 } 85 86 @Override 87 public void run() { 88 try { 89 while (bConnected) { 90 String str = dis.readUTF(); 91 System.out.println(str); 92 for(int i=0;i<clients.size();i++){ 93 Client c=clients.get(i); 94 c.send(str); 95 } 96 } 97 } catch (EOFException e) { 98 System.out.println("Client closed"); 99 } catch (IOException e) { 100 e.printStackTrace(); 101 } finally { 102 try { 103 if (dis != null) { 104 dis.close(); 105 } 106 if (s != null) { 107 s.close(); 108 } 109 if(dos!=null){ 110 dos.close(); 111 } 112 } catch (Exception e2) { 113 e2.printStackTrace(); 114 } 115 } 116 117 } 118 } 119 } View Code

此時我們已經可以實現我們的預期功能了,不同的客戶端可以進行通信了;

版本1.3

ChatClient

1 import java.awt.*; 2 import java.awt.event.*; 3 import java.io.*; 4 import java.net.*; 5 6 public class ChatClient extends Frame { 7 Socket s = null; 8 DataOutputStream dos = null; 9 DataInputStream dis = null; 10 private boolean bConnected = false; 11 12 TextField tfTxt = new TextField(); 13 14 TextArea taContent = new TextArea(); 15 16 Thread tRecv = new Thread(new RecvThread()); 17 18 public static void main(String[] args) { 19 new ChatClient().launchFrame(); 20 } 21 22 public void launchFrame() { 23 setLocation(400, 300); 24 this.setSize(300, 300); 25 add(tfTxt, BorderLayout.SOUTH); 26 add(taContent, BorderLayout.NORTH); 27 pack(); 28 this.addWindowListener(new WindowAdapter() { 29 30 @Override 31 public void windowClosing(WindowEvent arg0) { 32 disconnect(); 33 System.exit(0); 34 } 35 36 }); 37 tfTxt.addActionListener(new TFListener()); 38 setVisible(true); 39 connect(); 40 41 tRecv.start(); 42 } 43 44 public void connect() { 45 try { 46 s = new Socket("127.0.0.1", 8888); 47 dos = new DataOutputStream(s.getOutputStream()); 48 dis = new DataInputStream(s.getInputStream()); 49 System.out.println("connected!"); 50 bConnected = true; 51 } catch (UnknownHostException e) { 52 e.printStackTrace(); 53 } catch (IOException e) { 54 e.printStackTrace(); 55 } 56 57 } 58 59 public void disconnect() { 60 try { 61 dos.close(); 62 dis.close(); 63 s.close(); 64 } catch (IOException e) { 65 e.printStackTrace(); 66 } 67 68 /* 69 * try { bConnected = false; tRecv.join(); } catch(InterruptedException 70 * e) { e.printStackTrace(); } finally { try { dos.close(); dis.close(); 71 * s.close(); } catch (IOException e) { e.printStackTrace(); } } 72 */ 73 } 74 75 private class TFListener implements ActionListener { 76 77 public void actionPerformed(ActionEvent e) { 78 String str = tfTxt.getText().trim(); 79 // taContent.setText(str); 80 tfTxt.setText(""); 81 82 try { 83 // System.out.println(s); 84 dos.writeUTF(str); 85 dos.flush(); 86 // dos.close(); 87 } catch (IOException e1) { 88 e1.printStackTrace(); 89 } 90 91 } 92 93 } 94 95 private class RecvThread implements Runnable { 96 97 public void run() { 98 try { 99 while (bConnected) { 100 String str = dis.readUTF(); 101 // System.out.println(str); 102 taContent.setText(taContent.getText() + str + '\n'); 103 } 104 } catch (SocketException e) { 105 System.out.println("退出了,bye!"); 106 } catch (EOFException e) { 107 System.out.println("推出了,bye - bye!"); 108 } catch (IOException e) { 109 e.printStackTrace(); 110 } 111 112 } 113 114 } 115 } View Code

Server

1 import java.io.*; 2 import java.net.*; 3 import java.util.*; 4 5 public class ChatServer { 6 boolean started = false; 7 ServerSocket ss = null; 8 9 List<Client> clients = new ArrayList<Client>(); 10 11 public static void main(String[] args) { 12 new ChatServer().start(); 13 } 14 15 public void start() { 16 try { 17 ss = new ServerSocket(8888); 18 started = true; 19 } catch (BindException e) { 20 System.out.println("端口使用中...."); 21 System.out.println("請關掉相關程序并重新運行服務器!"); 22 System.exit(0); 23 } catch (IOException e) { 24 e.printStackTrace(); 25 } 26 27 try { 28 29 while (started) { 30 Socket s = ss.accept(); 31 Client c = new Client(s); 32 System.out.println("a client connected!"); 33 new Thread(c).start(); 34 clients.add(c); 35 // dis.close(); 36 } 37 } catch (IOException e) { 38 e.printStackTrace(); 39 } finally { 40 try { 41 ss.close(); 42 } catch (IOException e) { 43 // TODO Auto-generated catch block 44 e.printStackTrace(); 45 } 46 } 47 } 48 49 class Client implements Runnable { 50 private Socket s; 51 private DataInputStream dis = null; 52 private DataOutputStream dos = null; 53 private boolean bConnected = false; 54 55 public Client(Socket s) { 56 this.s = s; 57 try { 58 dis = new DataInputStream(s.getInputStream()); 59 dos = new DataOutputStream(s.getOutputStream()); 60 bConnected = true; 61 } catch (IOException e) { 62 e.printStackTrace(); 63 } 64 } 65 66 public void send(String str) { 67 try { 68 dos.writeUTF(str); 69 } catch (IOException e) { 70 clients.remove(this); 71 System.out.println("對方退出了!我從List里面去掉了!"); 72 // e.printStackTrace(); 73 } 74 } 75 76 public void run() { 77 try { 78 while (bConnected) { 79 String str = dis.readUTF(); 80 System.out.println(str); 81 for (int i = 0; i < clients.size(); i++) { 82 Client c = clients.get(i); 83 c.send(str); 84 // System.out.println(" a string send !"); 85 } 86 /* 87 * for(Iterator<Client> it = clients.iterator(); 88 * it.hasNext(); ) { Client c = it.next(); c.send(str); } 89 */ 90 /* 91 * Iterator<Client> it = clients.iterator(); 92 * while(it.hasNext()) { Client c = it.next(); c.send(str); 93 * } 94 */ 95 } 96 } catch (EOFException e) { 97 System.out.println("Client closed!"); 98 } catch (IOException e) { 99 e.printStackTrace(); 100 } finally { 101 try { 102 if (dis != null) 103 dis.close(); 104 if (dos != null) 105 dos.close(); 106 if (s != null) { 107 s.close(); 108 // s = null; 109 } 110 111 } catch (IOException e1) { 112 e1.printStackTrace(); 113 } 114 115 } 116 } 117 118 } 119 } View Code

對程序出現的一些bug進行了修復,細化了關閉連接資源等操作,可以根據每個版本的差異梳理清楚代碼的編寫過程;

?

轉載于:https://www.cnblogs.com/ysw-go/p/5499630.html

總結

以上是生活随笔為你收集整理的JavaSE聊天室的全部內容,希望文章能夠幫你解決所遇到的問題。

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

国产 一区二区三区 在线 | 亚洲精品午夜aaa久久久 | 亚洲美女免费精品视频在线观看 | av动态图片| 91超国产 | 91在线蜜桃臀 | 国产99久久久国产精品成人免费 | www九九热| 99视频免费看 | www.国产视频 | 中文字幕在线国产 | 色综久久 | 久久日本视频 | 成人一区二区在线观看 | 免费高清在线视频一区· | 婷婷五月在线视频 | 色停停五月天 | 六月激情婷婷 | 日韩一级理论片 | 久久免费在线视频 | 免费福利片2019潦草影视午夜 | 色悠悠久久综合 | 久久成人亚洲欧美电影 | 91九色视频网站 | 99热高清 | 麻豆av一区二区三区在线观看 | 亚洲日本色 | 一二三区视频在线 | 国产高清中文字幕 | 亚洲经典在线 | 久久这里只有精品9 | 国产精品久久久久999 | 日韩精品一区电影 | 国产剧情一区在线 | 91精品在线免费观看 | 91.精品高清在线观看 | 成人av一区二区在线观看 | 国产精品美女 | 91大神电影 | 久久欧美精品 | 欧美精品乱码99久久影院 | 米奇影视7777 | 中文字幕亚洲精品在线观看 | 天天色影院 | 69xxxx欧美 | 国产精品嫩草影院9 | 国产91影视| 欧美一区二区三区在线播放 | 亚洲人人精品 | 日韩精品亚洲专区在线观看 | 在线国产一区二区三区 | 亚洲精品国产第一综合99久久 | 亚洲精品一区中文字幕乱码 | 97超视频在线观看 | 国产夫妻av在线 | 在线天堂中文在线资源网 | 日日夜夜天天 | 亚洲天堂毛片 | 国产一级黄色免费看 | 国产精品免费在线 | 久久国产精品99久久久久久进口 | 国产人成精品一区二区三 | 日韩中文字幕免费视频 | 首页中文字幕 | 中文字幕第一页在线视频 | 91.精品高清在线观看 | 日韩成人精品一区二区三区 | 日韩一区二区三区高清免费看看 | 黄色电影小说 | 国产专区第一页 | 国产精品黄色影片导航在线观看 | 国产精品正在播放 | 国产日韩欧美网站 | 在线视频亚洲 | 成人av直播| 久久久麻豆精品一区二区 | 国产精品麻豆三级一区视频 | 成人av网址大全 | 久久99在线观看 | 欧美日韩亚洲第一页 | 99riav1国产精品视频 | 欧美精品久久久久久久久免 | 综合久久综合久久 | 在线免费日韩 | av网站在线免费观看 | 亚洲成av| 91九色在线观看 | 国产欧美高清 | 久久影院精品 | 99在线高清视频在线播放 | 午夜精品视频在线 | 在线亚洲成人 | 丁香av在线 | 亚洲欧美成人在线 | 欧美日本一二三 | 日本精油按摩3 | 天天爽夜夜爽精品视频婷婷 | 免费观看91视频大全 | 中文字幕第一页在线 | 丰满少妇在线观看 | 99视频免费观看 | .国产精品成人自产拍在线观看6 | 国产无套一区二区三区久久 | 奇米影视8888 | 色婷婷天天干 | 久草免费在线 | 九九九视频精品 | 久久免费视频5 | 国产精品大尺度 | 国产麻豆视频 | 麻豆视频国产 | 日本午夜在线亚洲.国产 | 亚洲精品久久久久999中文字幕 | 91成人精品 | 中文字幕观看视频 | 成人免费视频播放 | 国产精品久久亚洲 | 五月婷婷深开心 | 精品国产精品久久一区免费式 | 天天曰视频| 亚洲一区网站 | 国产午夜精品一区 | 中文字幕一区在线观看视频 | 99精品国自产在线 | 日韩资源在线播放 | 国产最新福利 | 激情五月婷婷丁香 | 免费看的黄色小视频 | 婷婷丁香五 | 一区二区三区四区五区在线视频 | 久久大片网站 | 久久这里只有精品23 | 黄色大片国产 | 亚洲婷婷丁香 | 在线观看成人小视频 | 99精品免费视频 | 成人免费视频观看 | 日本性生活一级片 | 五月婷网 | 国产精品尤物视频 | 久久久精品国产免费观看一区二区 | 在线免费观看一区二区三区 | 91九色视频导航 | 中文av不卡| 国产黄在线看 | 亚洲经典视频在线观看 | 九九精品无码 | 91日韩在线视频 | 经典三级一区 | 在线不卡a | 免费av电影网站 | 亚洲涩涩涩 | 亚洲第一av在线播放 | 亚洲婷婷网 | 亚洲人人av | 五月激情五月激情 | 在线视频一区二区 | 欧美大jb| 欧美精品久久久久久久久免 | 在线观看国产日韩 | 日韩高清免费无专码区 | 美女久久久久久久久久 | 精品久久久久久一区二区里番 | 九色激情网 | 久久手机在线视频 | 欧美精品一区二区免费 | 欧美日韩视频在线一区 | 国产午夜视频在线观看 | 国产精品区在线观看 | 成人久久毛片 | 久久久久综合精品福利啪啪 | 麻豆视频免费观看 | 亚洲蜜桃在线 | 日本韩国精品一区二区在线观看 | 日韩久久精品一区二区三区下载 | 97视频在线观看播放 | 日韩av在线免费播放 | 天天综合天天做天天综合 | 91av中文| 91成人免费在线 | 欧美少妇影院 | 久久8精品 | 亚洲精品玖玖玖av在线看 | 日韩av偷拍| 在线小视频你懂得 | 成年人免费电影在线观看 | 国产做爰视频 | 亚洲视频高清 | 久久久人人爽 | 国产精品婷婷午夜在线观看 | 91免费黄视频 | 亚洲一区二区三区精品在线观看 | jizz999| 国产精品成人久久 | 国产国语在线 | 国产视频精品在线 | 九九热免费在线观看 | 亚洲特级毛片 | 91香蕉久久 | 日韩欧美高清视频在线观看 | 手机看片中文字幕 | 九九热在线精品视频 | 国产真实精品久久二三区 | 中文免费在线观看 | 国产精品久久久久久久免费大片 | 国产亲近乱来精品 | 日韩精品资源 | 2024av| 国产日韩精品视频 | 亚洲视频中文 | 91视频麻豆 | 亚洲精品高清在线观看 | 亚洲一区视频在线播放 | 波多野结衣在线中文字幕 | 五月婷婷开心中文字幕 | 999久久国精品免费观看网站 | 超碰人人干人人 | 久久久久久久久久久久久9999 | 久99久视频 | 色欧美综合 | 中文字幕xxxx| 亚洲国产日韩一区 | 日本在线观看黄色 | 久久久国产精品一区二区三区 | 2019中文字幕第一页 | 色婷婷啪啪免费在线电影观看 | 国产第一福利 | 99这里只有精品99 | 国内精品久久久精品电影院 | 婷婷综合导航 | 69国产成人综合久久精品欧美 | av高清网站在线观看 | 人人爽人人片 | 91超碰免费在线 | 久久久黄色免费网站 | 国产日韩精品在线观看 | www久久com| 狠狠88综合久久久久综合网 | 欧美性受极品xxxx喷水 | 天天色中文 | 国产在线第三页 | 中文字幕在线观看一区二区三区 | 在线观看岛国 | 一级一片免费看 | 日韩特黄av| .国产精品成人自产拍在线观看6 | 欧美在线你懂的 | 黄色成人av网址 | 视频一区二区在线观看 | 国产美女免费观看 | 国产精品久久久久aaaa | 日韩理论在线观看 | 国产精品 中文在线 | 亚洲黄色高清 | 国产精品岛国久久久久久久久红粉 | 一区二区三区在线免费 | 久草爱| 韩国精品一区二区三区六区色诱 | 日韩啪啪小视频 | 成年人在线 | 国产女人40精品一区毛片视频 | 日韩高清免费无专码区 | 精品国产黄色片 | 成人免费在线观看电影 | 夜夜骑日日 | 久久久激情视频 | 黄色免费大全 | 91天堂在线观看 | 最新国产精品亚洲 | 美女网站在线观看 | 俺要去色综合狠狠 | 四虎成人精品永久免费av | 国产成人91 | 久草视频在线资源 | 精品福利视频在线 | 久久久国产精品网站 | 久久人人精| 91一区啪爱嗯打偷拍欧美 | 808电影| 国产精品婷婷 | 国产精品高清免费在线观看 | 人人爽人人搞 | 97色涩| 国产视频精品网 | 亚洲成人av一区二区 | 日韩免费视频网站 | 一区电影 | 亚洲欧美国产日韩在线观看 | 亚洲视屏在线播放 | 中文字幕在线不卡国产视频 | 在线观看午夜av | 在线色资源| 国产精品99久久久精品 | 色综合天天综合网国产成人网 | 国产一区二区播放 | 天天躁日日躁狠狠躁av麻豆 | 亚洲年轻女教师毛茸茸 | 欧洲精品久久久久毛片完整版 | 亚洲欧美日韩精品一区二区 | 欧美日产在线观看 | 亚洲乱码国产乱码精品天美传媒 | 欧美日韩精品免费观看视频 | av电影在线观看 | 99久久精品免费看国产 | 亚洲国产wwwccc36天堂 | 超碰成人免费电影 | 一二区精品 | 国产精品24小时在线观看 | 99精品视频在线 | 一本大道久久精品懂色aⅴ 五月婷社区 | 91亚洲精品国偷拍 | 午夜三级毛片 | 中文字幕最新精品 | 人人澡人人模 | 成人黄色电影免费观看 | 97人人网 | 成人av电影在线 | 日韩欧美高清一区二区三区 | 天天拍天天爽 | 美女网站色 | 国产青青青 | 97超碰成人在线 | 亚洲成av人片在线观看无 | 999久久久欧美日韩黑人 | 91热精品 | 国产在线国偷精品产拍 | 91九色精品国产 | 国产区网址 | 亚洲精品网站在线 | 亚洲激情在线 | 黄色网在线播放 | 天天操天天干天天爽 | 亚洲黄色一级视频 | 亚洲国产精品久久久久 | 99激情网 | 五月婷婷视频在线 | 天天干夜夜干 | 久久婷婷综合激情 | 国产在线一区二区 | 精品欧美一区二区精品久久 | 久久免费视频精品 | 精品美女国产在线 | 亚洲黄色在线免费观看 | 亚洲国产三级在线观看 | 一本到在线| 欧美一二三区播放 | 久久国产精品一二三区 | 激情欧美丁香 | 国产美女久久 | 国产精品一区二区果冻传媒 | 九九在线播放 | 国产理论影院 | 少妇bbw揉bbb欧美 | 国产糖心vlog在线观看 | 精品毛片久久久久久 | 婷婷电影在线观看 | 99精品视频精品精品视频 | 日韩天天干 | 久草在线观看 | 奇米7777狠狠狠琪琪视频 | 日日操网 | 国产打女人屁股调教97 | 欧美色图亚洲图片 | 国产午夜视频在线观看 | 在线观看精品黄av片免费 | 91精品国产一区二区在线观看 | 欧美另类高潮 | 一 级 黄 色 片免费看的 | 日韩免费电影网站 | 国产你懂的在线 | 岛国大片免费视频 | 国产精品久久久久久久电影 | 99精品视频99 | 成人精品一区二区三区电影免费 | 91看片麻豆 | 免费合欢视频成人app | 日韩中文字幕免费电影 | 色播激情五月 | 亚洲专区 国产精品 | 成人试看120秒 | 一区二区精品视频 | 99视频久久 | av免费在线播放 | 国产精品一区二区久久国产 | 91在线精品观看 | 免费观看一区二区 | japanese黑人亚洲人4k | 国产亚洲精品美女久久 | 国内免费的中文字幕 | 五月天亚洲综合小说网 | 国产精品白丝jk白祙 | 丰满少妇在线观看网站 | 日韩在线观看你懂得 | 激情五月播播久久久精品 | 西西人体4444www高清视频 | 91最新网址在线观看 | 五月天伊人网 | 天天草天天色 | 激情网站免费观看 | 99热这里精品 | 成人免费影院 | 黄色一级在线观看 | 日韩欧美在线综合网 | 国产精品久久久久9999 | 中文字幕在线观看免费高清电影 | 国产第一页在线播放 | 五月婷香 | 777xxx欧美| 久久黄页 | 日韩在线中文字幕 | 成年人视频免费在线播放 | 亚洲欧美日本一区二区三区 | 亚洲国产操 | 国产一级视屏 | 日韩欧美一区二区在线观看 | 四虎4hu永久免费 | 欧洲av在线 | 久草在线免 | 美女av免费| 日韩av电影中文字幕在线观看 | 午夜视频在线观看欧美 | 91在线观看欧美日韩 | av免费黄色 | 伊人五月婷| 香蕉视频最新网址 | 天天伊人狠狠 | 中文字幕的| 色狠狠操| 天天操欧美 | www.狠狠插.com | 久久成人欧美 | 少妇bbbb搡bbbb桶 | 国产成人精品久久二区二区 | 不卡视频一区二区三区 | av天天干| 在线国产能看的 | 91桃色免费观看 | 久久电影国产免费久久电影 | 婷婷色中文字幕 | 亚洲精品国偷自产在线91正片 | 日本黄色免费播放 | 国产精品九九九九九九 | 九色琪琪久久综合网天天 | 97综合网 | 日韩欧美在线视频一区二区 | 天天噜天天色 | 人人澡人人爽 | 久久久免费看片 | 国产成人精品免高潮在线观看 | 99久久日韩精品免费热麻豆美女 | 视频一区二区在线观看 | av一区在线 | 日日干激情五月 | 久久久久久电影 | 亚洲欧美在线综合 | 欧美日本中文字幕 | 国产精品久久在线观看 | 日韩中文字幕a | 国产一区二区视频在线 | 国产在线高清 | 中文字幕在线久一本久 | 亚洲国产资源 | 九色视频网站 | 国产色婷婷在线 | 久久免费视频精品 | 黄网站色欧美视频 | 欧美视频日韩视频 | 天天天干天天天操 | 91成人短视频在线观看 | 欧美色就是色 | 婷婷在线网 | 国产精品久久久久久久久久久久 | 日韩网站在线免费观看 | 日本韩国中文字幕 | 四虎影视精品永久在线观看 | 国产精品美女久久久 | 中文永久免费观看 | 日韩一区在线免费观看 | 日韩精品在线视频免费观看 | 亚洲最大免费成人网 | 天天操比| 96在线 | 日韩一三区 | 中文字幕日韩电影 | 97理论电影 | 午夜视频在线观看网站 | 六月丁香六月婷婷 | 久热爱 | 五月天中文在线 | 久草www| 人人射人人澡 | 黄色av电影 | 亚洲精品女 | 最新91在线视频 | 狠狠的干狠狠的操 | 久久福利小视频 | 免费视频a | 天天色天天操天天爽 | 国产精品久久人 | 中文字幕在线观看播放 | 国产精品久久久久久久妇 | 日韩精品中文字幕一区二区 | 色综合久久99 | 国产美女在线免费观看 | 高清av在线免费观看 | 日韩国产精品久久久久久亚洲 | 久久成人高清视频 | 国产成人香蕉 | 欧美日韩一区二区三区不卡 | 欧美色黄| 亚洲精品国产精品国自产观看浪潮 | 啪啪资源 | 一区二区视频免费在线观看 | 国产福利专区 | 国产99久久99热这里精品5 | 色.www | www.狠狠色.com | 色婷婷丁香| 麻豆国产精品永久免费视频 | 亚洲成人资源 | 狠狠久久伊人 | 狠狠色香婷婷久久亚洲精品 | 色视频在线免费 | 日本精品视频网站 | 欧美在线aa| 久久社区视频 | 欧美国产91| 国模精品一区二区三区 | 在线直播av | 日韩av一区二区在线影视 | 亚洲色图色 | 91av视频观看| 国产成人三级三级三级97 | 狠狠ri| 99激情网| 久久久久国产一区二区三区 | 国产一区二区三区免费视频 | 国产成本人视频在线观看 | 日韩大片在线免费观看 | 999久久久精品视频 日韩高清www | 免费观看的黄色片 | 色开心| 欧美性色19p | 免费三级大片 | 国内精品久久久久影院日本资源 | 国产精品久久精品 | 久久视频精品在线观看 | 国产精品igao视频网网址 | 精品久久久久久久久久久久久久久久久久 | 2022久久国产露脸精品国产 | 欧美精品一区二区三区一线天视频 | 欧美不卡在线 | 五月婷婷色 | 人人草网站 | 二区三区在线 | 精品亚洲免费视频 | 免费97视频 | 最新真实国产在线视频 | 91人人揉日日捏人人看 | 久热av| 国内免费的中文字幕 | 亚洲成av人影院 | 久久久久久久久久网 | 久久色视频| 伊人婷婷网 | 中文字幕中文字幕中文字幕 | 国产福利91精品一区二区三区 | 久草网视频在线观看 | 丁香九月婷婷综合 | 国产一区二区久久精品 | 久久丁香网 | 中文字幕视频三区 | 欧美极品少妇xbxb性爽爽视频 | 91av网站在线观看 | 免费亚洲视频在线观看 | 欧美一区二区日韩一区二区 | 国产玖玖精品视频 | 久久精品视频观看 | 中文字幕美女免费在线 | 久久久久免费精品国产 | 黄色三级在线看 | 婷婷免费在线视频 | 国产原创在线视频 | 欧美一级免费高清 | 黄色电影小说 | 日韩视频免费观看高清完整版在线 | 国产一区二区午夜 | 国产精品一区二区三区四区在线观看 | 天堂中文在线视频 | 精品国产区在线 | 亚洲精品一区二区精华 | 中文字幕欧美日韩va免费视频 | 国产99久久九九精品 | 丁香激情五月 | av片子在线观看 | 欧美黄色特级片 | 日日干狠狠操 | 国产午夜精品av一区二区 | 一级久久精品 | 黄色小视频在线观看免费 | 亚洲欧美日韩精品一区二区 | 免费观看一级特黄欧美大片 | 日本3级在线观看 | 色综合亚洲精品激情狠狠 | 亚洲最新av网站 | 狠狠色丁香婷婷综合久久片 | 香蕉视频在线网站 | 欧美成人区 | 91福利试看| 亚洲性少妇性猛交wwww乱大交 | 91人人射 | 欧美精品一区二区蜜臀亚洲 | 天天舔天天射天天操 | 色网站视频 | 久草久草久草久草 | 久久久久免费观看 | 久久另类小说 | 久久久久综合视频 | 99在线高清视频在线播放 | 日韩欧美一区二区在线播放 | 久久免费成人网 | www在线观看国产 | 国产精品日韩久久久久 | 国产亚洲精品美女久久 | 超碰国产在线观看 | 成人综合婷婷国产精品久久免费 | 在线国产精品视频 | 在线免费黄色片 | 精品久久久久国产 | 91最新在线 | 一级全黄毛片 | 国产青春久久久国产毛片 | 很污的网站 | 美女网站黄免费 | 免费国产在线观看 | 亚洲理论在线观看 | 在线电影日韩 | 午夜美女wwww| 久久免费一级片 | 五月天天天操 | 成年人免费在线 | 国产成人在线看 | 国产精品久久久久久久久免费 | 午夜精品福利影院 | 日韩免费视频 | 午夜av片| 国产成人精品一二三区 | 91自拍视频在线 | 啪啪肉肉污av国网站 | 亚洲精品ww| 国产青春久久久国产毛片 | 免费在线观看av网站 | 99热在线国产精品 | 99热在线这里只有精品 | 久草网站在线 | 特级毛片aaa | 国产精品一区二区在线 | 久久精品视频在线观看免费 | 国产精品热 | 国产综合在线观看视频 | 91丨九色丨国产在线 | av先锋影音少妇 | 久久电影网站中文字幕 | 精品国产伦一区二区三区观看说明 | 国产不卡高清 | 韩国精品福利一区二区三区 | www.狠狠| 亚洲欧美日韩精品久久奇米一区 | 欧美一级欧美一级 | 国产视频999| 97国产在线播放 | 十八岁以下禁止观看的1000个网站 | av片无限看| 国产精品9999 | 日韩伦理片一区二区三区 | 青青河边草免费直播 | 国产精品一区二区麻豆 | 国产永久免费高清在线观看视频 | 九九视频免费观看视频精品 | 日本精品小视频 | 免费影视大全推荐 | 一二区电影 | 日韩精品久久久久久中文字幕8 | 波多野结衣小视频 | 国产 一区二区三区 在线 | 91最新视频在线观看 | 四虎影视久久久 | 五月婷婷丁香激情 | 日韩天天操 | 五月开心色 | 91麻豆传媒 | 91精品久久久久久 | 黄色成人小视频 | 国产精品99久久久精品 | 国产精品毛片久久蜜 | 国内揄拍国产精品 | 婷婷综合激情 | a级国产乱理论片在线观看 伊人宗合网 | 日韩色一区二区三区 | 一区二区三区福利 | 亚洲欧美日本一区二区三区 | 91免费高清观看 | 亚洲综合丁香 | 天天爱天天色 | 久久九九视频 | 白丝av在线 | 日韩免费三级 | 最新婷婷色 | 久草影视在线 | 久久99久久99精品免观看软件 | 国产精品国产三级国产aⅴ入口 | 国产午夜一区 | 国产精品一区二区 91 | 国产精品va最新国产精品视频 | 日韩激情视频在线观看 | 麻豆视频大全 | 欧美人交a欧美精品 | 果冻av在线 | 人人讲下载 | 人人爽人人爽人人爽人人爽 | 99草在线视频 | 国产精品美女久久久久久久久 | 97av超碰| 亚洲激情综合网 | 久久久久久久久免费视频 | 午夜精品久久久久久久久久久久久久 | 日本精品久久久久 | 久久精品久久精品久久39 | 色网站在线 | 亚洲人人射 | 最新日韩视频在线观看 | 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 成人毛片在线视频 | 久久不色 | 99久久精品国产亚洲 | 一区二区三区四区在线免费观看 | 日韩最新在线视频 | 国产激情小视频在线观看 | 国产精品久久久久av | 中文字幕美女免费在线 | 国产精品嫩草影院99网站 | 午夜成人免费影院 | 亚洲国产黄色 | 国产精品久久久久久久久久久免费看 | 亚洲韩国一区二区三区 | 久久福利影视 | 亚洲欧美成人在线 | 亚洲精品久久久久久国 | 青春草视频在线播放 | 国产午夜在线观看 | 高清精品久久 | 亚洲一级理论片 | 国产精品久久久久久欧美 | 成人欧美一区二区三区在线观看 | 最近高清中文在线字幕在线观看 | 国产日本三级 | 国产精品扒开做爽爽的视频 | 国产精品麻豆果冻传媒在线播放 | 日韩城人在线 | 精品无人国产偷自产在线 | 亚洲午夜电影网 | 国产字幕在线播放 | 99riav1国产精品视频 | 成人午夜免费福利 | 黄色av免费看 | 国产精品一区二区在线观看 | 欧美视频xxx | 草久在线播放 | www黄色av| www.久久久久 | 丰满少妇在线观看资源站 | 不卡av电影在线 | 日韩精品欧美专区 | 亚洲欧美日韩在线一区二区 | 亚洲午夜精品一区二区三区电影院 | 91大神免费视频 | 五月婷婷视频在线 | 国产伦精品一区二区三区免费 | 国产高清精 | 丁香花在线视频观看免费 | 天天干,天天操 | 国产精品久久久久久欧美 | 国产精品高清在线 | 久久夜av| 欧美精品久久久久久久久久久 | 亚洲午夜av电影 | 五月综合网站 | 成人黄色在线 | 天天亚洲| 在线看v片| 91刺激视频 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 天堂在线v | 夜夜嗨av色一区二区不卡 | 粉嫩av一区二区三区四区五区 | 三级黄色大片在线观看 | 国产天天综合 | 国产精品久久久久久久婷婷 | 日本资源中文字幕在线 | 国产四虎在线 | 欧美在线视频免费 | 国产麻豆剧传媒免费观看 | 蜜桃视频成人在线观看 | 亚洲撸撸| 在线网站黄 | 国产精品大片 | 久久国产精品99国产精 | 国产美女在线免费观看 | 欧美福利视频 | 久草在线综合 | 久久精品艹 | www99精品 | 婷婷视频在线观看 | 国产高清视频在线播放一区 | 超碰在线观看av | 91av超碰| 国产精品97| 99国产一区二区三精品乱码 | 欧美视屏一区二区 | 色婷婷五 | 亚洲国产午夜视频 | 九九九九九九精品任你躁 | 久久se视频 | 在线成人一区二区 | 8x成人在线| 精品日韩视频 | 国产亚洲精品女人久久久久久 | 在线视频观看亚洲 | 亚洲理论电影 | 精品产品国产在线不卡 | 一区二区三区 亚洲 | 精品一区二区精品 | 五月婷婷综合久久 | 99热这里有 | 免费99精品国产自在在线 | 日韩色在线观看 | a黄色大片 | 国产精品久久人 | av中文字幕在线观看网站 | 少妇bbb搡bbbb搡bbbb′ | 婷婷精品国产一区二区三区日韩 | 99爱精品在线 | 91传媒在线看 | 免费国产黄线在线观看视频 | 日韩精品一区二区三区视频播放 | 99久久精品午夜一区二区小说 | 欧美最新大片在线看 | 日韩动漫免费观看高清完整版在线观看 | 国产一级在线播放 | 欧美色图亚洲图片 | 欧美一级片免费观看 | 天天插综合网 | 久久老司机精品视频 | 婷婷综合 | 国产精品久久二区 | 亚洲美女视频在线观看 | 国产资源中文字幕 | www.成人精品| 成人理论在线观看 | 91九色视频观看 | 天天爽夜夜爽人人爽曰av | 日韩电影中文字幕 | 黄p在线播放 | 国产一级a毛片视频爆浆 | 国产成人精品一区二区三区福利 | 日本 在线 视频 中文 有码 | 国产四虎在线 | 在线观看中文字幕网站 | 成人a视频在线观看 | 久久亚洲热 | 天天干天天拍天天操 | 国产在线高清视频 | 国内精品久久久久影院一蜜桃 | 久草综合在线观看 | 青青河边草观看完整版高清 | 久久这里只有精品视频首页 | 91影视成人 | 一区视频在线 | 国产专区精品 | 成人久久18免费网站图片 | 蜜臀久久99精品久久久无需会员 | 日b视频国产 | 精品国产伦一区二区三区观看体验 | 欧美另类色图 | 欧美淫aaa免费观看 日韩激情免费视频 | 99re中文字幕| 日韩精品久久久免费观看夜色 | 成人黄视频 | 欧美日韩国产在线精品 | 18性欧美xxxⅹ性满足 | 亚洲精品一区二区三区新线路 | 黄色大片中国 | 久久久久免费网站 | 国产在线欧美在线 | 亚洲激情 在线 | 亚洲一区二区91 | 伊人中文在线 | 日韩精品一区二区三区丰满 | 91麻豆精品久久久久久 | 永久免费毛片 | av电影免费 | 欧美a级一区二区 | 最近中文国产在线视频 | 伊人天天狠天天添日日拍 | 天天操天天综合网 | 亚洲第一伊人 | 日日操日日 | 成人欧美亚洲 | 伊人婷婷综合 | 夜夜操天天 | av在线超碰 | 欧美日韩精品网站 | www黄色软件 | 精品久久久久久久久久久院品网 | 在线免费视频a | 97国产一区二区 | 丁香综合 | 日韩中文字幕在线看 | 在线播放国产一区二区三区 | 国产亚洲欧美精品久久久久久 | 麻豆视频网址 | 操高跟美女 | 亚洲精品动漫在线 | 天堂网一区二区三区 | 日本中文字幕视频 | 91亚洲影院 | 天天干天天射天天插 | 国产精品久久久久999 | 手机成人在线 | 99久久久成人国产精品 | 在线观看免费av网站 | 五月天伊人网 | 天天躁天天操 | 国产精品高 | 国产一区二区三区在线免费观看 | www.久久免费视频 | 国产黄色片免费 | 亚洲九九精品 | 欧美综合国产 | 亚洲成人频道 | 久久久精品网 | 久久97久久 | 色综合 久久精品 | 免费a v观看 | 在线观看色网 | 五月婷婷丁香六月 | 久久一区二区三区国产精品 | 国产女人40精品一区毛片视频 | 美女国产精品 | 日韩亚洲在线观看 | 国产正在播放 | 国产一级在线看 | 久久综合导航 | 亚洲一区二区三区在线看 | 成人a v视频| 亚洲精品综合一区二区 | 中文字幕在线观看免费高清完整版 | 国产一区黄色 | 五月天中文字幕 | 国产精品一区二区av影院萌芽 | 久久精品电影网 | 综合色亚洲 | 毛片区| 日韩精品中文字幕在线播放 | 天天干人人 | 91污污 | 欧美日韩18 | 国产欧美日韩精品一区二区免费 | 欧美婷婷综合 | 天天色天天爱天天射综合 | 成人黄色片免费看 | 欧美激情亚洲综合 | 在线观看视频日韩 | 亚洲精品欧美专区 | 97日日 | 亚洲伊人网在线观看 | 国产在线播放一区二区 | 四虎永久精品在线 | 亚洲va欧洲va国产va不卡 | 精品久久久久免费极品大片 | www免费看片com | 国产综合91| 去看片 | 日韩免费在线一区 | 在线电影日韩 | 国产成人免费观看久久久 | 国产午夜三级一二三区 | 国产日韩欧美中文 | 美女视频免费一区二区 | 97在线观看免费高清完整版在线观看 | 中文字幕成人 | 中文字幕在线免费看线人 | av在线电影播放 | 日本三级人妇 | 夜夜躁天天躁很躁波 | 91资源在线 | 夜夜躁日日躁狠狠久久av | 成 人 黄 色 视频免费播放 |