久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長資訊網
最全最豐富的資訊網站

基于Java NIO的即時聊天服務器模型

折騰了一個周,終于搞出來了一個雛形,相比于xmpp的xml,本人更喜歡json的簡潔,為了防止客戶端異常斷開等,準備采用心跳檢測的機制來判斷用戶是否在線,另外還有一種方法是學習例如Tomcat等Servlet中間件的方式,設置Session周期,定時清除過期Session。

    前不久自己動手寫了一個Android的聊天工具,跟服務器的交互還是基于HTTP方式的,在一般通訊上還算湊活,但是在即時聊天的時候就有點惡心了,客戶端開啟Service每隔3秒去詢問服務器是否有自己的新消息(當然3秒有點太快了),在心疼性能和流量的前提下,只能自己動手寫個服務器,傳統的Socket是阻塞的,這樣的話服務器對每個Socket都需要建立一個線程來操作,資源開銷很大,而且線程多了直接會影響服務端的性能(曾經測試開了3000多個線程就不讓創建了,所以并發數目也是有限制的),聽說從JDK1.5就多了個New
    IO,灰常不錯的樣子,找了找相關的資料,網上竟然全都是最最最簡單的一個demo,然后去CSDN發帖,基本上都是建議直接使用MINA框架的,這樣一來根本達不到學習NIO的目的,而且現在的技術也太快餐了,只知道使用前輩留下的東西,知其然不知其所以然。

    折騰了一個周,終于搞出來了一個雛形,相比于xmpp的xml,本人更喜歡json的簡潔,為了防止客戶端異常斷開等,準備采用心跳檢測的機制來判斷用戶是否在線,另外還有一種方法是學習例如Tomcat等Servlet中間件的方式,設置Session周期,定時清除過期Session。本Demo暫時實現了Session過期檢測,心跳檢測有空再搞,如果本例子在使用過程中有性能漏洞或者什么bug請及時通知我,謝謝。

    廢話不多說,關于NIO的SelectionKey、Selector、Channel網上的介紹例子都很多,直接上代碼:

    JsonParser

    Json的解析類,隨便封裝了下,使用的最近比較火的fastjson

                     
    1. public class JsonParser {
    2. private static JSONObject mJson;
    3. public synchronized static String get(String json,String key) {
    4. mJson = JSON.parseObject(json);
    5. return mJson.getString(key);
    6. }
    7. }
     

    Main

    入口,不解釋

                                                                                                     
    1. public class Main {
    2. public static void main(String… args) {
    3. new SeekServer().start();
    4. }
    5. }
     

    Log

                                                                                                                                                             
    1. public class Log {
    2. public static void i(Object obj) {
    3. System.out.println(obj);
    4. }
    5. public static void e(Object e) {
    6. System.err.println(e);
    7. }
    8. }
     

    SeekServer:

    服務器端的入口,請求的封裝和接收都在此類,端口暫時寫死在了代碼里,mSelector.select(TIME_OUT) > 0
    目的是為了當服務器空閑的時候(沒有任何讀寫甚至請求斷開事件),循環時有個間隔時間,不然基本上相當于while(true){//nothing}了,你懂的。

                                                                                                                                                                                                                                             
    1. public class SeekServer extends Thread{
    2. private final int ACCPET_PORT = 55555;
    3. private final int TIME_OUT = 1000;
    4. private Selector mSelector = null;
    5. private ServerSocketChannel mSocketChannel = null;
    6. private ServerSocket mServerSocket = null;
    7. private InetSocketAddress mAddress = null;
    8. public SeekServer() {
    9. long sign = System.currentTimeMillis();
    10. try {
    11. mSocketChannel = ServerSocketChannel.open();
    12. if(mSocketChannel == null) {
    13. System.out.println(“can’t open server socket channel”);
    14. }
    15. mServerSocket = mSocketChannel.socket();
    16. mAddress = new InetSocketAddress(ACCPET_PORT);
    17. mServerSocket.bind(mAddress);
    18. Log.i(“server bind port is “ + ACCPET_PORT);
    19. mSelector = Selector.open();
    20. mSocketChannel.configureBlocking(false);
    21. SelectionKey key = mSocketChannel.register(mSelector, SelectionKey.OP_ACCEPT);
    22. key.attach(new Acceptor());
    23. //檢測Session狀態
    24. Looper.getInstance().loop();
    25. //開始處理Session
    26. SessionProcessor.start();
    27. Log.i(“Seek server startup in “ + (System.currentTimeMillis() – sign) + “ms!”);
    28. } catch (ClosedChannelException e) {
    29. Log.e(e.getMessage());
    30. } catch (IOException e) {
    31. Log.e(e.getMessage());
    32. }
    33. }
    34. public void run() {
    35. Log.i(“server is listening…”);
    36. while(!Thread.interrupted()) {
    37. try {
    38. if(mSelector.select(TIME_OUT) > 0) {
    39. Set<SelectionKey> keys = mSelector.selectedKeys();
    40. Iterator<SelectionKey> iterator = keys.iterator();
    41. SelectionKey key = null;
    42. while(iterator.hasNext()) {
    43. key = iterator.next();
    44. Handler at = (Handler) key.attachment();
    45. if(at != null) {
    46. at.exec();
    47. }
    48. iterator.remove();
    49. }
    50. }
    51. } catch (IOException e) {
    52. Log.e(e.getMessage());
    53. }
    54. }
    55. }
    56. class Acceptor extends Handler{
    57. public void exec(){
    58. try {
    59. SocketChannel sc = mSocketChannel.accept();
    60. new Session(sc, mSelector);
    61. } catch (ClosedChannelException e) {
    62. Log.e(e);
    63. } catch (IOException e) {
    64. Log.e(e);
    65. }
    66. }
    67. }
    68. }
     

    Handler:

    只有一個抽象方法exec,Session將會繼承它。

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
    1. public abstract class Handler {
    2. public abstract void exec();
    3. }
     

    Session:

    封裝了用戶的請求和SelectionKey和SocketChannel,每次接收到新的請求時都重置它的最后活動時間,通過狀態mState=READING
    or SENDING 去執行消息的接收與發送,當客戶端異常斷開時則從SessionManager清除該會話。

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
    1. public class Session extends Handler{
    2. private SocketChannel mChannel;
    3. private SelectionKey mKey;
    4. private ByteBuffer mRreceiveBuffer = ByteBuffer.allocate(10240);
    5. private Charset charset = Charset.forName(“UTF-8”);
    6. private CharsetDecoder mDecoder = charset.newDecoder();
    7. private CharsetEncoder mEncoder = charset.newEncoder();
    8. private long lastPant;//最后活動時間
    9. private final int TIME_OUT = 1000 * 60 * 5; //Session超時時間
    10. private String key;
    11. private String sendData = “”;
    12. private String receiveData = null;
    13. public static final int READING = 0,SENDING = 1;
    14. int mState = READING;
    15. public Session(SocketChannel socket, Selector selector) throws IOException {
    16. this.mChannel = socket;
    17. mChannel = socket;
    18. mChannel.configureBlocking(false);
    19. mKey = mChannel.register(selector, 0);
    20. mKey.attach(this);
    21. mKey.interestOps(SelectionKey.OP_READ);
    22. selector.wakeup();
    23. lastPant = Calendar.getInstance().getTimeInMillis();
    24. }
    25. public String getReceiveData() {
    26. return receiveData;
    27. }
    28. public void clear() {
    29. receiveData = null;
    30. }
    31. public void setSendData(String sendData) {
    32. mState = SENDING;
    33. mKey.interestOps(SelectionKey.OP_WRITE);
    34. this.sendData = sendData + “n”;
    35. }
    36. public boolean isKeekAlive() {
    37. return lastPant + TIME_OUT > Calendar.getInstance().getTimeInMillis();
    38. }
    39. public void setAlive() {
    40. lastPant = Calendar.getInstance().getTimeInMillis();
    41. }
    42. /**
    43. * 注銷當前Session
    44. */
    45. public void distroy() {
    46. try {
    47. mChannel.close();
    48. mKey.cancel();
    49. } catch (IOException e) {}
    50. }
    51. @Override
    52. public synchronized void exec() {
    53. try {
    54. if(mState == READING) {
    55. read();
    56. }else if(mState == SENDING) {
    57. write();
    58. }
    59. } catch (IOException e) {
    60. SessionManager.remove(key);
    61. try {
    62. mChannel.close();
    63. } catch (IOException e1) {
    64. Log.e(e1);
    65. }
    66. mKey.cancel();
    67. }
    68. }
    69. public void read() throws IOException{
    70. mRreceiveBuffer.clear();
    71. int sign = mChannel.read(mRreceiveBuffer);
    72. if(sign == –1) { //客戶端連接關閉
    73. mChannel.close();
    74. mKey.cancel();
    75. }
    76. if(sign > 0) {
    77. mRreceiveBuffer.flip();
    78. receiveData = mDecoder.decode(mRreceiveBuffer).toString();
    79. setAlive();
    80. setSign();
    81. SessionManager.addSession(key, this);
    82. }
    83. }
    84. private void setSign() {
    85. //設置當前Session的Key
    86. key = JsonParser.get(receiveData,“imei”);
    87. //檢測消息類型是否為心跳包
    88. // String type = jo.getString(“type”);
    89. // if(type.equals(“HEART_BEAT”)) {
    90. // setAlive();
    91. // }
    92. }
    93. /**
    94. * 寫消息
    95. */
    96. public void write() {
    97. try {
    98. mChannel.write(mEncoder.encode(CharBuffer.wrap(sendData)));
    99. sendData = null;
    100. mState = READING;
    101. mKey.interestOps(SelectionKey.OP_READ);
    102. } catch (CharacterCodingException e) {
    103. e.printStackTrace();
    104. } catch (IOException e) {
    105. try {
    106. mChannel.close();
    107. } catch (IOException e1) {
    108. Log.e(e1);
    109. }
    110. }
    111. }
    112. }
     

    SessionManager:

    將所有Session存放到ConcurrentHashMap,這里使用手機用戶的imei做key,ConcurrentHashMap因為是線程安全的,所以能很大程度上避免自己去實現同步的過程,
    封裝了一些操作Session的方法例如get,remove等。

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
    1. public class SessionManager {
    2. private static ConcurrentHashMap<String, Session> sessions = new ConcurrentHashMap<String, Session>();
    3. public static void addSession(String key,Session session) {
    4. sessions.put(key, session);
    5. }
    6. public static Session getSession(String key) {
    7. return sessions.get(key);
    8. }
    9. public static Set<String> getSessionKeys() {
    10. return sessions.keySet();
    11. }
    12. public static int getSessionCount() {
    13. return sessions.size();
    14. }
    15. public static void remove(String[] keys) {
    16. for(String key:keys) {
    17. if(sessions.containsKey(key)) {
    18. sessions.get(key).distroy();
    19. sessions.remove(key);
    20. }
    21. }
    22. }
    23. public static void remove(String key) {
    24. if(sessions.containsKey(key)) {
    25. sessions.get(key).distroy();
    26. sessions.remove(key);
    27. }
    28. }
    29. }
     

    SessionProcessor

    里面使用了JDK自帶的線程池,用來分發處理所有Session中當前需要處理的請求(線程池的初始化參數不是太熟,望有了解的童鞋能告訴我),內部類Process則是將Session再次封裝成SocketRequest和SocketResponse(看到這里是不是有點熟悉的感覺,對沒錯,JavaWeb里到處都是request和response)。

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
    1. public class SessionProcessor implements Runnable{
    2. private static Runnable processor = new SessionProcessor();
    3. private static ThreadPoolExecutor pool = new ThreadPoolExecutor(10, 200, 500, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(10),new ThreadPoolExecutor.CallerRunsPolicy());
    4. public static void start() {
    5. new Thread(processor).start();
    6. }
    7. @Override
    8. public void run() {
    9. while(true) {
    10. Session tmp = null;
    11. for(String key:SessionManager.getSessionKeys()) {
    12. tmp = SessionManager.getSession(key);
    13. //處理Session未處理的請求
    14. if(tmp.getReceiveData() != null) {
    15. pool.execute(new Process(tmp));
    16. }
    17. }
    18. try {
    19. Thread.sleep(10);
    20. } catch (InterruptedException e) {
    21. Log.e(e);
    22. }
    23. }
    24. }
    25. class Process implements Runnable {
    26. private SocketRequest request;
    27. private SocketResponse response;
    28. public Process(Session session) {
    29. //將Session封裝成Request和Response
    30. request = new SocketRequest(session);
    31. response = new SocketResponse(session);
    32. }
    33. @Override
    34. public void run() {
    35. new RequestTransform().transfer(request, response);
    36. }
    37. }
    38. }
     

    RequestTransform里的transfer方法利用反射對請求參數中的請求類別和請求動作來調用不同類的不同方法(UserHandler和MessageHandler)

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
    1. public class RequestTransform {
    2. public void transfer(SocketRequest request,SocketResponse response) {
    3. String action = request.getValue(“action”);
    4. String handlerName = request.getValue(“handler”);
    5. //根據Session的請求類型,讓不同的類方法去處理
    6. try {
    7. Class<?> c= Class.forName(“com.seek.server.handler.” + handlerName);
    8. Class<?>[] arg=new Class[]{SocketRequest.class,SocketResponse.class};
    9. Method method=c.getMethod(action,arg);
    10. method.invoke(c.newInstance(), new Object[]{request,response});
    11. } catch (Exception e) {
    12. e.printStackTrace();
    13. }
    14. }
    15. }
     

    SocketRequest和SocketResponse

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
    1. public class SocketRequest {
    2. private Session mSession;
    3. private String mReceive;
    4. public SocketRequest(Session session) {
    5. mSession = session;
    6. mReceive = session.getReceiveData();
    7. mSession.clear();
    8. }
    9. public String getValue(String key) {
    10. return JsonParser.get(mReceive, key);
    11. }
    12. public String getQueryString() {
    13. return mReceive;
    14. }
    15. }
     

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
    1. public class SocketResponse {
    2. private Session mSession;
    3. public SocketResponse(Session session) {
    4. mSession = session;
    5. }
    6. public void write(String msg) {
    7. mSession.setSendData(msg);
    8. }
    9. }
     

    最后則是兩個處理請求的Handler

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
    1. public class UserHandler {
    2. public void login(SocketRequest request,SocketResponse response) {
    3. System.out.println(request.getQueryString());
    4. //TODO: 處理用戶登錄
    5. response.write(“你肯定收到消息了”);
    6. }
    7. }
     

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
    1. public class MessageHandler {
    2. public void send(SocketRequest request,SocketResponse response) {
    3. System.out.println(request.getQueryString());
    4. //消息發送
    5. String key = request.getValue(“imei”);
    6. Session session = SessionManager.getSession(key);
    7. new SocketResponse(session).write(request.getValue(“sms”));
    8. }
    9. }
     

    還有個監測是否超時的類Looper,定期去刪除Session

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
    1. public class Looper extends Thread{
    2. private static Looper looper = new Looper();
    3. private static boolean isStart = false;
    4. private final int INTERVAL = 1000 * 60 * 5;
    5. private Looper(){}
    6. public static Looper getInstance() {
    7. return looper;
    8. }
    9. public void loop() {
    10. if(!isStart) {
    11. isStart = true;
    12. this.start();
    13. }
    14. }
    15. public void run() {
    16. Task task = new Task();
    17. while(true) {
    18. //Session過期檢測
    19. task.checkState();
    20. //心跳包檢測
    21. //task.sendAck();
    22. try {
    23. Thread.sleep(INTERVAL);
    24. } catch (InterruptedException e) {
    25. Log.e(e);
    26. }
    27. }
    28. }
    29. }
     

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
    1. public class Task {
    2. public void checkState() {
    3. Set<String> keys = SessionManager.getSessionKeys();
    4. if(keys.size() == 0) {
    5. return;
    6. }
    7. List<String> removes = new ArrayList<String>();
    8. Iterator<String> iterator = keys.iterator();
    9. String key = null;
    10. while(iterator.hasNext()) {
    11. key = iterator.next();
    12. if(!SessionManager.getSession(key).isKeekAlive()) {
    13. removes.add(key);
    14. }
    15. }
    16. if(removes.size() > 0) {
    17. Log.i(“sessions is time out,remove “ + removes.size() + “session”);
    18. }
    19. SessionManager.remove(removes.toArray(new String[removes.size()]));
    20. }
    21. public void sendAck() {
    22. Set<String> keys = SessionManager.getSessionKeys();
    23. if(keys.size() == 0) {
    24. return;
    25. }
    26. Iterator<String> iterator = keys.iterator();
    27. while(iterator.hasNext()) {
    28. iterator.next();
    29. //TODO 發送心跳包
    30. }
    31. }
    32. }
     

    注意,在Task和SessionProcessor類里都有對SessionManager的sessions做遍歷,文中使用的方法并不是很好,主要是效率問題,推薦使用遍歷Entry的方式來獲取Key和Value,因為一直在JavaWeb上折騰,所以會的童鞋看到Request和Response會挺親切,這個例子沒有經過任何安全和性能測試,如果需要放到生產環境上得話請先自行做測試-
    -!

    客戶端請求時的數據內容例如{handler:”UserHandler”,action:”login”,imei:”2364656512636″…….},這些約定就自己來定了。

    贊(0)
    分享到: 更多 (0)
    ?
    網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
    久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
    日韩毛片在线| 视频国产精品| 久久精品国产精品亚洲毛片| 日本不卡在线视频| 欧美精品中文字幕亚洲专区| 日韩高清中文字幕一区| 日本综合精品一区| 综合国产视频| 欧美在线日韩| 国产精品nxnn| a日韩av网址| 精品中文字幕一区二区三区av| 黑丝一区二区| 日本一区二区中文字幕| 国产精品欧美三级在线观看 | 日本成人在线不卡视频| 日韩av网站免费在线| 免费看欧美美女黄的网站| 亚洲精品麻豆| 欧美国产不卡| 日韩在线高清| 免费日韩av片| 国产欧美日韩精品高清二区综合区 | 香蕉久久久久久| 国产探花一区二区| 国产一区二区三区久久| 日本精品不卡| 日韩制服丝袜先锋影音| 国产精品一区二区三区四区在线观看| 精品视频91| 久久香蕉国产| 男女激情视频一区| 国产精品香蕉| 激情婷婷亚洲| 欧美视频精品全部免费观看| 日韩av有码| aa国产精品| 欧美在线精品一区| 欧美xxxx中国| 丝袜美腿亚洲色图| 久久国产精品美女| 久久视频国产| 国产日韩欧美一区二区三区| 久久婷婷亚洲| 91成人福利| 92国产精品| 亚洲精品美女91| 日韩国产欧美一区二区| 亚洲一级淫片| 亚洲性色av| 日本综合视频| 99精品视频在线| 日本成人中文字幕| 亚洲成人av观看| 日韩毛片一区| 最新亚洲国产| 日韩综合精品| 日韩高清不卡在线| 激情欧美亚洲| 精品午夜av| 亚洲另类视频| 久久久水蜜桃av免费网站| 欧美视频二区| 婷婷亚洲综合| 美女视频黄 久久| 伊人国产精品| 91精品啪在线观看国产18| 国产亚洲精品美女久久| 日韩视频二区| 日韩国产一区| 国产精品一级| 伊人久久亚洲| 精品国模一区二区三区| 欧美日韩xxxx| 蜜桃视频一区二区| 伊人久久大香线蕉av不卡| 久久麻豆视频| 欧美一区91| 久久大逼视频| 欧美亚洲精品在线| 成人免费一区| 91成人在线| 日韩精品一级二级 | 亚洲一区网站| 久久九九99| 成午夜精品一区二区三区软件| 免费精品视频| 色综合狠狠操| 日本国产欧美| 国产亚洲毛片| 久久影视一区| 国产高清不卡| 精品一区二区三区在线观看视频| 日韩欧美中文字幕电影 | 精品久久精品| 91精品啪在线观看国产18| 久久精品国产999大香线蕉| 亚洲精品一二三**| 亚洲国产日韩欧美在线| 欧美精品资源| 精品国产91| 欧美午夜三级| 日韩1区2区日韩1区2区| 亚洲精品亚洲人成在线观看| 亚洲欧美久久久| 欧美日韩在线二区| 婷婷亚洲精品| 亚洲精选91| 蜜臀av一区二区在线免费观看| 合欧美一区二区三区| 久久久人人人| 电影91久久久| 久久亚洲精精品中文字幕| 国产亚洲第一伦理第一区| 亚洲aa在线| 婷婷精品久久久久久久久久不卡| 亚洲深深色噜噜狠狠爱网站| 男女男精品视频网| 三级欧美在线一区| 99riav国产精品| 美女精品在线观看| 亚洲专区一区| 水野朝阳av一区二区三区| 视频一区二区中文字幕| 日韩中文字幕1| 亚洲在线观看| 男女男精品网站| 亚洲香蕉久久| 日本精品另类| 国产免费久久| 精品久久视频| 在线天堂中文资源最新版| 色爱av综合网| 国产视频一区三区| 国产农村妇女精品一二区| 亚洲永久精品唐人导航网址| 日本久久一区| 国产精品一区二区精品视频观看| 国产精品亚洲一区二区在线观看 | 伊人久久大香伊蕉在人线观看热v| 欧美日韩国产高清电影| 亚洲一区二区免费看| 综合国产在线| 国产精品1区在线| 国产精品麻豆成人av电影艾秋| 国产欧美一区二区三区米奇| 国产精品一站二站| 久久wwww| 国产成人精品一区二区免费看京| 超碰在线99| 亚洲精品中文字幕乱码| 99日韩精品| 亚洲无线观看| 日本精品在线播放| 欧美激情视频一区二区三区免费 | 日韩在线视频精品| 亚洲黑丝一区二区| 国产精品腿扒开做爽爽爽挤奶网站| 蜜桃一区二区三区在线观看| 欧美一区自拍| 精品日韩在线| 日本在线高清| 亚洲小说欧美另类婷婷| 日韩中文字幕麻豆| 日本国产欧美| 国产成人精品免费视| 999国产精品视频| 婷婷色综合网| 欧美日韩一区二区三区不卡视频 | 日韩一区二区三区精品视频第3页| 日韩动漫一区| 国产精品视频一区视频二区| 国内揄拍国内精品久久| 色婷婷久久久| 在线精品观看| 美女尤物国产一区| 欧美大黑bbbbbbbbb在线| 少妇精品在线| av资源亚洲| 亚洲人成精品久久久| 91欧美在线| 日韩精品社区| 亚洲午夜黄色| 国产精品久久久久av蜜臀| 免费欧美一区| 久久99偷拍| 九九久久电影| 国产一级成人av| 欧美激情视频一区二区三区在线播放| 伊人精品一区| 欧美激情五月| 丝袜脚交一区二区| 国产日韩综合| 91一区二区| 欧美日韩午夜| 合欧美一区二区三区| 欧美私人啪啪vps| 欧美aa一级| 97久久亚洲| 欧美日韩精品一区二区视频|