日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

java實現(xiàn)即時通信的完整步驟分享

瀏覽:21日期:2022-08-25 10:40:32

前言

移動社交是我們?nèi)粘I钪泻艹R姷能浖?,最近在做即時通信,我用的是環(huán)信,和大家分享一下~~環(huán)信的API都是基于JSON的,所以在構(gòu)造HTTP請求的時候,要指定請求頭

java實現(xiàn)即時通信的完整步驟分享java實現(xiàn)即時通信的完整步驟分享

注意==》環(huán)信API必須攜帶token才可以訪問。

創(chuàng)建一個認證類

public class Authentic { private static Token token = new Token(); private TalkHttpService service; public Authentic(TalkHttpService service) { this.service = service; } public Authentic(TalkHttpService service, Token token) { this.service = service; if (token != null) { Authentic.token = token; } } public Token getToken() { this.flush(); return token; } public void task() { this.flush(); } /** * @describe 申請認證 POST PUT 這兩種請求攜帶參數(shù) * @author 何章懷曉 hezhanghuaixiao * @date 2020/9/8 17:02 * @other */ public void applyAuthentication(HttpEntityEnclosingRequestBase request) { this.flush(); request.addHeader('Authorization', 'Bearer ' + token.toString()); } /** * @describe 申請認證 GET DELETE 這兩種請求不攜帶參數(shù) * @author 何章懷曉 hezhanghuaixiao * @date 2020/9/8 17:02 * @other */ public void applyAuthentication(HttpRequestBase request) { this.flush(); request.addHeader('Authorization', 'Bearer ' + token.toString()); } private void flush() { synchronized (Authentic.class) { try { //如果超時 if (token.isExpire()) { //判斷APPID和秘鑰信息 if (_Global.APP_CLIENT_ID != null && _Global.APP_CLIENT_SECRET != null) { Map<String, Object> param = new HashMap<String, Object>(); param.put('grant_type', 'client_credentials'); param.put('client_id', _Global.APP_CLIENT_ID); param.put('client_secret', _Global.APP_CLIENT_SECRET); //請求獲取token TalkNode res = service .request(_Global.URR_TOKEN, _Global.HTTP_METHOD_POST, param, null, null); //成功獲取token if (res != null && res.getAccess_token() != null && res.getExpires_in() != null && res.getExpires_in() > 0) { //賦值 token = new Token(res.getAccess_token(), res.getExpires_in() * 1000 + System.currentTimeMillis()); } } } } catch (Exception e) { e.printStackTrace(); } } } public static class Token { private String token; private Long expire; public Token() { } public Token(String token, long expire) { this.token = token; this.expire = expire; } public String getToken() { return token; } public void setToken(String token) { this.token = token; } public Long getExpire() { return expire; } public void setExpire(Long expire) { this.expire = expire; } public boolean isExpire() { return expire == null || System.currentTimeMillis() > expire; } @Override public String toString() { return token; } }}

創(chuàng)建請求接口

public interface TalkHttpService {/** @describe @param* @param url 請求地址 * @param method請求方法 * @param param參數(shù) * @param auth加密認證 * @param field字段轉(zhuǎn)換 @return com.hedashi.protal.model.TalkNode @author 何章懷曉 hezhanghuaixiao @date 2020/9/8 17:21 @other */ TalkNode request(String url, int method, Object param, Authentic auth, String[][] field) throws Exception;/** @describe @param* @param url 請求地址 * @param file文件名稱 * @param auth加密認證 * @param equal字段轉(zhuǎn)換 @return com.hedashi.protal.model.TalkNode @author 何章懷曉 hezhanghuaixiao @date 2020/9/8 17:21 @other */ TalkNode upload(String url, File file, Authentic auth, String[][] equal) throws Exception;/** @describe @param* @param url 請求地址 * @param file文件名稱 * @param auth加密認證 * @param header請求頭 @return void @author 何章懷曉 hezhanghuaixiao @date 2020/9/8 17:21 @other */ void downLoad(String url, File file, Authentic auth, Map<String, String> header) throws Exception;}

創(chuàng)建全局變量對不同模塊操作

/* @describe 全局變量 @params @return @author 何章懷曉 @date 2020/7/30 9:30 @other */public class _Global {public static String APP_KEY = '';public static String APP_CLIENT_ID = '';public static String APP_CLIENT_SECRET = '';//每頁數(shù)量public static int APP_PAGE_SIZE = 10;public static final int HTTP_METHOD_GET = 1;public static final int HTTP_METHOD_POST = 2;public static final int HTTP_METHOD_PUT = 3;public static final int HTTP_METHOD_DELETE = 4;public static final String URL_HOST = 'http://a1.easemob.com/'+APP_KEY.replace('#','/')+'/';public static final String URR_TOKEN = URL_HOST+'token';public static final String URL_CHAT = URL_HOST+'chatmessages';public static final String URL_GROUP = URL_HOST+'chatgroups';public static final String URL_FILE = URL_HOST+'chatfiles';public static final String URL_ROOM = URL_HOST+'chatrooms';public static final String URL_MESSAGES = URL_HOST+'messages';public static final String URL_USER = URL_HOST+'users';}

請求管理類

package com.hedashi.protal.service.impl;import com.hedashi.protal.model.TalkNode;import com.hedashi.protal.model.Authentic;import com.hedashi.protal.service.TalkHttpService;import com.hedashi.protal.util.JsonTool;import com.hedashi.protal.util._Global;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.net.URI;import java.util.Map;import java.util.Map.Entry;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.HttpStatus;import org.apache.http.client.methods.HttpDelete;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.client.methods.HttpPut;import org.apache.http.entity.StringEntity;import org.apache.http.entity.mime.MultipartEntity;import org.apache.http.entity.mime.content.ContentBody;import org.apache.http.entity.mime.content.FileBody;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClients;import org.apache.http.util.EntityUtils;import org.springframework.stereotype.Service;@Servicepublic class TalkHttpServiceImplApache implements TalkHttpService { /** @describe @param * @param url 請求路徑 * @param method 方式 * @param param 參數(shù) * @param auth 認證 * @param field 將相應(yīng)結(jié)果封裝到本地 @return com.hedashi.protal.model.TalkNode @author 何章懷曉 hezhanghuaixiao @date 2020/9/8 17:39 @other */ @Override public TalkNode request(String url, int method, Object param, Authentic auth, String[][] field) throws Exception { //獲得可關(guān)閉的連接 CloseableHttpClient client = this.getClient(); try { HttpResponse response = null; //區(qū)分請求方式 switch (method) { case _Global.HTTP_METHOD_GET: //構(gòu)建請求 HttpGet get = new HttpGet(url); if (auth != null) { //如果未認證 請求認證 auth.applyAuthentication(get); } //固定請求頭信息為JSON get.addHeader('Content-Type', 'application/json'); response = client.execute(get); break; case _Global.HTTP_METHOD_POST: HttpPost post = new HttpPost(url); if (auth != null) { auth.applyAuthentication(post); } //POST攜帶參數(shù) if (param != null) { //參數(shù)編碼放入請求體 post.setEntity(new StringEntity(JsonTool.write(param), 'UTF-8')); } post.addHeader('Content-Type', 'application/json'); response = client.execute(post); break; case _Global.HTTP_METHOD_PUT: HttpPut put = new HttpPut(url); if (put != null) { auth.applyAuthentication(put); } if (param != null) { put.setEntity(new StringEntity(JsonTool.write(param), 'UTF-8')); } put.addHeader('Content-Type', 'application/json'); response = client.execute(put); break; case _Global.HTTP_METHOD_DELETE: HttpDelete delete = new HttpDelete(url); if (auth != null) { auth.applyAuthentication(delete); } delete.addHeader('Content-Type', 'application/json'); response = client.execute(delete); break; default: throw new Exception('非法請求方式'); } int code = response.getStatusLine().getStatusCode(); //判斷返回code 如果為200 if (code == HttpStatus.SC_OK) { //獲取響應(yīng)體 HttpEntity entity = response.getEntity(); if (entity != null) { //解析 String json = EntityUtils.toString(entity, 'UTF-8'); if (field != null && field.length > 0) { for (String[] temp : field) { json = json.replace(temp[0], temp[1]); } } //解析為實體類 TalkNode talkNode = (TalkNode) JsonTool.read(json, TalkNode.class); talkNode.setStatusCode(code); return talkNode; } } else { //非200將code返回 return new TalkNode(code); } } catch (Exception e) { throw e; } finally { client.close(); } return null; } @Override public TalkNode upload(String url, File file, Authentic auth, String[][] equal) throws Exception { CloseableHttpClient client = this.getClient(); try { HttpPost post = new HttpPost(); post.setURI(new URI(url)); if (auth != null) { auth.applyAuthentication(post); } post.addHeader('restrict-access', 'true'); ContentBody body = new FileBody(file); MultipartEntity part = new MultipartEntity(); part.addPart('file', body); post.setEntity(part); HttpResponse response = client.execute(post); int code = response.getStatusLine().getStatusCode(); if (code == HttpStatus.SC_OK) { HttpEntity entity = response.getEntity(); if (entity != null) { String json = EntityUtils.toString(entity, 'UTF-8'); if (equal != null && equal.length > 0) { for (String[] temp : equal) { json = json.replace(temp[0], temp[1]); } } TalkNode talkNode = (TalkNode) JsonTool.read(json, TalkNode.class); talkNode.setStatusCode(code); return talkNode; } } } catch (Exception e) { throw e; } finally { client.close(); } return null; } @Override public void downLoad(String url, File file, Authentic auth, Map<String, String> header) throws Exception { CloseableHttpClient client = this.getClient(); try { HttpGet get = new HttpGet(); get.setURI(new URI(url)); if (auth != null) { auth.applyAuthentication(get); } for (Entry<String, String> en : header.entrySet()) { get.addHeader(en.getKey(), en.getValue()); } HttpResponse response = client.execute(get); if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { HttpEntity entity = response.getEntity(); if (entity != null) { InputStream in = entity.getContent(); FileOutputStream fos = new FileOutputStream(file); byte[] data = new byte[10 * 1024]; int len = 0; while ((len = in.read(data)) != -1) { fos.write(data, 0, len); } fos.flush(); fos.close(); in.close(); } } } catch (Exception e) { throw e; } finally { client.close(); } } private CloseableHttpClient getClient() { return HttpClients.createDefault(); }}

創(chuàng)建業(yè)務(wù)請求和響應(yīng)格式類

package com.hedashi.protal.model;import java.util.List;import java.util.Map;/** @describe 根據(jù)不同的業(yè)務(wù)封裝不同的返回結(jié)果,該格式在發(fā)送請求的時候就被指定 @author 何章懷曉 hezhanghuaixiao @date 2020/9/8 17:42 @other */public class TalkNode { public static final String[][] DATA_ENTITIES = new String[][]{{'entities', 'entities_share'}, {'share-secret', 'share_secret'}}; public static final String[][] DATA_ARRAY = new String[][]{{'data', 'data_array'}}; public static final String[][] DATA_LIST = new String[][]{{'data', 'data_list'}}; public static final String[][] DATA_MAP = new String[][]{{'data', 'data_map'}}; public static final String[][] DATA_CHAT_LIST = new String[][]{{'entities', 'data_chat_list'}}; public static final String[][] DATA_ROOM = new String[][]{{'data', 'data_room'}}; public static final String[][] DATA_ROOM_LIST = new String[][]{{'data', 'data_room_list'}, {'public', 'public_room'}}; public static final String[][] DATA_ROOM_REDO = new String[][]{{'data', 'data_room_rodo'}}; public static final String[][] DATA_ROOM_REDO_LIST = new String[][]{ {'data', 'data_room_redo_list'}}; public static final String[][] DATA_GROUP = new String[][]{{'data', 'data_group'}}; public static final String[][] DATA_GROUP_UPDATE = new String[][]{{'data', 'data_group_update'}}; public static final String[][] DATA_GROUP_OWNER = new String[][]{{'data', 'data_group_owner'}}; public static final String[][] DATA_GROUP_LIST = new String[][]{{'data', 'data_group_list'}}; public static final String[][] DATA_GROUP_LIST_MEMBER = new String[][]{ {'data', 'data_group_list_member'}}; public static final String[][] DATA_GROUP_LIST_NEW = new String[][]{ {'data', 'data_group_list_new'}, {'public', 'public_group'}}; public static final String[][] DATA_GROUP_FRIEND = new String[][]{{'data', 'data_group_friend'}}; public static final String[][] DATA_GROUP_FRIEND_LIST = new String[][]{ {'data', 'data_group_friend_list'}}; private String access_token; private String action; private String application; private String applicationName; private Long count; private String cursor; private Integer duration; private Long expires_in; private String organization; private String path; private Integer statusCode; private Long timestamp; private String uri; private Map<String, Object> params; private TalkUser user; private List<TalkUser> entities; private String[] data_array; private Map<String, String> data_map; private List<Map<String, Object>> data_list; private List<TalkMsg> data_chat_list; private TalkRoom data_room; private List<TalkRoom> data_room_list; private TalkRoomRedo data_room_rodo; private List<TalkRoomRedo> data_room_redo_list; private TalkGroup data_group; private TalkGroupMember data_group_update; private TalkGroupMember data_group_owner; private List<TalkGroup> data_group_list; private List<TalkGroupMember> data_group_list_member; private List<TalkGroupNew> data_group_list_new; private TalkGroupFriend data_group_friend; private List<TalkGroupFriend> data_group_friend_list; public TalkNode() { } public TalkNode(Integer statusCode) { this.statusCode = statusCode; } public String getAccess_token() { return access_token; } public void setAccess_token(String access_token) { this.access_token = access_token; } public String getAction() { return action; } public void setAction(String action) { this.action = action; } public String getApplication() { return application; } public void setApplication(String application) { this.application = application; } public String getApplicationName() { return applicationName; } public void setApplicationName(String applicationName) { this.applicationName = applicationName; } public Long getCount() { return count; } public void setCount(Long count) { this.count = count; } public String getCursor() { return cursor; } public void setCursor(String cursor) { this.cursor = cursor; } public Integer getDuration() { return duration; } public void setDuration(Integer duration) { this.duration = duration; } public Long getExpires_in() { return expires_in; } public void setExpires_in(Long expires_in) { this.expires_in = expires_in; } public String getOrganization() { return organization; } public void setOrganization(String organization) { this.organization = organization; } public String getPath() { return path; } public void setPath(String path) { this.path = path; } public Integer getStatusCode() { return statusCode; } public void setStatusCode(Integer statusCode) { this.statusCode = statusCode; } public Long getTimestamp() { return timestamp; } public void setTimestamp(Long timestamp) { this.timestamp = timestamp; } public String getUri() { return uri; } public void setUri(String uri) { this.uri = uri; } public Map<String, Object> getParams() { return params; } public void setParams(Map<String, Object> params) { this.params = params; } public TalkUser getUser() { return user; } public void setUser(TalkUser user) { this.user = user; } public List<TalkUser> getEntities() { return entities; } public void setEntities(List<TalkUser> entities) { this.entities = entities; } public String[] getData_array() { return data_array; } public void setData_array(String[] data_array) { this.data_array = data_array; } public Map<String, String> getData_map() { return data_map; } public void setData_map(Map<String, String> data_map) { this.data_map = data_map; } public List<Map<String, Object>> getData_list() { return data_list; } public void setData_list(List<Map<String, Object>> data_list) { this.data_list = data_list; } public List<TalkMsg> getData_chat_list() { return data_chat_list; } public void setData_chat_list(List<TalkMsg> data_chat_list) { this.data_chat_list = data_chat_list; } public TalkRoom getData_room() { return data_room; } public void setData_room(TalkRoom data_room) { this.data_room = data_room; } public List<TalkRoom> getData_room_list() { return data_room_list; } public void setData_room_list(List<TalkRoom> data_room_list) { this.data_room_list = data_room_list; } public TalkRoomRedo getData_room_rodo() { return data_room_rodo; } public void setData_room_rodo(TalkRoomRedo data_room_rodo) { this.data_room_rodo = data_room_rodo; } public List<TalkRoomRedo> getData_room_redo_list() { return data_room_redo_list; } public void setData_room_redo_list(List<TalkRoomRedo> data_room_redo_list) { this.data_room_redo_list = data_room_redo_list; } public TalkGroup getData_group() { return data_group; } public void setData_group(TalkGroup data_group) { this.data_group = data_group; } public TalkGroupMember getData_group_update() { return data_group_update; } public void setData_group_update(TalkGroupMember data_group_update) { this.data_group_update = data_group_update; } public TalkGroupMember getData_group_owner() { return data_group_owner; } public void setData_group_owner(TalkGroupMember data_group_owner) { this.data_group_owner = data_group_owner; } public List<TalkGroup> getData_group_list() { return data_group_list; } public void setData_group_list(List<TalkGroup> data_group_list) { this.data_group_list = data_group_list; } public List<TalkGroupMember> getData_group_list_member() { return data_group_list_member; } public void setData_group_list_member( List<TalkGroupMember> data_group_list_member) { this.data_group_list_member = data_group_list_member; } public List<TalkGroupNew> getData_group_list_new() { return data_group_list_new; } public void setData_group_list_new(List<TalkGroupNew> data_group_list_new) { this.data_group_list_new = data_group_list_new; } public TalkGroupFriend getData_group_friend() { return data_group_friend; } public void setData_group_friend(TalkGroupFriend data_group_friend) { this.data_group_friend = data_group_friend; } public List<TalkGroupFriend> getData_group_friend_list() { return data_group_friend_list; } public void setData_group_friend_list( List<TalkGroupFriend> data_group_friend_list) { this.data_group_friend_list = data_group_friend_list; }}

工具類

public class HuanXinUtil {private static TalkDataService service = null;/** @describe 初始化 @param* @param @return void @author 何章懷曉 hezhanghuaixiao @date 2020/9/8 17:26 @other */private static void init(){if(service == null){// 初始服務(wù)端TokenAuthentic.Token token = new Authentic(new TalkHttpServiceImplApache()).getToken();//token和過期時間Authentic.Token TEST_TOKEN = new Authentic.Token(token.getToken(),token.getExpire());//新建一個鏈接服務(wù)service = new TalkDataServiceImpl(new TalkHttpServiceImplApache());// 修改數(shù)據(jù)業(yè)務(wù)Tokenservice.setToken(TEST_TOKEN);}}/** @describe 添加管理員 @param * @param groupId 群組id * @param userid 管理員id @return boolean @author 何章懷曉 hezhanghuaixiao @date 2020/9/8 17:54 @other */public static boolean addGroupManager(String groupId,String userid) {try {init();TalkNode talkNode = service.addGroupManager(groupId,userid);if(talkNode.getStatusCode()==200){return true;}} catch (Exception e) {e.printStackTrace();}return false;}}

service調(diào)用

@Override public TalkNode addGroupManager(String id, String userId) throws Exception { Map<String, Object> param = new HashMap<String, Object>(); param.put('newadmin', userId); return service.request(_Global.URL_GROUP + '/' + id + '/admin', _Global.HTTP_METHOD_POST, param, auth, TalkNode.DATA_GROUP); }

/** * @param [groupId, managerId] * @return com.hedashi.common.api.CommonResult * @describe 后臺添加群組管理員 * @author 何章懷曉 hezhanghuaixiao * @date 2020/9/8 14:28 * @other */ @Override public CommonResult addGroupManager(String groupId, String managerId) { boolean b = HuanXinUtil.addGroupManager(groupId, managerId); if(b){ System.out.println('環(huán)信添加管理員成功=========================='); //本地添加管理員 addGroupAdmin(groupId,managerId); return CommonResult.success('SUCCESS'); } return CommonResult.failed('FAILED'); }

@ApiOperation(value = '群組添加管理員') @RequestMapping(value = '/addGroupManager', method = RequestMethod.POST) @ResponseBody public CommonResult<HeAdmin> addGroupManager( @RequestParam @ApiParam(value = '群組環(huán)信ID', required = true) String groupId, @RequestParam @ApiParam(value = '管理員環(huán)信id', required = true) String managerId ) { return heUGroupService.addGroupManager(groupId,managerId); }

swagger調(diào)用

java實現(xiàn)即時通信的完整步驟分享

token 信息

{“application”:“53e3eeb5-6926-46dd-bc61-4e214342ef7e”,“access_token”:“YWMtXDS-uPG6EeqItFktBQxljAAAAAAAAAAAAAAAAAAAAAFT4-61aSZG3bxhTiFDQu9-AgMAAAF0bSppWwBPGgBXDkgrlvguBLEe966D_LnbgNyNz2OOsTgP4okhQGoOdA”,“expires_in”:5184000}

swagger返回結(jié)果

java實現(xiàn)即時通信的完整步驟分享

控制臺

java實現(xiàn)即時通信的完整步驟分享

數(shù)據(jù)庫:

java實現(xiàn)即時通信的完整步驟分享

總結(jié)

到此這篇關(guān)于java實現(xiàn)即時通信的文章就介紹到這了,更多相關(guān)java實現(xiàn)即時通信內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
三级亚洲高清视频| 久久亚洲美女| 国产精品久久| 中文字幕视频精品一区二区三区| 中文亚洲欧美| 国产一区成人| 老牛国产精品一区的观看方式| 亚洲免费婷婷| 免费观看不卡av| 9色精品在线| 亚洲视频国产| 日韩激情网站| 久久字幕精品一区| av中文资源在线资源免费观看| 亚洲风情在线资源| 亚洲精品99| 综合亚洲视频| 国产欧美在线| 福利片在线一区二区| 伊人久久高清| 久久不射网站| 国产欧美高清| 日韩国产一区二区| 亚洲网站视频| 午夜视频一区二区在线观看| 国产麻豆一区二区三区| 国产一区二区三区网| 成人久久一区| 亚洲精品看片| 精品国产a一区二区三区v免费| 婷婷综合六月| 蜜桃av一区二区在线观看| 国产日产精品_国产精品毛片| 久久一区欧美| 欧美成人精品| 日韩avvvv在线播放| 国产在线一区不卡| 黑丝一区二区三区| 日本a级不卡| 亚洲综合电影| 丝袜美腿高跟呻吟高潮一区| 国产黄色一区| 性欧美xxxx免费岛国不卡电影| 中文无码日韩欧| 国产亚洲欧美日韩精品一区二区三区 | 国产手机视频一区二区| 午夜性色一区二区三区免费视频| 福利片在线一区二区| 爽好多水快深点欧美视频| 国产精品男女| 成人日韩在线| 天堂av一区| 肉色欧美久久久久久久免费看| 国产一区成人| 精品无人区麻豆乱码久久久 | 国产午夜一区| 1024精品一区二区三区| 婷婷五月色综合香五月| 色乱码一区二区三区网站| 蜜桃一区二区三区在线| 国产资源在线观看入口av| 亚洲三级视频| 91精品xxx在线观看| 亚洲精品乱码| 日韩在线观看| 国产亚洲一区| 视频一区免费在线观看| 水蜜桃精品av一区二区| 四虎精品永久免费| 自拍日韩欧美| 国产欧洲在线| 国产视频一区二区在线播放| 日韩中出av| 四虎4545www国产精品| 91精品国产一区二区在线观看| 日本不良网站在线观看| 久久精品99国产精品| 亚洲一区久久| 波多视频一区| 久久av超碰| 亚洲2区在线| 五月天久久777| 中文字幕人成乱码在线观看| 欧美在线精品一区| 久久国产精品久久w女人spa| 日韩在线中文| 日韩成人精品一区二区| 国产日韩欧美一区二区三区 | 激情国产在线| 国产精品久久久久久av公交车 | 国产欧洲在线| 欧美精品成人| 日韩av不卡一区二区| 午夜在线一区二区| 欧美www视频在线观看| 国产亚洲欧美日韩精品一区二区三区 | 蜜臀久久久99精品久久久久久| 在线天堂中文资源最新版| 国产欧美日韩在线一区二区| 午夜一区在线| 在线亚洲国产精品网站| 亚洲视频综合| 欧美jjzz| 欧美91视频| 欧美99久久| 美女亚洲一区| 亚洲精品97| 亚洲一级特黄| 欧美一区三区| 不卡中文字幕| 亚洲天堂久久| 国产主播一区| 精品一区在线| 欧美日韩精品免费观看视频完整| 秋霞国产精品| 欧美精品一二| 香蕉成人久久| 亚洲在线成人| 视频一区二区三区中文字幕| 黄色日韩在线| 99国产精品| 国产精品美女久久久| 美女久久久久| 亚洲欧美日韩国产综合精品二区| 亚洲综合国产| 午夜天堂精品久久久久| 日韩高清不卡一区二区| 日本色综合中文字幕| 欧美偷窥清纯综合图区| 国产伦理久久久久久妇女| 美女精品久久| 日本精品黄色| 在线日韩一区| 午夜在线视频观看日韩17c| 视频一区二区欧美| 日韩精品一区二区三区中文字幕| 亚洲精品亚洲人成在线观看| 日韩午夜视频在线| 国产精品密蕾丝视频下载| 精品美女在线视频| 精品日韩视频| 老司机精品久久| 欧美午夜三级| 国产成人精品一区二区三区免费 | 国产成人1区| 久久久9色精品国产一区二区三区| 国产日韩电影| 午夜久久一区| 亚欧洲精品视频在线观看| 国产精品亲子伦av一区二区三区| 国产999精品在线观看 | 香蕉成人av| 亚洲欧美不卡| 国产精品一区二区三区四区在线观看| 久久精品亚洲| 亚洲一级网站| 97精品资源在线观看| 成人台湾亚洲精品一区二区| 成人av二区| 欧美亚洲二区| 成人在线免费观看91| 午夜久久一区| 国产精品日本一区二区不卡视频| 欧洲av一区二区| 亚洲精品一二| 国产成人久久精品一区二区三区| 欧美 日韩 国产精品免费观看| 男人的天堂亚洲一区| 国产精品久久777777毛茸茸| 久久久久午夜电影| 日韩精品一区二区三区av| 精品国产鲁一鲁****| 最新亚洲激情| 免费精品一区| 日韩亚洲国产欧美| 国产乱子精品一区二区在线观看| 欧美成人基地| 日韩av在线播放中文字幕| 久久久久久一区二区| 久久不射网站| 国产 日韩 欧美 综合 一区| 伊人久久亚洲美女图片| 国产精品亚洲四区在线观看| 99精品在线免费在线观看| 日韩国产高清在线| 国产福利电影在线播放| 亚洲精品极品| 久久激情一区| 久久超级碰碰| 激情久久久久久| 91嫩草精品| 欧美日韩一区二区三区视频播放| 日韩中出av| 亚洲福利一区| 国产剧情一区二区在线观看| 成人小电影网站| 欧美日韩夜夜| 亚洲综合二区| 日本在线高清| 18国产精品|