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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

网络多线程编程-简单实现(模拟QQ的实现)

發(fā)布時(shí)間:2023/12/14 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 网络多线程编程-简单实现(模拟QQ的实现) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.涉及到的知識(shí)


1.項(xiàng)目框架的設(shè)計(jì)
2.java面向?qū)ο缶幊?br /> 3.網(wǎng)絡(luò)編程
4.多線程編程
5.IO流的操作
6.Mysql/先使用集合來(lái)充當(dāng)內(nèi)存數(shù)據(jù)庫(kù)
核心功能的實(shí)現(xiàn),界面的優(yōu)化還是自己把握
項(xiàng)目吃透的意義:
1.網(wǎng)絡(luò)編程
2.IO編程
3.面向?qū)ο蟮木幊?br /> 4.多線程的管理
是對(duì)于這些的綜合運(yùn)用
用戶分析:
界面帶上
1.用戶登錄
2.拉取在線用戶列表
3.無(wú)異常退出(客戶端,服務(wù)端) 因?yàn)槭峭ㄟ^(guò)網(wǎng)絡(luò)進(jìn)行控制的
4.私聊的實(shí)現(xiàn)
5.群聊的實(shí)現(xiàn) (公網(wǎng)的實(shí)現(xiàn))
6.發(fā)文件的實(shí)現(xiàn):關(guān)鍵是給誰(shuí)發(fā)送過(guò)去信息是關(guān)鍵
7.文件服務(wù)器推送新聞

1.客戶端和服務(wù)端共同的代碼

Message:是消息的種類的類型,里面包含著消息的種類,以及其各種特征
MessageType:消息的類型(消息頭),對(duì)于不同的消息頭,區(qū)別不同的消息,客戶端服務(wù)端進(jìn)行不同方式的處理
User的作用:一個(gè)User就是一個(gè)登錄用戶的各種信息的集合
FileClientService的作用:從指定路徑獲取發(fā)送文件的數(shù)據(jù),將其存儲(chǔ)在message當(dāng)中,然后發(fā)送給服務(wù)端
ManageCilentConnectServerThread 的作用:管理客戶端連接服務(wù)端線程的集合以及管理,以及相關(guān)的操作

Message代碼如下

package com.lk0826.qqcommon;//表示客戶端和服務(wù)端通信時(shí)候的消息對(duì)象 import java.io.Serializable;public class Message implements Serializable {private static final long serivalVersionUID = 1L;private String sender; // 發(fā)送者private String getter;// 接收者private String content;// 消息內(nèi)容private String sendTime;// 發(fā)送時(shí)間private String mesType;// 消息類型【可以在接口當(dāng)中定義已經(jīng)知道的消息類型】private byte[] fileBytes;private int filelen = 0;private String dest;// 文件傳輸?shù)奈穆?/span>private String src;// 文件的原始位置public byte[] getFileBytes() {return fileBytes;}public void setFileBytes(byte[] fileBytes) {this.fileBytes = fileBytes;}public int getFilelen() {return filelen;}public void setFilelen(int filelen) {this.filelen = filelen;}public String getDest() {return dest;}public void setDest(String dest) {this.dest = dest;}public String getSrc() {return src;}public void setSrc(String src) {this.src = src;}public String getMesType() {return mesType;}public void setMesType(String mesType) {this.mesType = mesType;}public String getSender() {return sender;}public void setSender(String sender) {this.sender = sender;}public String getGetter() {return getter;}public void setGetter(String getter) {this.getter = getter;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public String getSendTime() {return sendTime;}public void setSendTime(String sendTime) {this.sendTime = sendTime;}}

MessageType的代碼如下:

package com.lk0826.qqcommon; //定義了不同的常量,這些不同的常量的值代表不同的消息類型 //IO/線程/網(wǎng)絡(luò)的運(yùn)用 public interface MessageType {String MESSAGE_LOGIN_SUCCEED = "1";//代表登錄成功String MESSAGE_LONGIN_FAIL = "2";//代表登錄失敗String MESSAGE_COMM_MES = "3";//普通的信息包String MESSAGE_GET_ONLINE_FRIEND = "4";//要求返回在線的用戶列表String MESSAGE_RET_ONLINE_FRIEND = "5";//返回用戶在線列表String MESSAGE_CLIENT_EXIT = "6";//客戶端請(qǐng)求退出的命令String MESSAGE_TOALL_MES = "7";//群發(fā)的消息包String MESSAGE_FILE_MES = "8";//發(fā)送文件的消息頭 }

2.客戶端代碼

QQview的作用:QQ通信的界面設(shè)計(jì)
Utility的作用:作為工具類,從鍵盤讀取數(shù)據(jù)的操作和方法等等
ClientConnectServerThread的作用:作為客戶端和服務(wù)器進(jìn)行交流的線程
FileClientService的作用:客戶端發(fā)送文件的操作
UserClientService的作用:用戶向服務(wù)端請(qǐng)求的操作的方法
QQview的代碼如下:

package com.lk0826.qqview; import com.lk0826.MessageChat.MessageClientService; import com.lk0831.QQclientservice.FileClientService; import com.lk0831.QQclientservice.UserClientService;public class QQview {private boolean loop = true;//控制是否顯示菜單private String key = "";//控制鍵盤的輸入private UserClientService userClientService = new UserClientService();//用于登錄和注冊(cè)用戶的類的方法private MessageClientService messageclientservice = new MessageClientService();//對(duì)象用戶的私聊,群聊private FileClientService fileclientservice = new FileClientService();public static void main(String[] args) {new QQview().mainMenu();System.out.println("客戶端退出系統(tǒng)....");}private void mainMenu() {while(loop) {System.out.println("\n=========歡迎登錄網(wǎng)絡(luò)通信系統(tǒng)==========");System.out.println("\t\t 1 登錄系統(tǒng)");System.out.println("\t\t 9 退出登錄");System.out.print("請(qǐng)輸入你的選擇 :");key = Utility.readString(1);//根據(jù)用戶的輸入,來(lái)處理不同的邏輯switch(key) {case "1":System.out.println("請(qǐng)輸入用戶號(hào) :");String UserId = Utility.readString(50);//用戶號(hào)限制在五十個(gè)的范圍System.out.println("請(qǐng)輸入密 碼 :");String pwd = Utility.readString(50);//這里就比較麻煩了,需要構(gòu)建一個(gè)USer對(duì)象在服務(wù)端去看這個(gè)用戶是否合法//大量的代碼if(userClientService.checkUser(UserId,pwd)) {System.out.println("======歡迎(用戶"+UserId+"登錄成功)======");//進(jìn)入了二級(jí)菜單while(loop) {System.out.println("\n=========網(wǎng)絡(luò)通信系統(tǒng)二級(jí)菜單=========(用戶"+UserId+")");System.out.println("\t\t 1. 顯示在線用戶列表");System.out.println("\t\t 2.群發(fā)消息");System.out.println("\t\t 3.私聊消息");System.out.println("\t\t 4.發(fā)送文件");System.out.println("\t\t 9.退出系統(tǒng)");System.out.print("請(qǐng)輸入你的選擇 :");key = Utility.readString(1);switch (key) {case "1"://這里用一個(gè)方法來(lái)獲取在線用戶列表userClientService.onlineFriendList();break;case "2":System.out.println("群發(fā)消息");System.out.println("請(qǐng)輸入相對(duì)大家說(shuō)的話: ");String s = Utility.readString(100);//調(diào)用一個(gè)方法,將消息封裝成一個(gè)對(duì)象messageclientservice.sendMessageAll(s,UserId);break;case "3"://當(dāng)我私聊給一個(gè)用戶發(fā)送消息的時(shí)候System.out.print("請(qǐng)輸入想聊天的用戶名(在線):");String getterid = Utility.readString(50);System.out.print("請(qǐng)輸入想輸入的話 :");String content = Utility.readString(100);//編寫一個(gè)方法,將消息發(fā)送給服務(wù)器端口//局部變量在方法當(dāng)中可以使用messageclientservice.sendMessageToOne(content, UserId, getterid);System.out.println("私聊消息");break;case "4":System.out.print("請(qǐng)輸入你想把文件發(fā)送給的用戶");String getterId = Utility.readString(50);System.out.print("請(qǐng)輸入發(fā)送文件的路徑(形式 d:\\xx.jpg)");String src = Utility.readString(100);System.out.print("請(qǐng)輸入把文件發(fā)送到對(duì)方的路徑(形式 d:\\yy.jpg)");String dest = Utility.readString(100);fileclientservice.sendFiletoOne(src, dest, UserId, getterId);break;case "9":loop = false;System.out.print("退出登錄");//調(diào)用一個(gè)方法,給服務(wù)器發(fā)送關(guān)閉的messageuserClientService.logout();break;default:break;}}}else {//登錄服務(wù)器失敗了System.out.println("====登錄失敗====");}break;case "9":loop = false;System.out.println("退出登錄");break;}}}}

Utility的代碼如下:

package com.lk0826.qqview; /**工具類的作用:處理各種情況的用戶輸入,并且能夠按照程序員的需求,得到用戶的控制臺(tái)輸入。 */import java.util.*; /***/ public class Utility {//靜態(tài)屬性。。。private static Scanner scanner = new Scanner(System.in);/*** 功能:讀取鍵盤輸入的一個(gè)菜單選項(xiàng),值:1——5的范圍* @return 1——5*/public static char readMenuSelection() {char c;for (; ; ) {String str = readKeyBoard(1, false);//包含一個(gè)字符的字符串c = str.charAt(0);//將字符串轉(zhuǎn)換成字符char類型if (c != '1' && c != '2' && c != '3' && c != '4' && c != '5') {System.out.print("選擇錯(cuò)誤,請(qǐng)重新輸入:");} else break;}return c;}/*** 功能:讀取鍵盤輸入的一個(gè)字符* @return 一個(gè)字符*/public static char readChar() {String str = readKeyBoard(1, false);//就是一個(gè)字符return str.charAt(0);}/*** 功能:讀取鍵盤輸入的一個(gè)字符,如果直接按回車,則返回指定的默認(rèn)值;否則返回輸入的那個(gè)字符* @param defaultValue 指定的默認(rèn)值* @return 默認(rèn)值或輸入的字符*/public static char readChar(char defaultValue) {String str = readKeyBoard(1, true);//要么是空字符串,要么是一個(gè)字符return (str.length() == 0) ? defaultValue : str.charAt(0);}/*** 功能:讀取鍵盤輸入的整型,長(zhǎng)度小于2位* @return 整數(shù)*/public static int readInt() {int n;for (; ; ) {String str = readKeyBoard(10, false);//一個(gè)整數(shù),長(zhǎng)度<=10位try {n = Integer.parseInt(str);//將字符串轉(zhuǎn)換成整數(shù)break;} catch (NumberFormatException e) {System.out.print("數(shù)字輸入錯(cuò)誤,請(qǐng)重新輸入:");}}return n;}/*** 功能:讀取鍵盤輸入的 整數(shù)或默認(rèn)值,如果直接回車,則返回默認(rèn)值,否則返回輸入的整數(shù)* @param defaultValue 指定的默認(rèn)值* @return 整數(shù)或默認(rèn)值*/public static int readInt(int defaultValue) {int n;for (; ; ) {String str = readKeyBoard(10, true);if (str.equals("")) {return defaultValue;}//異常處理...try {n = Integer.parseInt(str);break;} catch (NumberFormatException e) {System.out.print("數(shù)字輸入錯(cuò)誤,請(qǐng)重新輸入:");}}return n;}/*** 功能:讀取鍵盤輸入的指定長(zhǎng)度的字符串* @param limit 限制的長(zhǎng)度* @return 指定長(zhǎng)度的字符串*/public static String readString(int limit) {return readKeyBoard(limit, false);}/*** 功能:讀取鍵盤輸入的指定長(zhǎng)度的字符串或默認(rèn)值,如果直接回車,返回默認(rèn)值,否則返回字符串* @param limit 限制的長(zhǎng)度* @param defaultValue 指定的默認(rèn)值* @return 指定長(zhǎng)度的字符串*/public static String readString(int limit, String defaultValue) {String str = readKeyBoard(limit, true);return str.equals("")? defaultValue : str;}/*** 功能:讀取鍵盤輸入的確認(rèn)選項(xiàng),Y或N* 將小的功能,封裝到一個(gè)方法中.* @return Y或N*/public static char readConfirmSelection() {System.out.println("請(qǐng)輸入你的選擇(Y/N): 請(qǐng)小心選擇");char c;for (; ; ) {//無(wú)限循環(huán)//在這里,將接受到字符,轉(zhuǎn)成了大寫字母//y => Y n=>NString str = readKeyBoard(1, false).toUpperCase();c = str.charAt(0);if (c == 'Y' || c == 'N') {break;} else {System.out.print("選擇錯(cuò)誤,請(qǐng)重新輸入:");}}return c;}/*** 功能: 讀取一個(gè)字符串* @param limit 讀取的長(zhǎng)度* @param blankReturn 如果為true ,表示 可以讀空字符串。 * 如果為false表示 不能讀空字符串。* * 如果輸入為空,或者輸入大于limit的長(zhǎng)度,就會(huì)提示重新輸入。* @return*/private static String readKeyBoard(int limit, boolean blankReturn) {//定義了字符串String line = "";//scanner.hasNextLine() 判斷有沒(méi)有下一行while (scanner.hasNextLine()) {line = scanner.nextLine();//讀取這一行//如果line.length=0, 即用戶沒(méi)有輸入任何內(nèi)容,直接回車if (line.length() == 0) {if (blankReturn) return line;//如果blankReturn=true,可以返回空串else continue; //如果blankReturn=false,不接受空串,必須輸入內(nèi)容}//如果用戶輸入的內(nèi)容大于了 limit,就提示重寫輸入 //如果用戶如的內(nèi)容 >0 <= limit ,我就接受if (line.length() < 1 || line.length() > limit) {System.out.print("輸入長(zhǎng)度(不能大于" + limit + ")錯(cuò)誤,請(qǐng)重新輸入:");continue;}break;}return line;} }

User的代碼如下:

package com.lk0826.qqcommon;import java.io.Serializable;//客戶的信息 //User對(duì)象要在網(wǎng)絡(luò)上面?zhèn)鬏?#xff0c;因此要用對(duì)象流,對(duì)象對(duì)應(yīng)的類需要序列化 public class User implements Serializable{private static final long serivalVersionUID = 1L;private String userid;//用戶名private String passwd;//用戶密碼public User() {}/*** @param userid* @param passwd*/public User(String userid, String passwd) {super();this.userid = userid;this.passwd = passwd;}public String getUserid() {return userid;}public void setUserid(String userid) {this.userid = userid;}public String getPasswd() {return passwd;}public void setPasswd(String passwd) {this.passwd = passwd;}}

ClientConnectServerThread代碼如下:

package com.lk0831.QQclientservice; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.net.Socket; import com.lk0826.qqcommon.Message; import com.lk0826.qqcommon.MessageType;public class ClientConnectServerThread extends Thread {// 該線程需要持有socketprivate Socket socket;// 這個(gè)構(gòu)造器在構(gòu)建的時(shí)候,可以構(gòu)建一個(gè)socket對(duì)象public ClientConnectServerThread(Socket socket) {this.socket = socket;}// 以后可能還需要獲取這個(gè)方法public Socket getSocket() {return socket;}// 這個(gè)包含socket的線程,需要在后臺(tái)和服務(wù)器通訊,因此需要一直存在,因此我們將其做成一個(gè)while循環(huán)public void run() {while (true) {// 讀取System.out.println("客戶端線程,等待讀取從服務(wù)器端口發(fā)送的消息");try {ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());// 如果服務(wù)器沒(méi)有發(fā)送Message對(duì)象,線程會(huì)阻塞在這里Message ms = (Message) ois.readObject();// 拿到消息以后就可以做其它的處理if (ms.getMesType().equals(MessageType.MESSAGE_RET_ONLINE_FRIEND)) {// 取出在線列表的信息,并且顯示String[] onlineUsers = ms.getContent().split(" ");System.out.println("\n=====當(dāng)前用戶列表如下===========");for (int i = 0; i < onlineUsers.length; i++) {System.out.println("用戶 :" + onlineUsers[i]);}} else if (ms.getMesType().equals(MessageType.MESSAGE_COMM_MES)) {System.out.println(ms.getSendTime());// 時(shí)間System.out.println("\n" + ms.getSender() + " 對(duì) " + ms.getGetter() + " 說(shuō) :" + ms.getContent());// 誰(shuí)對(duì)誰(shuí)說(shuō)怎樣的話語(yǔ)} else if (ms.getMesType().equals(MessageType.MESSAGE_TOALL_MES)) {// 顯示在客戶端的控制臺(tái)即可System.out.println("\n" + ms.getSender() + "對(duì)大家說(shuō):" + ms.getContent());} else if (ms.getMesType().equals(MessageType.MESSAGE_FILE_MES)) {System.out.println("\n"+ms.getSender()+"給"+ms.getGetter()+"發(fā)送文件從"+ms.getSrc()+"到我的電腦目錄"+ms.getDest());//取出message的文件字節(jié)數(shù)組,通過(guò)文件輸出流寫出到磁盤FileOutputStream fos = new FileOutputStream(ms.getDest());fos.write(ms.getFileBytes());//這種文件輸出流,發(fā)送了以后記得關(guān)閉即可fos.close();System.out.println("\n 保存文件成功---");} else {System.out.println("是其它類型的message,暫時(shí)不處理");}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}

FileClientService代碼如下:

package com.lk0831.QQclientservice;import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.ObjectOutputStream; import java.util.Date;import com.lk0826.qqcommon.Message; import com.lk0826.qqcommon.MessageType;//完成文件傳輸服務(wù) public class FileClientService {//原文件位置,目標(biāo)文件位置,發(fā)送用戶的id,接收用戶的idpublic void sendFiletoOne(String src,String dest,String senderId,String getterId) {//讀取src文件,將其封裝到Message message = new Message();message.setMesType(MessageType.MESSAGE_FILE_MES);message.setSender(senderId);message.setGetter(getterId);message.setSrc(src);message.setSendTime(new Date().toString());message.setDest(dest);//需要將文件進(jìn)行讀取FileInputStream fis = null ;File file = new File(src);if(file.exists()) {byte[] filebytes = new byte[(int)new File(src).length()];try {//檢查這個(gè)文件是否存在不存在就提示文件不存在//存在的話在進(jìn)行傳輸?shù)牟僮?/span>fis = new FileInputStream(src);fis.read(filebytes);//將文件讀入到字節(jié)數(shù)組當(dāng)中來(lái)//將文件字節(jié)數(shù)組,設(shè)置到我們的message對(duì)象當(dāng)中去message.setFileBytes(filebytes);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}finally {if(fis!=null) {try {fis.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}//提示信息System.out.println("\n"+senderId+"給"+getterId+"發(fā)送文件 :"+src+"到對(duì)方的電腦的目錄"+"dest");//發(fā)送try {ObjectOutputStream oos =new ObjectOutputStream(ManageCilentConnectServerThread.getClientConnectServerThread(senderId).getSocket().getOutputStream());oos.writeObject(message);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}else {System.out.println("文件不存在:"+src);}}}

ManageCilentConnectServerThread 的代碼如下:

package com.lk0831.QQclientservice; import java.util.HashMap; //管理客戶端連接到服務(wù)端的線程的一個(gè)類 public class ManageCilentConnectServerThread {private static HashMap<String,ClientConnectServerThread> hm = new HashMap<>();//將某個(gè)線程加入到這個(gè)集合當(dāng)中public static void addClientConnectServerThread(String userid,ClientConnectServerThread clientConnectServerThread) {hm.put(userid, clientConnectServerThread);}//通過(guò)一個(gè)方法 通過(guò)userid可以得到對(duì)應(yīng)的線程public static ClientConnectServerThread getClientConnectServerThread(String userid) {return hm.get(userid);} }

UserClientService 的代碼如下

package com.lk0831.QQclientservice;import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.InetAddress; import java.net.Socket; import java.util.ArrayList; import java.util.Iterator;import com.lk0826.qqcommon.Message; import com.lk0826.qqcommon.MessageType; import com.lk0826.qqcommon.User;//退出的時(shí)候有大量的異常報(bào)出,是因?yàn)楫?dāng)我的一個(gè)服務(wù)器或者客戶端關(guān)閉了以后,另外一端還在不斷的尋求讀取 //看是否登錄成功 public class UserClientService {//User作為一個(gè)屬性的原因,可能在其它地方使用User信息private User u = new User();private Socket socket;//方法作用:判斷登錄是否成功public boolean checkUser(String userid,String pwd) {boolean b = false;u.setUserid(userid);u.setPasswd(pwd);//連接到服務(wù)端,并且發(fā)送u對(duì)象//因?yàn)閟ocket在其它地方也可能使用,所以也要將其存為屬性try {socket = new Socket(InetAddress.getLocalHost(),9999);//得到objetcOutputStream的一個(gè)對(duì)象//socket只能得到節(jié)點(diǎn)流ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());oos.writeObject(u);//發(fā)送User對(duì)象//讀取服務(wù)端回復(fù)的Message對(duì)象ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());Message ms = (Message)ois.readObject();//如果有一個(gè)要拋出異常的話,那就將其拋出異常的范圍變得更大ArrayList<Message> al =(ArrayList<Message>)ois.readObject();ArrayList<Message> al2 =(ArrayList<Message>)ois.readObject();if(ms.getMesType().equals(MessageType.MESSAGE_LOGIN_SUCCEED)) {//成功登錄的話,啟動(dòng)一個(gè)線程,讓這個(gè)線程持有這個(gè)socket,能讓服務(wù)器端一直和其保持通訊//所以要?jiǎng)?chuàng)建一個(gè)線程類ClientConnectServerThread//在將線程放在集合里面去管理//創(chuàng)建和服務(wù)器保持通信的線程,如果不做成一個(gè)線程的話,主線程只能做一件事情,不能額外的做事情Iterator<Message> iterator = al.iterator();while(iterator.hasNext()) {Message message = iterator.next();System.out.println(message.getSender()+"對(duì)"+message.getGetter()+"說(shuō)"+message.getContent());}Iterator<Message> iterator2 = al2.iterator();while(iterator2.hasNext()) {Message message2 = iterator2.next();FileOutputStream fos = new FileOutputStream(message2.getDest());fos.write(message2.getFileBytes());//這種文件輸出流,發(fā)送了以后記得關(guān)閉即可fos.close();System.out.println("\n 離線保存文件成功---");}ClientConnectServerThread ccst = new ClientConnectServerThread(socket);ccst.start();//一個(gè)客戶端可能有幾個(gè)線程和服務(wù)端進(jìn)行通信,所以線程可以放入到一個(gè)集合當(dāng)中去管理ManageCilentConnectServerThread.addClientConnectServerThread(userid, ccst);b = true;}else {//登錄失敗了,我們就不能啟動(dòng)和服務(wù)器通訊的線程b = false;socket.close();oos.close();}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return b;}//向服務(wù)器端請(qǐng)求在線用戶列表public void onlineFriendList() {//發(fā)送一個(gè)MessageMessage message = new Message();message.setSender(u.getUserid());message.setMesType(MessageType.MESSAGE_GET_ONLINE_FRIEND);//發(fā)送給服務(wù)器,首先等到當(dāng)前線程的Socket 對(duì)應(yīng)的objectOutputStream//從管理線程的集合里面,得到userid對(duì)應(yīng)的線程,再?gòu)木€程里面得到對(duì)應(yīng)的socket,再?gòu)膕ocket里面得到對(duì)象輸出流Socket so = ManageCilentConnectServerThread.getClientConnectServerThread(u.getUserid()).getSocket();try {ObjectOutputStream oos = new ObjectOutputStream(so.getOutputStream());oos.writeObject(message);//發(fā)送一個(gè)message,向服務(wù)端要求在線用戶列表} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//編寫方法,退出客戶端,并給服務(wù)端發(fā)送一個(gè)退出系統(tǒng)的message對(duì)象public void logout() {Message message = new Message();message.setMesType(MessageType.MESSAGE_CLIENT_EXIT);message.setSender(u.getUserid());//一定指定userid,這樣才不是亂關(guān)閉的try {//ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());//如果一個(gè)客戶端有多個(gè)線程,最好通過(guò)id的形式獲取到我們需要的socket,來(lái)進(jìn)行數(shù)據(jù)操作ObjectOutputStream oos = new ObjectOutputStream(ManageCilentConnectServerThread.getClientConnectServerThread(u.getUserid()).getSocket().getOutputStream());oos.writeObject(message);System.out.println(u.getUserid()+"退出系統(tǒng)");System.exit(0);//結(jié)束進(jìn)程} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//}

3.服務(wù)端代碼

QQFrame的作用:內(nèi)含main主方法,可以啟動(dòng)服務(wù)端
QQServer的主要作用:啟動(dòng)服務(wù)端,等待客戶端的連接,其中還包含著離線消息和離線文件的存儲(chǔ),判斷用戶登錄時(shí)候的賬號(hào)密碼是否輸入成功
SendNewstoAll的主要作用:這個(gè)類包含著服務(wù)器將消息發(fā)送給所有人(新聞推送的功能)
ServerConnectClientThread的主要作用:當(dāng)客戶端和服務(wù)端建立起來(lái)連接以后,服務(wù)端因?yàn)榻邮者B接的socket,保存在線程當(dāng)中,而這個(gè)線程獨(dú)立的保持運(yùn)行,和客戶端一直保持著通信

package com.lk0826.qqframe; import com.lk0826.qqService.QQServer;//擴(kuò)展功能:獨(dú)立解決問(wèn)題的能力(有意識(shí)的去培養(yǎng)),獨(dú)立完成的功能 //離線留言的功能,如果某個(gè)用戶不在線,登錄以后可以接收離線的消息 //如果某個(gè)用戶不在線,登錄以后可以接收離線的文件 //服務(wù)器端 做一個(gè)集合 這個(gè)集合存放離線的message和發(fā)送者的id ConcurrentHashMap存放離線的message //key:getterid ArrayList<Message> //當(dāng)客戶端一個(gè)用戶登錄成功以后,去集合當(dāng)中看看有沒(méi)有g(shù)etterid對(duì)應(yīng)的,然后將ArrayList發(fā)送給 public class QQFrame {public static void main(String[] args) {QQServer qs = new QQServer();} }

QQServer的代碼如下:

package com.lk0826.qqService;import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.concurrent.ConcurrentHashMap;import com.lk0826.qqcommon.Message; import com.lk0826.qqcommon.MessageType; import com.lk0826.qqcommon.User; //無(wú)異常退出等等的優(yōu)化操作 //客戶端正在讀取的時(shí)候,突然把服務(wù)器關(guān)閉了,就會(huì)出現(xiàn)一系列的問(wèn)題 //這是服務(wù)器,在監(jiān)聽(tīng)9999,等待客戶端 的連接,并且保持通信 //******離線文件,離線消息的擴(kuò)展功能 public class QQServer {private ServerSocket ss = null;//創(chuàng)建一個(gè)集合,存放多個(gè)用戶,如果是這些用戶登錄,就認(rèn)為是合法的private static HashMap<String,User> validUsers = new HashMap<>();private static ConcurrentHashMap<String, ArrayList<Message>> offOnlineDb = new ConcurrentHashMap<>();//這個(gè)集合來(lái)收集離線的文件的集合private static ConcurrentHashMap<String, ArrayList<Message>> offOnlineFileDb = new ConcurrentHashMap<>();//處理并發(fā)的集合 ConcurrentHashMap 可以處理并發(fā)的集合,沒(méi)有線程安全問(wèn)題//HashMap是沒(méi)有處理線程安全的,因此在多線程的情況下是不安全的 ConcurrentHashMap是線程同步的,在多線程情況下是安全的static {//在靜態(tài)代碼塊,初始化validUsersvalidUsers.put("100", new User("100","123456"));ArrayList<Message> al1 = new ArrayList<>();offOnlineDb.put("100", al1);offOnlineFileDb.put("100", al1);validUsers.put("200", new User("100","123456"));ArrayList<Message> al2 = new ArrayList<>();offOnlineDb.put("200", al2);offOnlineFileDb.put("200", al2);validUsers.put("300", new User("100","123456"));ArrayList<Message> al3 = new ArrayList<>();offOnlineDb.put("300", al3);offOnlineFileDb.put("300", al3);validUsers.put("至尊寶", new User("至尊寶","123456"));ArrayList<Message> al4 = new ArrayList<>();offOnlineDb.put("至尊寶", al4);offOnlineFileDb.put("至尊寶", al4);validUsers.put("紫霞仙子", new User("紫霞仙子","123456"));ArrayList<Message> al5 = new ArrayList<>();offOnlineDb.put("紫霞仙子", al5);offOnlineFileDb.put("紫霞仙子", al5);validUsers.put("菩提老祖", new User("菩提老祖","123456"));ArrayList<Message> al6 = new ArrayList<>();offOnlineDb.put("菩提老祖", al6);offOnlineFileDb.put("菩提老祖", al6);}//驗(yàn)證用戶是否有效的方法//當(dāng)用戶登錄成功以后,先遍歷一遍自己的離線列表,看有沒(méi)有message,有message就打印出來(lái),然后再刪除這個(gè)key//public static void addoffFile(String getterId,ArrayList<Message> al) {offOnlineFileDb.put(getterId, al);}//給離線的消息庫(kù)添加消息public static void addOffpnlineDb(String getterId,ArrayList<Message> al) {offOnlineDb.put(getterId, al);}private boolean checkUser(String userid,String passwd) {User user = validUsers.get(userid);//if if 過(guò)關(guān)斬將的判斷方式if(user == null) {//說(shuō)明userId沒(méi)有存在validreturn false;}if(!user.getPasswd().equals(passwd)) {//userId正確,但是密碼錯(cuò)誤return false;}return true;}//服務(wù)器端要實(shí)現(xiàn)的功能的方法//當(dāng)?shù)卿洺晒σ院?#xff0c;遍歷offOnlienDbpublic void offOlinechat(String usreid) {Iterator<String> iterator = offOnlineDb.keySet().iterator();while(iterator.hasNext()) {String s = iterator.next();if(s.equals(usreid)) {ArrayList<Message> al = offOnlineDb.get(s);ServerConnectClientThread scct = ManageClientThreads.getClientThread(s);try {ObjectOutputStream oos = new ObjectOutputStream(scct.getSocket().getOutputStream());oos.writeObject(al);//將離線的消息列表發(fā)送給對(duì)應(yīng)的客戶端} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}public QQServer() {//服務(wù)器給各個(gè)客戶端推送消息//服務(wù)器端專門啟動(dòng)一個(gè)線程,專門負(fù)責(zé)推送新聞try {System.out.println("服務(wù)端在9999端口監(jiān)聽(tīng)。。。");ss = new ServerSocket(9999);new Thread(new SendNewstoAll()).start();//并不是監(jiān)聽(tīng)到一個(gè)監(jiān)聽(tīng)的工作就不監(jiān)聽(tīng)了//監(jiān)聽(tīng)9999的這個(gè)工作,這是一個(gè)while循環(huán)while(true) {//當(dāng)和某個(gè)客戶端建立連接以后會(huì)繼續(xù)一直的監(jiān)聽(tīng)的,因此我們這里while循環(huán)Socket socket = ss.accept();//沒(méi)有客戶端連接的話,就會(huì)阻塞在這里//得到這個(gè)socket關(guān)聯(lián)的對(duì)象輸入流ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());User u = (User)ois.readObject();//向下轉(zhuǎn)型需要強(qiáng)制轉(zhuǎn)型,理論上面后臺(tái)是有一個(gè)數(shù)據(jù)庫(kù)來(lái)驗(yàn)證用戶名字和id是否正確的才對(duì)//驗(yàn)證用戶Message message = new Message();//設(shè)置在外面的原因是因?yàn)?#xff0c;無(wú)論登錄成功還是登錄失敗我們都需要回復(fù)一個(gè)消息才行if(checkUser(u.getUserid(), u.getPasswd())) {//創(chuàng)建一個(gè)Message對(duì)象,準(zhǔn)備回復(fù)客戶端message.setMesType(MessageType.MESSAGE_LOGIN_SUCCEED);//將message對(duì)象發(fā)送回復(fù)oos.writeObject(message);//登錄成功以后,取出離線的數(shù)據(jù)包ArrayList<Message> al = offOnlineDb.get(u.getUserid());oos.writeObject(al);offOnlineDb.remove(u.getUserid());ArrayList<Message> al2 = offOnlineFileDb.get(u.getUserid());oos.writeObject(al2);offOnlineFileDb.remove(u.getUserid());//創(chuàng)建一個(gè)線程,和客戶端保持通訊的狀態(tài),該線程需要持有這個(gè)socket對(duì)象,并且要將線程放在管理線程的集合當(dāng)中去ServerConnectClientThread scct =new ServerConnectClientThread(socket, u.getUserid());//啟動(dòng)線程,線程不會(huì)影響到主線程的工作scct.start();//把對(duì)象放到集合當(dāng)中進(jìn)行管理//這個(gè)ManageClientThreads可以看成一個(gè)倉(cāng)庫(kù)ManageClientThreads.addClientThread(u.getUserid(), scct);}else {//登錄失敗System.out.println("用戶 id = "+u.getUserid()+"pwd = "+u.getPasswd()+"驗(yàn)證失敗");message.setMesType(MessageType.MESSAGE_LONGIN_FAIL);oos.writeObject(message);//關(guān)閉socketsocket.close();}}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{//如果服務(wù)器端退出了while,服務(wù)端不在監(jiān)聽(tīng),因此關(guān)閉ServerSockettry {ss.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}} }

SendNewstoAll的代碼如下:

package com.lk0826.qqService;import java.io.IOException; import java.io.ObjectOutputStream; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.Scanner;import com.lk0826.Utils.Utility; import com.lk0826.qqcommon.Message; import com.lk0826.qqcommon.MessageType;public class SendNewstoAll implements Runnable{private Scanner scanner = new Scanner(System.in);public void run() {//為了可以推送多次新聞,我使用while循環(huán)while(true) {System.out.println("請(qǐng)輸入服務(wù)器要推送的消息/新聞【輸入exit表示退出推送服務(wù)】");String news = Utility.readString(1000);if("exit".equals(news)) {break;}Message message = new Message();message.setSender("服務(wù)器");message.setContent(news);message.setMesType(MessageType.MESSAGE_TOALL_MES);message.setSendTime(new Date().toString());System.out.println("服務(wù)器推送消息給所有人說(shuō) "+news);//下一步,遍歷當(dāng)前所有的通訊線程,并得到其socket,然后發(fā)送即可HashMap<String,ServerConnectClientThread> hm = ManageClientThreads.getHashMap();Iterator iterator = hm.keySet().iterator();while(iterator.hasNext()) {String s = iterator.next().toString();ServerConnectClientThread scct = hm.get(s);try {ObjectOutputStream oos =new ObjectOutputStream(scct.getSocket().getOutputStream());oos.writeObject(message);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}} }

ServerConnectClientThread的代碼如下:

package com.lk0826.qqService; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.Socket; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator;import com.lk0826.qqcommon.Message; import com.lk0826.qqcommon.MessageType; //該類對(duì)應(yīng)的一個(gè)對(duì)象,和某個(gè)客戶端保持通訊 //它必須有一個(gè)socket屬性 public class ServerConnectClientThread extends Thread{private Socket socket;private String userid;//為了區(qū)分socket和哪一個(gè)用戶之間進(jìn)行的連接/*** @param socket* @param userid*/public ServerConnectClientThread(Socket socket, String userid) {super();this.socket = socket;this.userid = userid;}public Socket getSocket() {return socket;}//線程處于一個(gè)運(yùn)行的狀態(tài)//可以發(fā)送或者是接收消息public void run() {while(true) {try {System.out.println("服務(wù)端和客戶端"+userid+"保持通信,讀取信息");ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());Message message = (Message)ois.readObject();//Message是一種通訊的協(xié)議,是一種通訊的規(guī)則//根據(jù)message類型做出相應(yīng)的業(yè)務(wù)的處理,先處理拉取在線if(message.getMesType().equals(MessageType.MESSAGE_GET_ONLINE_FRIEND)) {System.out.println(message.getSender()+" 要在線用戶列表");String onlineUser = ManageClientThreads.getOnlineUser();//構(gòu)建一個(gè)Message對(duì)象,返回給客戶端Message message2 = new Message();message2.setMesType(MessageType.MESSAGE_RET_ONLINE_FRIEND);message2.setContent(onlineUser);//將用戶在線列表打過(guò)去message2.setGetter(message.getSender());ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());//線程里面本身就持有這個(gè)socket//返回給客戶端oos.writeObject(message2);}else if(message.getMesType().equals(MessageType.MESSAGE_CLIENT_EXIT)) {//客戶端退出的消息System.out.println(message.getSender() + "退出");//將和客戶端保持通信的線程從服務(wù)器集合當(dāng)中移除//ManageClientThreadsManageClientThreads.removeThread(message.getSender());socket.close();//關(guān)閉數(shù)據(jù)通道//退出線程break;}else if(message.getMesType().equals(MessageType.MESSAGE_COMM_MES)) {//根據(jù)message獲取 getterid ,在獲取對(duì)應(yīng)的線程//當(dāng)獲取消息的時(shí)候,發(fā)現(xiàn)服務(wù)器的管理線程里面沒(méi)有這個(gè)線程那樣的話,就采用離線處理的方式ServerConnectClientThread scct = ManageClientThreads.getClientThread(message.getGetter());if(scct==null) {//如果線程是空的代表還沒(méi)有登錄才去離線的處理方式ArrayList<Message> al = new ArrayList<>();al.add(message);QQServer.addOffpnlineDb(message.getGetter(),al);}else {ObjectOutputStream oos2 = new ObjectOutputStream(scct.getSocket().getOutputStream());oos2.writeObject(message);}//轉(zhuǎn)發(fā),提示如果客戶不在線,可以保存到數(shù)據(jù)庫(kù)當(dāng)中,這樣可以實(shí)現(xiàn)離線留言}else if(message.getMesType().equals(MessageType.MESSAGE_TOALL_MES)) {//需要編列管理線程的集合,把所有線程的socket得到,然后將message轉(zhuǎn)發(fā)即可HashMap<String,ServerConnectClientThread> hm = ManageClientThreads.getHashMap();Iterator<String> iterator = hm.keySet().iterator();//這個(gè)語(yǔ)句是什么意思while(iterator.hasNext()) {//集合的操作而已//取出在線用戶的idString s = iterator.next().toString();if(!s.equals(message.getSender())){ObjectOutputStream oos3 =new ObjectOutputStream( hm.get(s).getSocket().getOutputStream());oos3.writeObject(message);}}}else if(message.getMesType().equals(MessageType.MESSAGE_FILE_MES)) {//根據(jù)getterid獲取到對(duì)應(yīng)的線程,然后將message轉(zhuǎn)發(fā)//當(dāng)發(fā)送的文件的目標(biāo)對(duì)象的離線的時(shí)候ServerConnectClientThread scct2 = ManageClientThreads.getClientThread(message.getGetter());if(scct2==null) {//如果還未登錄ArrayList<Message> al2 = new ArrayList<>();al2.add(message);QQServer.addoffFile(message.getGetter(), al2);}else {ObjectOutputStream oos2 = new ObjectOutputStream(scct2.getSocket().getOutputStream());oos2.writeObject(message);}}else {System.out.println("其它類型的message暫時(shí)不處理");}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}

整體思路的設(shè)計(jì)和框架的搭建

1.首先我們?cè)O(shè)計(jì)服務(wù)端和客戶端都要有的共同的代碼,因?yàn)橛脩艉拖?#xff0c;消息類型種類,都是要進(jìn)入數(shù)據(jù)通道,也就是客戶端和服務(wù)端這兩種數(shù)據(jù)必須相同,所以兩端這幾種消息類型必須相同并且在同一個(gè)包當(dāng)中
2.對(duì)于要用對(duì)象流的操作,我們必須進(jìn)行序列化和反序列化的操作才行
3.注意在寫一個(gè)程序的時(shí)候首先是要將其主要功能跑通,然后每個(gè)類各司其職,最好每個(gè)線程都由一個(gè)線程的管理類的管理,先畫出大致的思路的圖形,這樣慢慢來(lái)結(jié)構(gòu)清晰

4.不熟悉代碼知識(shí)點(diǎn)的總結(jié)

  • Message ms = (Message)ois.readObject(); 因?yàn)閷?duì)象輸出流,當(dāng)我們讀入的時(shí)候得到的是對(duì)象,需要用強(qiáng)制轉(zhuǎn)型將其轉(zhuǎn)換為Message
  • ArrayList<Message> al =(ArrayList<Message>)ois.readObject();ArrayList<Message> al2 =(ArrayList<Message>)ois.readObject();if(ms.getMesType().equals(MessageType.MESSAGE_LOGIN_SUCCEED)) {//成功登錄的話,啟動(dòng)一個(gè)線程,讓這個(gè)線程持有這個(gè)socket,能讓服務(wù)器端一直和其保持通訊//所以要?jiǎng)?chuàng)建一個(gè)線程類ClientConnectServerThread//在將線程放在集合里面去管理//創(chuàng)建和服務(wù)器保持通信的線程,如果不做成一個(gè)線程的話,主線程只能做一件事情,不能額外的做事情Iterator<Message> iterator = al.iterator();while(iterator.hasNext()) {Message message = iterator.next();System.out.println(message.getSender()+"對(duì)"+message.getGetter()+"說(shuō)"+message.getContent());

數(shù)組可以轉(zhuǎn)換成為同樣的迭代器
iterator.hasNext()判斷迭代器的下一個(gè)是否還有數(shù)據(jù),當(dāng)我們到達(dá)迭代器末尾的時(shí)候,返回false
iterator取的是下一位迭代器當(dāng)中的數(shù)據(jù),剛開(kāi)始的時(shí)候指針指在迭代器的前面
舉例來(lái)說(shuō):開(kāi)始是頭部之前是空,下一個(gè)有數(shù)據(jù),所以取到下一個(gè)message,然后繼續(xù)循環(huán),判斷第一個(gè)數(shù)據(jù)后面有沒(méi)有,然后再next,取出數(shù)據(jù),將指針移動(dòng)到下一位的位置

public static String getOnlineUser() {//集合的遍歷,遍歷HashMap的keyIterator<String> iterator = hm.keySet().iterator();String olineUserList = "";while(iterator.hasNext()) {olineUserList += iterator.next().toString()+" ";}return olineUserList; }

hm.keyset()將哈希表的key變成一個(gè)集合,最后在將這個(gè)集合變?yōu)橐粋€(gè)迭代器,迭代器的內(nèi)容的類型
根據(jù)哈希表key值的類型決定,將在線的用戶取出用間隔隔開(kāi)轉(zhuǎn)換為String的類型,將其賦值在message的content當(dāng)中,然后將message發(fā)送過(guò)去

總結(jié)

以上是生活随笔為你收集整理的网络多线程编程-简单实现(模拟QQ的实现)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

www91在线观看| 免费看国产a| 国产手机在线播放 | 玖玖视频精品 | 中文字幕免费不卡视频 | 国产91欧美 | 亚洲免费av网站 | 国产女教师精品久久av | 久久综合久久久久88 | 欧美日韩中文字幕视频 | 色噜噜日韩精品欧美一区二区 | 国产精品1区2区 | 国产在线高清视频 | 国产成人精品一区二区三区在线 | 91在线观| 精品免费视频. | 国产午夜三级一区二区三 | 成人一级片视频 | 中文字幕第一页在线视频 | 99精彩视频在线观看免费 | 日韩在线视频免费播放 | 精品毛片在线 | 亚洲第一中文网 | av夜夜操 | 国产亚州精品视频 | 久久综合视频网 | 久久久久久久久久免费视频 | 黄av免费在线观看 | 香蕉视频日本 | 成人午夜免费剧场 | 黄色成品视频 | 蜜臀久久99精品久久久无需会员 | 热久精品 | 黄色大全在线观看 | 亚洲精品一区二区三区新线路 | 国产午夜精品福利视频 | 国产精品18久久久久久久 | av超碰在线观看 | 日韩高清三区 | 1区2区3区在线观看 三级动图 | 高清精品久久 | 久久69av| 午夜影院一级片 | 在线国产日本 | 手机av永久免费 | 黄色一级大片免费看 | 开心激情五月网 | 又污又黄网站 | 色狠狠久久av五月综合 | 久久久久免费精品 | 少妇精品久久久一区二区免费 | 黄色成品视频 | 日韩欧美在线视频一区二区 | 超碰免费在线公开 | 久久黄色a级片 | 黄色aa久久| 九九免费观看视频 | 久草网在线 | 亚洲91精品在线观看 | 国产精品 999 | 午夜精品麻豆 | 人人澡超碰碰97碰碰碰软件 | 欧美色图亚洲图片 | 久久国产免 | 日本丶国产丶欧美色综合 | 天天激情综合网 | 欧美日韩在线视频一区二区 | 日韩欧美成人网 | 久久成人国产精品一区二区 | 中文字幕精品在线 | 久久99国产精品视频 | 成人动态视频 | 国产精品 9999| 国产精品久久久区三区天天噜 | 亚洲在线视频免费 | 五月天com| 9999毛片| 综合黄色网 | 亚洲精品国产成人av在线 | 国产做aⅴ在线视频播放 | 国产在线视频资源 | 亚洲精品日韩av | 日本久久久久久久久久久 | 国产精品久久99综合免费观看尤物 | 97色在线观看免费视频 | 日韩成人在线一区二区 | 99re国产 | 九色琪琪久久综合网天天 | 99精品国产兔费观看久久99 | 日韩成人在线免费观看 | 成人久久久久 | 欧美老女人xx | 嫩草91影院 | 久久久久久国产精品999 | 天堂av在线网站 | 亚州国产视频 | 色综合激情网 | 又黄又刺激 | 黄色a视频免费 | 麻豆小视频在线观看 | 99久久久成人国产精品 | 99se视频在线观看 | 天天躁天天狠天天透 | 丁香五月亚洲综合在线 | 三级黄色在线观看 | 久久久九色精品国产一区二区三区 | 日韩在线视 | 国产视频精品网 | 五月婷婷开心中文字幕 | 久精品一区 | 欧美精品一区二区在线播放 | av电影免费在线看 | a级国产毛片 | 一区二区久久 | 久草在线资源观看 | 国产综合久久 | 午夜av网站 | 中文字幕成人一区 | 成年美女黄网站色大片免费看 | 808电影| 天天综合视频在线观看 | 色综合色综合久久综合频道88 | 亚洲国产精品成人女人久久 | 免费日韩精品 | 欧美精品亚洲二区 | 免费日韩一区 | 韩国av不卡 | 中文字幕视频 | 国产一区二区三区在线 | 亚洲精品合集 | 免费日韩在线 | 精品久久久久久久久久久久久久久久久久 | 亚洲一级片在线观看 | 国产一区欧美在线 | 免费h在线观看 | 在线午夜电影神马影院 | 久久毛片网站 | 波多野结衣一区 | 日韩精品最新在线观看 | 日韩欧美国产激情在线播放 | av 一区二区三区 | 亚洲精品国产精品久久99 | 亚洲精品欧洲精品 | 夜色.com| 免费高清在线观看成人 | 久草视频在线播放 | 日韩av一区二区三区在线观看 | 成人久久亚洲 | 国产精品网址在线观看 | 天天射天天操天天 | 国产精品久久久久久久久免费 | 午夜久久影视 | 丁香在线观看完整电影视频 | 国产伦精品一区二区三区… | 天天综合中文 | avwww在线 | 在线观看久久久久久 | 久久亚洲福利 | 亚洲伊人色 | 国产黄色片免费看 | 少妇性bbb搡bbb爽爽爽欧美 | 97色婷婷成人综合在线观看 | 国产日韩精品一区二区 | 麻豆超碰| 天天干天天摸 | 福利区在线观看 | 午夜精品一区二区三区免费视频 | 成人福利在线 | 久久久久久麻豆 | 免费av观看 | 久久久久久久久久久久国产精品 | 精壮的侍卫呻吟h | 久久国产精品视频免费看 | 亚洲日日日 | 亚洲国产精品久久久久婷婷884 | 成人精品福利 | 亚洲www天堂com| 国产精品理论片在线观看 | 一区二区成人国产精品 | 久久精品爱爱视频 | 亚洲黄色在线播放 | 婷婷精品视频 | 成人黄色大片在线免费观看 | 久久精品99国产精品日本 | 国产精品国产三级国产aⅴ9色 | 在线观看免费福利 | 99这里只有精品视频 | 久久精品国产亚洲a | 91av观看 | av中文资源在线 | 亚洲综合网| 国产视频一区二区在线观看 | 色a网 | 亚洲人成在线观看 | 国产精品a久久久久 | 日韩网| 一区二区中文字幕在线 | 亚洲精品免费在线视频 | 99精品毛片| 欧美午夜理伦三级在线观看 | 三日本三级少妇三级99 | av资源在线观看 | 91探花在线 | 久久亚洲福利 | 99精品视频在线观看免费 | 岛国av在线免费 | а天堂中文最新一区二区三区 | 国产精品婷婷午夜在线观看 | 国内精品国产三级国产aⅴ久 | 国产原创在线观看 | 天堂av免费在线 | 人人射人人插 | 亚洲激情小视频 | 91福利视频免费观看 | 久久久免费观看视频 | 色欧美视频 | 亚洲精品美女久久久久 | 国产成人精品电影久久久 | 96精品在线 | 日韩在线色视频 | 日本精品视频免费观看 | 久久久亚洲精品 | 国产高清视频在线播放一区 | 久久永久免费视频 | 亚洲成人资源网 | av久久在线| 国产精品一区在线 | 六月丁香久久 | 2019中文字幕网站 | 国产精品www | 美女网站黄在线观看 | 日本久久精品 | 免费三级在线 | 国产高清在线免费 | 免费观看日韩av | 国产在线精品一区 | 91香蕉视频污在线 | 久久精品国产免费看久久精品 | 国产99久久九九精品免费 | 91精品老司机久久一区啪 | 91色一区二区三区 | 久久99热国产 | 麻豆免费看片 | 日日干视频 | 91一区在线观看 | 久久亚洲免费 | 中文字幕日韩一区二区三区不卡 | 99精品视频网| 91色国产| www.久久爱.cn | 天天干.com | 免费黄av| 色婷婷www| 狠狠插狠狠干 | 黄色app网站在线观看 | 日韩 在线 | 久久久久免费网 | 亚州天堂 | 黄色av电影网 | 精品国产99国产精品 | 日日干夜夜操视频 | 激情综合网五月激情 | 天天爱天天色 | 天天干天天综合 | japanesefreesexvideo高潮| 亚洲日本va午夜在线电影 | 中文字幕成人一区 | 在线观看免费版高清版 | 人人擦| 欧美日韩调教 | 人人爽人人爽人人爽学生一级 | 中文字幕在线人 | 国产青春久久久国产毛片 | 精品一区欧美 | 麻豆小视频在线观看 | 久久精品牌麻豆国产大山 | 久久午夜免费观看 | 天天干天天草天天爽 | 久久福利小视频 | 91资源在线观看 | 91成熟丰满女人少妇 | 国产高清一区二区 | 久久综合久久综合这里只有精品 | 久久艹艹 | 黄色片免费在线 | 中文字幕在线一区二区三区 | 99热精品在线观看 | 中文字幕一区二区三区乱码在线 | 日本中文字幕久久 | 一区二区三区免费在线观看视频 | 色综久久| 一区二区三区精品在线视频 | 在线激情av电影 | 日韩有码中文字幕在线 | 天天插日日插 | 特级毛片在线免费观看 | 欧美一区二区免费在线观看 | 日日夜精品 | 欧美亚洲另类在线视频 | 精品成人a区在线观看 | 久草在线视频免费资源观看 | 精品夜夜嗨av一区二区三区 | 99国产在线视频 | av成人动漫在线观看 | 激情综合网五月激情 | 麻豆免费看片 | 一区二区三区高清不卡 | 国产日韩视频在线观看 | 五月天婷婷在线播放 | 狠狠激情中文字幕 | 96久久 | a级国产乱理伦片在线播放 久久久久国产精品一区 | 精品国产乱码久久久久久三级人 | 亚洲自拍av在线 | 欧美小视频在线 | 精品国产成人av | 亚洲免费av一区二区 | 中文字幕在线一区二区三区 | 黄色av一级片 | 91色国产| 天天操天天操天天操天天操 | 国产一二三在线视频 | 亚洲欧美乱综合图片区小说区 | 国产明星视频三级a三级点| 日本精品视频在线 | 成人a在线观看 | 亚洲精品国精品久久99热一 | 亚洲综合在线五月天 | 99在线观看免费视频精品观看 | 久久99热久久99精品 | 国产精品国产毛片 | 国产在线播放一区二区 | 天天干夜夜操视频 | 久久九九影视网 | 在线免费黄色av | 国产最新精品视频 | 久草网在线视频 | 欧美另类性| 天天操福利视频 | 99精品在线播放 | 亚洲激精日韩激精欧美精品 | 久草a在线 | 国产专区免费 | 麻豆国产露脸在线观看 | free,性欧美 九九交易行官网 | 国产精品激情在线观看 | 国产一区视频免费在线观看 | 国产精品成人av电影 | 精品国产伦一区二区三区观看体验 | 亚洲乱码国产乱码精品天美传媒 | 99色在线观看视频 | 成人影片在线免费观看 | 亚洲一级二级三级 | 麻豆影视在线播放 | 夜夜视频 | 波多野结衣在线视频免费观看 | 精品国产一区二区三区久久久蜜臀 | 亚洲黄色免费观看 | 国产日产精品久久久久快鸭 | 亚洲黄色区 | 天天碰天天操视频 | 国产美女久久 | 国模精品在线 | 精品亚洲免费视频 | 久久综合色一综合色88 | 久99久在线 | 日本深夜福利视频 | 粉嫩一区二区三区粉嫩91 | 精品福利片 | 精品美女在线观看 | 久草久热 | 亚洲日本韩国一区二区 | 久久你懂得 | 人人爽久久久噜噜噜电影 | 99精品国产一区二区三区麻豆 | 成人久久久精品国产乱码一区二区 | 看黄色91| 99热这里只有精品8 久久综合毛片 | 91亚洲精品国偷拍 | 一级国产视频 | 国产成人精品aaa | 久久综合成人 | 国产精品永久免费 | 日韩一级黄色av | 亚洲精选在线 | 日本久久免费电影 | 久久久国产精品人人片99精片欧美一 | 日本一区二区免费在线观看 | 色偷偷88888欧美精品久久久 | 色综合小说 | 亚洲精品麻豆 | 一区二区毛片 | 久久久久久久久免费 | 久久97久久97精品免视看 | 91系列在线 | 91福利社在线观看 | 一本—道久久a久久精品蜜桃 | 日韩影视大全 | 日韩av中文| 香蕉久久国产 | 久久婷五月 | 视频在线观看一区 | 日韩欧美成人网 | www.福利视频 | 国产在线污 | 免费亚洲视频在线观看 | 最近更新好看的中文字幕 | 久久久久久免费视频 | www..com毛片 | 91在线视频在线观看 | 9999亚洲| 日韩在线视频免费播放 | 欧美成年黄网站色视频 | 国产 日韩 中文字幕 | 国产精品第72页 | www国产亚洲精品久久网站 | 国产91精品在线观看 | 日韩在线观看视频网站 | 日韩中文字幕第一页 | 在线视频免费观看 | 久久久国产精品视频 | 日本免费久久高清视频 | 中文字幕在线观看视频免费 | 国产伦精品一区二区三区… | 国产一区二区观看 | 91九色视频在线 | 日韩av免费一区 | 在线91网| 日韩欧美精品一区 | 天天做天天爱天天爽综合网 | 成人影视片 | 日日夜夜操操操操 | 欧美日韩一区二区三区在线观看视频 | 日本精品免费看 | 精品亚洲免a | 色先锋av资源中文字幕 | 人人爽久久涩噜噜噜网站 | 69av网| 九九国产视频 | 美女激情影院 | 欧美调教网站 | 五月天色婷婷丁香 | 中文字幕第一页在线播放 | 国产在线视频一区二区三区 | 免费在线观看午夜视频 | 国产精品无 | 成人黄色在线视频 | 国产免费视频一区二区裸体 | 欧美男男tv网站 | 国内视频1区 | 91亚洲狠狠婷婷综合久久久 | 欧美日韩中文另类 | 国产+日韩欧美 | 精品一区在线 | 午夜精品电影一区二区在线 | 最新婷婷色| 日韩在线观看小视频 | 最近高清中文字幕 | 黄www在线观看 | 久久久伊人网 | 亚州中文av | 国产精品高 | 国产一级免费观看视频 | 91精品国产麻豆国产自产影视 | 激情综合网五月激情 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 视频在线91 | 九九免费精品视频 | 在线之家官网 | 日批在线观看 | 色综合天天综合网国产成人网 | 日韩久久一区二区 | 色婷婷骚婷婷 | av免费观看网址 | 天天操天天操天天干 | 国产黄色精品在线观看 | 福利区在线观看 | 182午夜在线观看 | 日韩草比 | 久久理论影院 | 免费精品在线观看 | 国产精品视频在线看 | 麻豆91网站 | 国产亚洲精品日韩在线tv黄 | 天天色中文 | 天天操天天射天天舔 | 国产一区二区不卡视频 | 91九色在线播放 | 午夜视频导航 | 久久久久久久久久久网站 | 亚洲三级性片 | 久久久高清 | 六月色婷婷 | 久久97久久 | 99色在线观看视频 | 美女av免费看 | 色综合久久天天 | 国产91精品一区二区麻豆亚洲 | 国内99视频| 日韩在线国产 | 99视频网站 | 色综合久久久网 | 韩国在线一区二区 | 欧美一级视频在线观看 | 最近中文字幕视频完整版 | 免费看av片网站 | 91成人在线免费观看 | 国产视频一二三 | 国产伦理一区二区三区 | 在线免费观看国产黄色 | 欧美精品二区 | 日韩视频免费看 | 日本一区二区免费在线观看 | 国产精品网在线观看 | 久草免费福利在线观看 | 狠狠干夜夜操天天爽 | 国产在线观看你懂的 | 国产精品24小时在线观看 | 午夜久久| 久久精品xxx | 最新国产一区二区三区 | 国产精品美女久久 | 少妇精69xxtheporn | 在线免费观看黄网站 | 精品在线视频播放 | 免费91在线观看 | 99视频99| 亚洲天堂网在线播放 | 91麻豆精品国产91久久久更新时间 | 精品人人人人 | 久久久久国产精品厨房 | av电影免费观看 | 超碰资源在线 | 伊人狠狠操 | 天天看天天操 | 啪啪免费观看网站 | 一区二区不卡在线观看 | 久久九九影视 | 91在线小视频 | 99综合电影在线视频 | 麻豆成人精品视频 | 中文在线免费一区三区 | 黄色软件在线观看 | 欧美黄色软件 | 黄色毛片网站在线观看 | 永久免费的啪啪网站免费观看浪潮 | 中文字幕在线免费看线人 | 毛片激情永久免费 | 国产高清精| 欧美精品午夜 | 国产 欧美 日韩 | 国偷自产中文字幕亚洲手机在线 | 亚洲国产成人精品在线 | 久久一区二区免费视频 | 国产精品久久久久久久久久免费 | 在线有码中文字幕 | 精品久久1 | 亚洲免费不卡 | 成人aaa毛片 | 国产亚洲激情视频在线 | 激情小说久久 | 免费观看一区二区 | 欧美二区三区91 | 欧美在线日韩在线 | 天天爽夜夜爽人人爽一区二区 | 中文字幕在线观看第三页 | 国产97在线播放 | 一本一本久久aa综合精品 | 欧美在线a视频 | 欧美日韩国产精品一区二区 | 97精品国自产拍在线观看 | 91精品无人成人www | 激情影院在线观看 | 久久精品艹 | 天天干天天想 | 欧美激情在线看 | 日韩av免费在线看 | 四虎影视成人 | 国产香蕉久久精品综合网 | 麻豆传媒电影在线观看 | 麻豆视频免费在线播放 | 日日天天av| 成人香蕉视频 | 久久久久高清毛片一级 | 一二三区av | 国产一区二区在线播放视频 | 六月丁香伊人 | 99精品成人 | 美女黄濒 | 日韩中文字幕国产精品 | 久久久久国产精品厨房 | 成人精品国产 | 久久综合偷偷噜噜噜色 | 亚洲精品在线免费看 | 久久1区 | 一区电影 | 免费观看完整版无人区 | 狠狠干.com | 免费又黄又爽视频 | 97理论电影 | 国产精品久久久久久久久久99 | 91av电影在线观看 | 欧美最猛性xxxxx(亚洲精品) | 麻豆视传媒官网免费观看 | 精品亚洲免费 | 国产小视频你懂的 | 国产中文字幕在线观看 | 久久精品国产精品亚洲 | 女人魂免费观看 | 日日操日日插 | 热久久免费视频精品 | 最新国产一区二区三区 | 国产亚洲永久域名 | www.五月婷婷.com | 日日夜夜天天综合 | 久久99久久99精品免观看粉嫩 | 黄色大片免费播放 | 久久免费精品视频 | 国产97色| 成人免费看片网址 | 偷拍福利视频一区二区三区 | 美女性爽视频国产免费app | 黄色三级免费看 | 国产视频69 | 91手机视频在线 | 久久99精品国产麻豆婷婷 | 91在线视频导航 | 亚洲黄色免费在线 | 五月婷婷综合久久 | 午夜精品久久久久久久99无限制 | 99久久999久久久精玫瑰 | 日韩中文三级 | 日韩三级在线观看 | 久久国产a | 免费在线观看午夜视频 | 成人性生爱a∨ | av在线网站观看 | 国产精品乱码久久久久 | 日韩av一区二区三区 | 岛国片在线 | 国产免费又爽又刺激在线观看 | 99这里都是精品 | 亚洲视频观看 | 四虎www | av一区二区三区在线观看 | 91喷水| 午夜丁香网 | 国产高清不卡在线 | www.天天成人国产电影 | 一区二区av| 欧美日韩免费在线视频 | 久久最新 | 欧美日韩不卡在线视频 | 日韩午夜视频在线观看 | 日韩视频a | 国产在线高清 | avsex| 国内精品中文字幕 | 久久久18 | 亚洲精色| 天天操天天添天天吹 | 色99久久 | 日本久久中文 | 婷婷网在线 | 日韩特黄一级欧美毛片特黄 | 九九综合久久 | 国产成人久久av | 探花视频在线观看+在线播放 | 色94色欧美 | 在线欧美中文字幕 | 激情婷婷亚洲 | 日韩av区 | 天天干天天玩天天操 | 91桃色在线观看视频 | 丁香六月在线 | 99久久精品国 | 欧美永久视频 | 久草视频免费在线观看 | 看国产黄色大片 | 91精品久久久久久久99蜜桃 | 欧美性护士 | 高清精品视频 | 麻豆精品视频在线 | 一区二区三区精品久久久 | 国产 日韩 欧美 自拍 | 国产精品区免费视频 | 亚洲视频综合 | 中文字幕免费高清av | 久久久久久久久久久久电影 | 国产精品九九热 | 日日干网址 | 在线 国产 亚洲 欧美 | 国产亚洲精品久久久久久久久久久久 | 久艹在线观看视频 | 欧美a√大片 | 国产精品福利午夜在线观看 | www视频在线观看 | 在线观看av小说 | 久久99精品久久久久久久久久久久 | 操操操日日日 | 一本色道久久精品 | 国产精品久久二区 | 色婷婷综合五月 | 亚洲精品国产综合久久 | 91色一区二区三区 | www.久久免费 | 深爱激情综合 | 亚洲男男gaygayxxxgv | 国产 日韩 在线 亚洲 字幕 中文 | 天天操天天操天天操 | 亚洲视频免费在线观看 | 国产视频在 | 欧美日韩在线观看一区 | 精品视频| 涩涩网站在线 | 久草精品视频在线播放 | 久草在线视频在线观看 | 日韩在线| 中文字幕视频播放 | 伊人网综合在线观看 | 永久免费的啪啪网站免费观看浪潮 | 午夜 久久 tv | 午夜色场| 四虎影视精品成人 | 在线a人片免费观看视频 | 国产又粗又猛又色又黄视频 | 国产精品av在线 | 日韩av一卡二卡三卡 | 亚洲理论在线观看 | 韩国av电影网| 国产精品普通话 | 亚洲日本三级 | 激情影院在线观看 | 国产一区二区手机在线观看 | 91porny九色在线播放 | 99亚洲精品在线 | 久久国产精品小视频 | 国产老太婆免费交性大片 | 五月婷婷在线观看视频 | 国模一二三区 | 在线观看亚洲国产 | 久99久中文字幕在线 | 91在线看黄 | 久久久网页| 国产精品一区二区三区四 | 国产.精品.日韩.另类.中文.在线.播放 | 91精品视频免费 | 欧美日韩视频网站 | 97在线播放| 国产精品久久久久一区二区三区共 | 欧美成人免费在线 | 亚洲高清在线精品 | 久草在线视频国产 | 国产伦精品一区二区三区高清 | 久久久久久久久久免费视频 | 久草精品电影 | 激情视频免费在线 | 日韩精品无| 国产精品久久在线观看 | 国产伦理久久精品久久久久_ | 国产成人福利在线观看 | 成年人国产在线观看 | 91看片麻豆| 噜噜色官网 | 成人a在线观看 | 久久福利小视频 | 久久久电影 | 四虎国产免费 | www.色就是色 | 天天干,天天草 | 一区二区不卡高清 | 国产精品视频全国免费观看 | 国产一区在线精品 | 91亚州| 婷婷视频在线观看 | 欧美久久久久久久久久久 | 成人在线小视频 | 国产色婷婷在线 | 日韩网页| 日韩精品视频在线免费观看 | 字幕网av| 欧美aa一级片 | 美女精品国产 | 91视频最新网址 | 国产精品久久久久一区二区三区 | 中文字幕日韩av | 美女国产网站 | 国产精品午夜在线观看 | 人人爽人人爽人人片av免 | 狠狠干2018 | 国产精品久久久久久久久久东京 | 国产精品乱码一区二区视频 | 在线播放 日韩专区 | 中文字幕国语官网在线视频 | av电影免费 | 国内精品视频久久 | 手机色在线 | 婷婷久月 | 中文字幕在线免费观看视频 | 97香蕉久久国产在线观看 | 在线观看精品一区 | 国产精品日韩在线 | 亚洲 精品在线视频 | 91精品国产91p65 | 午夜av免费| 国产精品密入口果冻 | 六月色丁香 | 天天夜操 | 4438全国亚洲精品观看视频 | 91精品国产综合久久久久久久 | 国产一级视频免费看 | 亚洲欧美激情精品一区二区 | 亚洲 欧美 精品 | 夜夜天天干 | 97在线免费观看 | 成人影音在线 | 日b视频在线观看网址 | 超级碰碰免费视频 | 人人射人人爽 | 天天爱天天 | 69国产成人综合久久精品欧美 | 免费看一级黄色大全 | 久草免费新视频 | 国语精品免费视频 | 狠狠狠狠狠狠天天爱 | 欧美日韩一区二区视频在线观看 | 激情综合六月 | 欧美日韩国产伦理 | 国语久久 | 久久狠狠亚洲综合 | 蜜桃视频在线视频 | 国产美女被啪进深处喷白浆视频 | 亚洲国产中文字幕在线视频综合 | 91香蕉视频好色先生 | 中文字幕亚洲高清 | 午夜性色 | 国产成人一区二区三区电影 | 怡红院久久 | 久久免费看av | 美女免费网视频 | 日日天天狠狠 | 99自拍视频在线观看 | 久草久草在线观看 | 久久久精品网 | 精品国产亚洲一区二区麻豆 | 日本动漫做毛片一区二区 | 极品中文字幕 | 久久人人爽人人爽人人片av软件 | 精品视频 | 精品麻豆 | 特级西西444www高清大视频 | 精品嫩模福利一区二区蜜臀 | 91精品久久久久久综合五月天 | 成人一级电影在线观看 | 在线精品视频免费播放 | 国产精品一区在线观看你懂的 | 欧美精品在线一区 | 中文字幕中文字幕在线中文字幕三区 | 天天操夜夜摸 | 黄色三级免费网址 | 麻豆视频免费看 | 综合色站 | 一区二区精品在线 | 亚洲午夜av久久乱码 | 国产成人av电影在线观看 | 色综合天天色综合 | 婷婷国产v亚洲v欧美久久 | 九九九九精品九九九九 | 欧美日韩大片在线观看 | 精品久久久久久久久久久久久久久久久久 | 久久久私人影院 | 91看片在线看片 | 一二区精品 | 黄色三级av | 精品99视频 | 四虎影视精品成人 | 黄色在线视频网址 | 日韩一级电影在线观看 | 中文不卡视频 | 日一日干一干 | 成年一级片| 亚洲毛片在线观看. | 午夜视频在线观看一区二区 | 国产色一区 | 国产韩国精品一区二区三区 | 国产精品爽爽久久久久久蜜臀 | 国产精品国产三级在线专区 | 日韩视频一区二区在线观看 | 91精品1区2区 | 亚洲精品视频在线免费播放 | 国产精品免费一区二区三区在线观看 | 日韩免费二区 | 久久99精品波多结衣一区 | 成人毛片一区二区三区 | 国产精品久久久久婷婷二区次 | 国产精品av免费 | 欧美国产精品久久久久久免费 | a黄色影院 | 最新精品国产 | 日本公妇在线观看高清 | 亚洲dvd| 国产香蕉在线 | 国产生活一级片 | 一区二区三区四区免费视频 | 婷婷丁香五 | 国产在线综合视频 | 欧美性另类 | 久久精品官网 | 激情网色 | 干亚洲少妇 | 日韩在线高清视频 | 97视频亚洲 | 六月婷婷网 | 欧美狠狠色 | 国产精品99久久久久久人免费 | 亚洲砖区区免费 | 免费亚洲电影 | 国产精品毛片久久久久久久久久99999999 | 久久久久久久久久久久久9999 | 在线观看免费av网 | 久久久久在线视频 | 一区二区三区av在线 | 精品国产91亚洲一区二区三区www | 91麻豆精品国产91久久久久 | 激情九九 | 在线观看成人 | 99热高清| 十八岁免进欧美 | 中文字幕高清有码 | 亚洲激情影院 | 在线观看视频黄色 | 成人在线播放网站 | 中文字幕影片免费在线观看 | 亚洲一区二区精品视频 | 91成年视频 | 成人a级免费视频 | 亚洲jizzjizz日本少妇 | 日韩视频免费观看高清完整版在线 | 久久久av免费| 在线成人一区二区 | 国产成人综合在线观看 | 私人av| 久久九九久久九九 | 欧美日韩国产在线 | 亚洲成年人在线播放 | 日韩国产在线观看 | 中文在线亚洲 | 91精品91 | 国产专区在线视频 | 成年人在线免费看视频 | 成年人电影毛片 | 天天天色综合a | 亚洲一区免费在线 | 精品成人a区在线观看 | 国产一区二区成人 | 超薄丝袜一二三区 | 免费观看黄色av | 99精品偷拍视频一区二区三区 | 婷婷中文字幕在线观看 | 亚洲欧美精品在线 | 亚洲日本在线视频观看 | 在线天堂v | 欧美日韩亚洲一 | 精品麻豆入口免费 | av高清一区二区三区 | 91av小视频 | 国产夫妻自拍av | 国产精品一区二区麻豆 | 综合婷婷久久 | 国产中文字幕视频在线 | 黄色大片日本免费大片 | 在线看成人| 91久久影院 | 久久久免费 | 在线视频手机国产 | 激情视频亚洲 | 国内精品中文字幕 | 久久免费的精品国产v∧ | 欧美三人交 | 国产成人福利片 | 亚洲一区二区精品视频 | 精品久久久久久国产偷窥 | 久久久久成 | 欧美激情精品久久 | 国产香蕉97碰碰碰视频在线观看 | av片中文| 一级黄色a视频 | 国产又粗又长的视频 | 中文字幕在线看 | 国产精品女主播一区二区三区 | 国产精品一区二区中文字幕 | 亚洲97在线 | 日批视频在线播放 | 五月天国产 | 成年人免费观看国产 | 亚洲精品三级 | www.狠狠插.com | 综合在线亚洲 |