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

歡迎訪問 生活随笔!

生活随笔

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

java

java xmpp_Java XMPP负载测试工具

發布時間:2023/12/3 java 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java xmpp_Java XMPP负载测试工具 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

java xmpp

在本文中,我們將開發用Java編寫的XMPP負載測試工具。

目錄

1.簡介 2. XMPP負載測試工具 3.先決條件 4. LoadXmppTest Java程序
4.1。 創建一個新的Maven項目 4.2。 創建主類 4.3。 XmppManager類 4.4。 建立 4.5。 負載測試
5.總結 6.參考 7.下載Maven項目

1.簡介

可擴展消息傳遞和狀態協議XMPP )是基于XML(可擴展標記語言)的面向消息的中間件的通信協議。 它是由Internet工程任務組 (IETF) 標準化并由XMPP標準基金會 (XSF)支持和擴展的開放協議。 XMPP是在開放標準中定義的,并使用開放系統的開發和應用方法。 因此,許多服務器,客戶端和庫的實現都以自由和開源軟件的形式分發。 XMPP擴展協議 (XEP)中還定義了許多擴展。

IgniteRealtime發行的一種免費的開源發行版提供了以下實現:

  • Openfire聊天服務器
  • Spark聊天客戶端
  • XMPP協議的Smack Java庫

Spark是類似于Messenger,What's app,Viber或Google Talk(實際上后者使用XMPP協議)的聊天客戶端應用程序。 一個人可以發送聊天消息,文件作為附件等。這些消息被發送到Openfire服務器,然后由其負責將它們傳遞到目的地,該服務器可以是直接與其連接的另一個Spark(或其他)聊天客戶端,也可以是另一個Openfire。實例(聯盟),直到他們到達最終目的地。

但是,服務器和客戶端在負載下的性能如何,即當它們必須處理許多聊天消息或許多文件傳輸時?

2. XMPP負載測試工具

存在許多解決方案來對XMPP服務器(例如Openfire)進行負載/壓力測試(列表并不詳盡):

  • 帶有XMPP協議支持插件的Apache JMeter(請參閱[1,2])
  • iksemel XMPP C庫
  • Tsung ,一種開源的多協議分布式負載測試工具

在本文中,我們將使用Smack XMPP庫編寫Java XMPP負載測試工具。

3.先決條件

您需要在系統上下載并安裝Openfire 。 要嘗試我們的負載測試工具,使用嵌入式數據庫就足夠了,即使您需要記住嵌入式數據庫(HSQLDB)將在一段時間后填滿。 當然,推薦使用真實的RDBMS。

您必須創建許多用戶,這些用戶將模擬用戶消息交換負載。 在我們的示例中,我們將創建50個用戶名,用戶名分別為user001到user050并具有相同的密碼a 。 如果您不知道該怎么做,請登錄管理控制臺(例如http:// localhost:9090或https:// localhost:9091 ),然后單擊“ 用戶/組”選項卡;然后單擊“確定”。 在那里,您可以單擊創建新用戶來創建用戶。

由于創建大量用戶非常繁瑣,因此有幾個插件可以節省您的時間。 單擊Openfire管理控制臺的“ 插件”標簽,然后單擊“ 可用插件”并安裝“ 用戶創建”和/或“ 用戶導入/導出”插件。 如果現在單擊返回到“ 用戶/組”選項卡,您將看到已創建新鏈接; 用戶創建 (由于用戶創建插件)和導入和導出 (由于用戶導入/導出插件)。 剩下的練習是找出它們如何工作。

但是,這些并不是唯一需要做的更改。 在最新版本的Openfire中,安全機制已更改,因此要使我們的程序正常運行,我們需要定義兩個屬性。 單擊服務器選項卡, 服務器管理器->系統屬性,然后在頁面底部輸入以下屬性名稱/值對:

sasl.mechs.00001 PLAIN
sasl.mechs.00002 DIGEST-MD5

4. LoadXmppTest Java程序

我們將創建的工具是一個使用smack庫的Java程序。 它提供了命令行界面(CLI),但是如果發現有用,則可以為其編寫圖形用戶界面(GUI)。

$ java -Djava.util.logging.config.file=logging.properties -jar loadxmpptest.jar Required options: s, d, p, n usage: java -Djava.util.logging.config.file=logging.properties –jar loadxmpptest.jar -a,--attachment Test attachments -b,--big Test big attachments or messages -d,--domain Domain -n,--number Number of users -o,--observer Observer -p,--password Password -s,--server Server Usage : java -Djava.util.logging.config.file=logging.properties -jar loadxmpptest.jar -s -d -p -n [-o ] [-a] [-b]jabber id : userXXX@chatroom : roomXXX@conference.observer : userXXX@/Spark (just to test)10 users per chatroom5 chatrooms Use:-a to test small attachments (file transfers) or-a -b to test big attachments (file transfers) or:-b to test long messages

此外, loadxmpptest.properties允許進一步配置測試應用程序:

SHORT_MESSAGES_DELAY_SECONDS = 100 LONG_MESSAGES_DELAY_SECONDS = 60 SMALL_ATTACHMENTS_DELAY_MINUTES = 1 BIG_ATTACHMENTS_DELAY_MINUTES = 5 DELAY_TO_SEND_MESSAGES_MILLISECONDS = 1000 BIG_FILE_NAME_PATH=blob.txt SMALL_FILE_NAME_PATH=test.txt

日志存儲在log/loadxmpptest.log ,可以通過編輯logging.properties進行配置。

這是一個執行示例,其中服務器為localhost ,域為localhost (可以是其他名稱),使用相同的密碼a模擬了50個用戶:

java -Djava.util.logging.config.file=logging.properties -jar loadxmpptest.jar -s localhost -d localhost -p a -n 50

另一個例子,這次發送大型附件:

java -Djava.util.logging.config.file=logging.properties -jar loadxmpptest.jar -s localhost -d localhost -p a -n 50 -ba

如上所述,要在loadxmpptest.properties中配置要發送的文件。

4.1創建一個新的Maven項目

跳到您最喜歡的IDE并創建一個新的Maven項目。 將以下依賴項添加到pom.xml :

<dependencies><dependency><groupId>org.igniterealtime.smack</groupId><artifactId>smack-core</artifactId><version>4.3.4</version></dependency><dependency><groupId>org.igniterealtime.smack</groupId><artifactId>smack-tcp</artifactId><version>4.3.4</version></dependency><dependency><groupId>org.igniterealtime.smack</groupId><artifactId>smack-im</artifactId><version>4.3.4</version></dependency> <dependency><groupId>org.igniterealtime.smack</groupId><artifactId>smack-extensions</artifactId><version>4.3.4</version></dependency><dependency><groupId>org.igniterealtime.smack</groupId><artifactId>smack-java7</artifactId><version>4.3.4</version></dependency><dependency><groupId>org.igniterealtime.smack</groupId><artifactId>smack-debug</artifactId><version>4.3.4</version></dependency><dependency><groupId>commons-cli</groupId><artifactId>commons-cli</artifactId><version>1.4</version></dependency> </dependencies>

這些是撰寫本文時的最新版本,但是您可以使用在Maven Central中可能找到的最新版本。

4.2創建主類

該程序由基于[10]的兩個類組成。 XmppLoadTest包含main()方法,并委托XmppManager來完成工作(與現實相反,因為規范是經理委托而不是實際進行工作:))。

public static void main(String[] args) throws Exception {parseCLIArguments(args);final XmppLoadTest loadXmppTest = new XmppLoadTest();loadProperties(PROPERTIES_FILE);init(loadXmppTest);performLoad(loadXmppTest); }

我將跳過parseCLIArguments()方法的描述。 它使用Apache Commons CLI庫來解析命令行參數(請參見[4])。 您可以根據需要選擇其他任何CLI庫或創建GUI。

我們的測試模擬了50個用戶和5個聊天室(您可以模擬自己的方案來滿足您的需求)。 這些存儲在:

private static final List<User> users = new ArrayList< >(numberOfUsers); private static final List<ChatRoom> chatRooms = new ArrayList< >(numberOfRooms);

類User和ChatRoom的定義如下:

/*** User (e.g. {@code user001}). Functionality delegated to @{see* XmppManager}.*/ final class User {private final String username;private final String password;private final String domain;private final XmppManager xmppManager; // delegate to itprivate MultiUserChat joinedChatRoom;public User(String username, String password, String domain, XmppManager xmppManager) {this.username = username;this.password = password;this.domain = domain;this.xmppManager = xmppManager;}public String getUsername() { return username; }public String getPassword() { return password; }public String getJabberID() { return username + "@" + domain; }public void connect() {xmppManager.connect();}public void disconnect() {xmppManager.destroy();LOG.info("User " + username + " disconnected.");}public void login() {xmppManager.login(username, password);}public void setStatus(boolean available, String status) {xmppManager.setStatus(available, status);}public void sendMessage(String toJID, String message) {xmppManager.sendMessage(toJID, message);}public void receiveMessage() {xmppManager.receiveMessage();}public void sendAttachment(String toJID, String path) {xmppManager.sendAttachment(toJID, "Smack", path);}public void receiveAttachment() {xmppManager.receiveAttachment(username);}public void joinChatRoom(String roomName, String nickname) {joinedChatRoom = xmppManager.joinChatRoom(roomName, nickname);}public void leaveChatRoom() {try {joinedChatRoom.leave();} catch (SmackException.NotConnectedException | InterruptedException ex) {LOG.severe(ex.getLocalizedMessage());}}public void sendMessageToChatRoom(String message) {xmppManager.sendMessageToChatRoom(joinedChatRoom, message);}public String getJoinedChatRoom() {return joinedChatRoom.getRoom().toString();}public void addRosterListener() {xmppManager.rosterChanged();}}/*** Chat room, e.g. {@code room001}*/final class ChatRoom {private final String name;private final String domain;public ChatRoom(String name, String domain) {this.name = name;this.domain = domain;}public String getName() {return name + "@conference." + domain;}}

ChatRoom類很簡單。 聊天室被標識為例如room001@conference.localhost ,其中conference是您在單擊Group Chat- > Group Chat Settings時在Openfire管理員控制臺中定義的子域,而localhost是我們通過命令行參數-d傳遞的域。 getName()返回的String是房間的裸JID ,我們將在后面看到。

User類更為復雜。 它需要一個username ,一個password和一個domain并委托給XmppManager ,我們將很快看到。

XMPP客戶端的地址格式為user@server.com ,其中user是用戶名 , server.com是域 。 XMPP中的節點地址稱為Jabber ID,縮寫為JID 。 JID也可以具有資源 ( user@server.com/resource ),這意味著用戶可以從多個設備連接。 格式為user@server.com JID稱為裸JID ,而格式為user@server.com/resource的JID稱為完整JID 。

用戶可以setStatus() connect()到Openfire服務器,然后再login() ,然后用戶可以setStatus() , sendMessage()/receiveMesage(), sendAttachment()/receiveAttachment(), joinChatRoom()/leaveChatRoom()和sendMessageToChatRoom() 。

init()方法初始化XmppManager()并創建50個用戶,每個用戶連接,登錄并將其狀態設置為available 。 如果要測試文件傳輸,則每個用戶都開始收聽文件傳輸。 也創建了五個聊天室。 50個用戶中的每個用戶都分配到一個聊天室,因此最后,每個聊天室都包含10個用戶。

private static void init(XmppLoadTest loadXmppTest) {XmppManager xmppManager = new XmppManager(server, domain, port);for (int i = 1; i <= numberOfUsers; i++) {User user = loadXmppTest.new User("user" + String.format("%03d", i), password, domain, xmppManager);user.connect();user.login();user.setStatus(true, "Hello from " + user.getUsername());users.add(user);if (testAttachments || testBigAttachments) {user.receiveAttachment();}}for (int i = 0; i < numberOfRooms; i++) {chatRooms.add(loadXmppTest.new ChatRoom("room" + String.format("%03d", i + 1), domain));}if (!testAttachments && !testBigAttachments) {// join chatroomsfor (int i = 1; i <= numberOfUsers; i++) {ChatRoom chatRoom = chatRooms.get((i - 1) % numberOfRooms);User user = users.get(i - 1);user.joinChatRoom(chatRoom.getName(), user.getJabberID());}} }

一種方案是讓每個user連接到五個聊天室之一并發送消息。 任務被創建( chatRoomMessageTask )在performLoad()和每執行every取決于消息的類型秒( 長或短 )作為配置loadxmpptest.properties 。

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); ....} else { // send messages to chat roomsfinal Runnable task = () -> {while (true) {if (Thread.currentThread().isInterrupted()) {return;}loadXmppTest.chatRoomMessageTask();}};int every = testLongMessages ? longMessagesDelayInSeconds : shortMessagesDelayInSeconds;scheduler.scheduleWithFixedDelay(task, 0, every, SECONDS); // every x seconds }

另一種情況是將附件發送給另一個用戶,而不是將消息發送到聊天室:

if (testAttachments || testBigAttachments) { // send attachmentsString filePath = testBigAttachments ? bigFileNamePath : smallFileNamePath;int delay = testBigAttachments ? bigAttachmentsDelayInMinutes : smallAttachmentsDelayInMinutes;final Runnable task = () -> {while (true) {if (Thread.currentThread().isInterrupted()) {return;}loadXmppTest.fileTransferTask(filePath);}};scheduler.scheduleWithFixedDelay(task, 0, delay, MINUTES);

當然,您可以將兩種情況結合起來,但是您需要確保不會溢出Openfire的緩存。

/** Each user sends a message to a chat room. */ private synchronized void chatRoomMessageTask() {for (int i = 1; i <= numberOfUsers; i++) {String message = testLongMessages ? LONG_MESSAGE : MESSAGE;User user = users.get(i - 1);try {Thread.currentThread().sleep(delayToSendMessagesInMillis); // sleep 1"user.sendMessageToChatRoom(message);LOG.info(user.getJabberID() + " sent " + (testLongMessages ? "long" : "short") + " message to " + user.getJoinedChatRoom());} catch (InterruptedException ie) {Thread.currentThread().interrupt(); // reset the flag}} }

在上述方法(稱為第一種情況)中,每個用戶向該用戶加入的聊天室發送一條消息(短消息或長消息)。

在fileTransferTask() ,每個用戶將附件發送給另一個用戶(避免將附件發送給自己)。 請注意此方法和先前方法中的synchronized關鍵字,以避免代碼中出現死鎖。

/*** Exchange file attachments between users.** @param path path of the file to send* @see #transferFile(int, java.lang.String)*/ private void fileTransferTask(String path) {for (int i = 1; i <= numberOfUsers; i++) {transferFile(i, path);} } /*** Transfer the file to all other users.** @param i i-th user* @param path path of the file to be sent*/ private synchronized void transferFile(int i, String path) {int j;for (j = 1; j <= numberOfUsers; j++) {if (i != j) {try {int delay = testBigAttachments ? bigAttachmentsDelayInMinutes : smallAttachmentsDelayInMinutes;Thread.currentThread().sleep(delay); if (users.get(i - 1).sendAttachment(users.get(j - 1).getJabberID(), path)) {LOG.info("Attachment " + path + " sent from " + users.get(i - 1).getJabberID() + " to " + users.get(j - 1).getJabberID());} else {LOG.severe("Attachment " + path + " from " + users.get(i - 1).getJabberID() + " to " + users.get(j - 1).getJabberID() + " was not sent!");}} catch (InterruptedException ie) {Thread.currentThread().interrupt(); // reset the flag}}} }

這樣就完成了XmppLoadTest類的描述。

4.3 XmppManager類

XmppManager類使用smack庫[6,7]與Openfire服務器進行通信。 Smack是用于與XMPP服務器通信以執行實時通信(包括即時消息傳遞和群聊)的庫。

XmppManager與[10]中的類似,但是直到那時事情已經發生了發展,API也發生了變化。 如前所述, User委托給XmppManager 。

4.3.1連接到Openfire

要連接到Openfire服務器,您需要托管Openfire 的服務器名稱 , 域和端口 (已固定: 5222 )。 XMPPTCPConnection類用于創建與XMPP服務器的連接。 可以使用XMPPTCPConnectionConfiguration.Builder配置其他連接參數:

private String resource = "Smack"; ... XMPPTCPConnectionConfiguration.Builder builder = XMPPTCPConnectionConfiguration.builder(); try {builder.setXmppDomain(JidCreate.domainBareFrom(domain)).setHost(server).setPort(port).setResource(resource).setSecurityMode(SecurityMode.disabled).setHostnameVerifier((String hostname, SSLSession session) -> true); } catch (XmppStringprepException ex) {LOG.severe(ex.getLocalizedMessage()); } try {builder = TLSUtils.acceptAllCertificates(builder); } catch (KeyManagementException | NoSuchAlgorithmException ex) {LOG.log(Level.SEVERE, null, ex); } XMPPTCPConnection.setUseStreamManagementDefault(true); XMPPTCPConnectionConfiguration config = builder.build();

resource String對于文件傳輸很重要。 如果您使用的是smack,則可以是"Smack"或"Resource" 。 如果使用其他客戶端,例如Spark,則可以將其設置為"Spark ”。它可以確定將文件發送到的資源。

//SASLMechanism mechanism = new SASLDigestMD5Mechanism(); SASLMechanism mechanism = new SASLPlainMechanism(); SASLAuthentication.registerSASLMechanism(mechanism); SASLAuthentication.unBlacklistSASLMechanism("PLAIN"); SASLAuthentication.blacklistSASLMechanism("SCRAM-SHA-1"); SASLAuthentication.unBlacklistSASLMechanism("DIGEST-MD5"); try {builder = TLSUtils.acceptAllCertificates(builder); } catch (KeyManagementException | NoSuchAlgorithmException ex) {LOG.severe(ex.getLocalizedMessage()); } XMPPTCPConnection.setUseStreamManagementDefault(true); XMPPTCPConnectionConfiguration config = builder.build();

TLSUtils.acceptAllCertificates(builder); 這一點很重要,因為最新版本的Openfire中的安全模型已更改。 因此,我們在Openfire的管理控制臺中添加了sasl.mechs.00001和sasl.mechs.00002 。 如果他仍然遇到連接/身份驗證問題,則此鏈接可能有幫助。

4.3.2登錄

配置與Openfire的連接后,就可以連接到它了:

private AbstractXMPPConnection connection; ... connection = new XMPPTCPConnection(config); connection.setReplyTimeout(1000L); try {connection.connect(); } catch (SmackException | IOException | XMPPException | InterruptedException ex) {LOG.severe(ex.getLocalizedMessage()); }

默認情況下,如果突然斷開連接,Smack將嘗試重新連接。 重新連接管理器將嘗試立即重新連接到服務器,并增加嘗試之間的延遲,因為連續的重新連接始終會失敗。 創建連接后,用戶應使用其憑據使用XMPPConnection.login()方法登錄:

public void login(String username, String password) {if (connection != null && connection.isConnected()) {try {connection.login(username, password);} catch (XMPPException | SmackException | IOException | InterruptedException ex) {LOG.severe(ex.getLocalizedMessage());}}LOG.info(username + " authenticated? " + connection.isAuthenticated()); }

4.3.3在場和名冊

用戶登錄后,可以通過創建新的Chat或MultiUserChat對象開始與其他用戶Chat 。 用戶還可以將其狀態設置為可用 :

public void setStatus(boolean available, String status) {Presence.Type type = available ? Type.available : Type.unavailable;Presence presence = new Presence(type);presence.setStatus(status);try {connection.sendStanza(presence);} catch (SmackException.NotConnectedException | InterruptedException ex) {LOG.severe(ex.getLocalizedMessage());} }

從客戶端到XMPP服務器的每條消息稱為數據包或節,并以XML的形式發送。 節是客戶端可以在一個程序包中發送給服務器的最小XML數據段,反之亦然。 org.jivesoftware.smack.packet Java軟件包包含一些類,這些類封裝了XMPP允許的三種不同的基本數據包類型( message , 狀態和IQ )。 這些節中的每個節由XMPP服務器和客戶端以不同的方式處理。 節具有類型屬性 ,這些可用于進一步區分節[3]。

消息 節旨在用于在XMPP實體之間發送數據。 實在是忘了,也就是說,接收方不承認節。 通常,當您從客戶端發送消息節并且未生成任何類型的錯誤時,可以假定消息已成功發送。 消息節的類型可以為“聊天”,“ groupchar”,“錯誤”等。

狀態節會通告其他實體的在線狀態(網絡可用性)。 在線狀態類似于XMPP中的訂閱。 當您對某些JID的存在感興趣時,您就訂閱它們的存在,即,您告訴XMPP服務器“每次該JID向您發送狀態更新時,我都希望收到通知”。 當然,服務器會詢問JID持有者是否接受向您透露其在線信息。 當他們接受后,服務器會記住他們的決定,并在更改在線狀態時更新訂閱該狀態的任何人。 術語“ 存在”還表示用戶是否在線。

最后, IQ (信息/查詢)節用于從服務器獲取一些信息(例如,有關服務器或其注冊客戶端的信息)或將某些設置應用于服務器。

在XMPP中,術語名冊用于指聯系人列表。 用戶的聯系人列表通常存儲在服務器上。 該名冊使您可以跟蹤其他用戶的可用性(狀態)。 可以將用戶分為“朋友”和“同事”之類的組,然后您會發現每個用戶是聯機還是脫機。 Roster類允許您查找所有名單條目,它們所屬的組以及每個條目的當前狀態。

名冊中的每個用戶都由RosterEntry表示,該成員包括:

  • XMPP地址(例如john@example.com )。
  • 您分配給用戶的名稱(例如"John" )。
  • 條目所屬的名冊中的組的列表。 如果名冊條目不屬于任何組,則稱為“未歸檔條目”。

在名單中的每個條目都有一個與之關聯的存在 。 Roster.getPresence(String user)方法將返回一個具有用戶狀態的Presence對象;如果用戶不在線或您尚未訂閱該用戶的狀態,則返回null 。 用戶要么在線要么離線 。 當用戶在線時,他們的存在可能包含擴展信息,例如他們當前正在做什么,是否希望受到打擾等。

public Roster createRosterFor(String user, String name) throws Exception {LOG.info(String.format("Creating roster for buddy '%1$s' with name %2$s", user, name));Roster roster = Roster.getInstanceFor(connection);roster.createEntry(JidCreate.bareFrom(user), name, null);return roster; } public void printRosters() throws Exception {Roster roster = Roster.getInstanceFor(connection);Collection entries = roster.getEntries();for (RosterEntry entry : entries) {LOG.info(String.format("Buddy: %s", entry.getName()));} } public void rosterChanged() {Roster roster = Roster.getInstanceFor(connection);roster.addRosterListener(new RosterListener() {@Overridepublic void presenceChanged(Presence presence) {LOG.info("Presence changed: " + presence.getFrom() + " " + presence);resource = presence.getFrom().getResourceOrEmpty().toString();}@Overridepublic void entriesAdded(Collection clctn) { }@Overridepublic void entriesUpdated(Collection clctn) { }@Overridepublic void entriesDeleted(Collection clctn) { }}); }

狀態信息可能會經常更改,并且名冊條目也可能會更改或刪除。 要偵聽更改的花名冊和狀態數據,請使用RosterListener 。 為了通知有關名冊的所有更改,應在登錄XMPP服務器之前注冊RosterListener 。 文件傳輸知道,如果收件人的資源發生了變化,所描述的是很重要的位置 。

4.3.4聊天和多聊

您可以在ChatManager的幫助下發送和接收聊天消息。 盡管可以將單個消息作為數據包發送和接收,但是使用org.jivesoftware.smack.chat2.Chat類將消息字符串視為聊天通常會更容易。 聊天會在兩個用戶之間創建新的消息線程。 Chat.send(String)方法是一種便捷方法,它創建一個Message對象,使用String參數設置正文,然后發送消息。

/*** Send message to another user.** @param buddyJID recipient* @param message to send*/ public void sendMessage(String buddyJID, String message) {LOG.info(String.format("Sending message '%1$s' to user %2$s", message, buddyJID));try {Chat chat = ChatManager.getInstanceFor(connection).chatWith(JidCreate.entityBareFrom(buddyJID));chat.send(message);} catch (XmppStringprepException | SmackException.NotConnectedException | InterruptedException ex) {LOG.severe(ex.getLocalizedMessage());} } public void receiveMessage() {ChatManager.getInstanceFor(connection).addIncomingListener((EntityBareJid from, Message message, Chat chat) -> {LOG.info("New message from " + from + ": " + message.getBody());}); }

要加入聊天室( MultiUserChat )并向其中發送消息:

public MultiUserChat joinChatRoom(String roomName, String nick) {try {MultiUserChatManager manager = MultiUserChatManager.getInstanceFor(connection);MultiUserChat muc = manager.getMultiUserChat(JidCreate.entityBareFrom(roomName));Resourcepart nickname = Resourcepart.from(nick);muc.join(nickname);LOG.info(muc.getNickname() + "joined chat room " + muc.getRoom());return muc;} catch (XmppStringprepException | SmackException.NotConnectedException | InterruptedException | SmackException.NoResponseException | XMPPException.XMPPErrorException | MultiUserChatException.NotAMucServiceException ex) {LOG.severe(ex.getLocalizedMessage());}return null; }public void sendMessageToChatRoom(MultiUserChat muc, String message) {try {muc.sendMessage(message);LOG.fine("Message '" + message + "' was sent to room '" + muc.getRoom() + "' by '" + muc.getNickname() + "'");} catch (InterruptedException | SmackException.NotConnectedException ex) {LOG.severe(ex.getLocalizedMessage());} }

您可以在加入聊天室時定義昵稱。

4.3.5文件傳輸

要發送/接收附件,它比較復雜(請參見此處 ):

/*** File transfer.** @param buddyJID recipient* @param res e.g. "Spark-2.8.3", default "Smack" (cannot be empty or null)* @param path path of the file attachment to send* @return {@code true} if file transfer was successful*/ public boolean sendAttachment(String buddyJID, String res, String path) {LOG.info(String.format("Sending attachment '%1$s' to user %2$s", path, buddyJID));FileTransferManager fileTransferManager = FileTransferManager.getInstanceFor(connection);FileTransferNegotiator.IBB_ONLY = true;OutgoingFileTransfer fileTransfer = null;try {fileTransfer = fileTransferManager.createOutgoingFileTransfer(JidCreate.entityFullFrom(buddyJID + "/Spark-2.8.3"));} catch (XmppStringprepException ex) {LOG.log(Level.SEVERE, null, ex);return false;}if (fileTransfer != null) {OutgoingFileTransfer.setResponseTimeout(15 * 60 * 1000);LOG.info("status is:" + fileTransfer.getStatus());File file = Paths.get(path).toFile();if (file.exists()) {try {fileTransfer.sendFile(file, "sending attachment...");} catch (SmackException ex) {LOG.severe(ex.getLocalizedMessage());return false;}LOG.info("status is:" + fileTransfer.getStatus());if (hasError(fileTransfer)) {LOG.severe(getErrorMessage(fileTransfer));return false;} else {return monitorFileTransfer(fileTransfer, buddyJID);}} else try {throw new FileNotFoundException("File " + path + " not found!");} catch (FileNotFoundException ex) {LOG.severe(ex.getLocalizedMessage());return false;}}}return true; }/*** Monitor file transfer.** @param fileTransfer* @param buddyJID* @return {@code false} if file transfer failed.*/ private boolean monitorFileTransfer(FileTransfer fileTransfer, String buddyJID) {while (!fileTransfer.isDone()) {if (isRejected(fileTransfer) || isCancelled(fileTransfer)|| negotiationFailed(fileTransfer) || hasError(fileTransfer)) {LOG.severe("Could not send/receive the file to/from " + buddyJID + "." + fileTransfer.getError());LOG.severe(getErrorMessage(fileTransfer));return false;} else if (inProgress(fileTransfer)) {LOG.info("File transfer status: " + fileTransfer.getStatus() + ", progress: " + fileTransfer.getProgress());}try {Thread.sleep(1000);} catch (InterruptedException ex) {LOG.severe(ex.getLocalizedMessage());}}if (isComplete(fileTransfer)) {LOG.info(fileTransfer.getFileName() + " has been successfully transferred.");LOG.info("The file transfer is " + (fileTransfer.isDone() ? "done." : "not done."));return true;}return true; }public void receiveAttachment(String username) {final FileTransferManager manager = FileTransferManager.getInstanceFor(connection);manager.addFileTransferListener((FileTransferRequest request) -> {// Check to see if the request should be acceptedif (request.getFileName() != null) {StringBuilder sb = new StringBuilder(BUFFER_SIZE);try {// Accept itIncomingFileTransfer transfer = request.accept();String filename = transfer.getFileName() + "_" + username;transfer.receiveFile(new File(filename));while (!transfer.isDone()) {try {Thread.sleep(1000);LOG.info("STATUS: " + transfer.getStatus()+ " SIZE: " + sb.toString().length()+ " Stream ID : " + transfer.getStreamID());} catch (Exception e) {LOG.severe(e.getMessage());}if (transfer.getStatus().equals(FileTransfer.Status.error)) {LOG.severe(transfer.getStatus().name());}if (transfer.getException() != null) {LOG.severe(transfer.getException().getLocalizedMessage());}}LOG.info("File received " + request.getFileName());} catch (SmackException | IOException ex) {LOG.severe(ex.getLocalizedMessage());}} else {try {// Reject itrequest.reject();LOG.warning("File rejected " + request.getFileName());} catch (SmackException.NotConnectedException | InterruptedException ex) {LOG.severe(ex.getLocalizedMessage());}}}); }

Openfire中定義了3種類型的文件傳輸 :

  • 帶內 ( FileTransferNegotiator.IBB_ONLY ),其中消息被分解為多個塊并作為編碼消息發送。 它速度較慢,但??始終有效。 此外,由于交換的消息存儲在Openfire數據庫中,因此備份起來更容易。
  • 當兩個用戶都在同一網絡上時, 對等 (p2p)效果很好,但是當一個用戶在防火墻后面或使用NAT時, 對等 (p2p)失敗。 它速度更快,除了上述問題之外,您還無法控制要交換的內容。
  • 代理服務器 (SOCKS5,請參閱XEP-0096或更新的XEP-0234 )使用文件傳輸代理,但需要打開端口7777。它比p2p慢,但比帶內快。

在我們的測試工具中,正在使用帶內文件傳輸。

一旦成功發送文件,就需要監視其狀態( monitorFileTransfer() )。 可能存在網絡錯誤,或者收件人可能只是拒絕文件傳輸。 實際上,其他用戶可以選擇接受,拒絕或忽略文件傳輸請求。

發送附件是OutgoingFileTransfer ,而接收是IncomingFileTransfer 。 這是通過將偵聽器添加到FileTransferManager來實現的。 如前所述,接收者需要在發送者發送文件之前開始偵聽。 此外,在我們的負載測試中,正在發送和接收相同的文件。 為了避免覆蓋同一文件,源文件以不同的名稱存儲,在文件名中添加"_"和收件人的名稱。 當然,這些文件名在負載測試工具運行時會一次又一次地寫入。

建立

為了能夠執行負載測試工具,您需要創建一個可執行文件XmppLoadTest-1.0.jar 。 一種方法是將以下內容添加到pom.xml中:

<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>3.2.0</version><configuration><archive><manifest><addClasspath>true</addClasspath><mainClass>test.xmpp.xmpploadtest.XmppLoadTest</mainClass></manifest></archive></configuration></plugin></plugins> </build>

并且還需要將依賴項包括到classpath中 。 或者,您可以使用依賴項插件來創建一個單個jar ,該jar可以創建此處所述的所有內容。

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><version>3.2.0</version><configuration><archive><manifest><mainClass>test.xmpp.xmpploadtest.XmppLoadTest</mainClass></manifest></archive><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs></configuration><executions><execution><id>make-assembly</id> <!-- this is used for inheritance merges --><phase>package</phase> <!-- bind to the packaging phase --><goals><goal>single</goal></goals></execution></executions> </plugin>

您也可以使用maven命令代替執行它:

mvn exec:java -Dexec.mainClass=test.xmpp.xmpploadtest.XmppLoadTest "-Dexec.args=-s localhost -d localhost -p a -n 50"

4.5負載測試

一旦執行了負載測試工具,您將看到許多發送到Openfire服務器的消息。 根據您選擇的方案(群聊或文件傳輸),如果您使用第50個用戶(例如Spark)之類的聊天客戶端進行連接并加入聊天室,您將看到他們被重復發送的相同消息所填充其他49個模擬用戶。

Apr 25, 2020 11:55:16 PM test.xmpp.xmpploadtest.XmppManager connect INFO: Initializing connection to server localhost port 5222 Apr 25, 2020 11:55:18 PM test.xmpp.xmpploadtest.XmppManager connect INFO: Connected: true Apr 25, 2020 11:55:18 PM test.xmpp.xmpploadtest.XmppManager login INFO: user001 authenticated? True ... Apr 25, 2020 11:55:21 PM test.xmpp.xmpploadtest.XmppManager joinChatRoom INFO: user001@localhost joined chat room room001@conference.localhost Apr 25, 2020 11:55:21 PM test.xmpp.xmpploadtest.XmppManager joinChatRoom INFO: user002@localhost joined chat room room002@conference.localhost ... Apr 25, 2020 11:55:24 PM test.xmpp.xmpploadtest.XmppLoadTest chatRoomMessageTask INFO: user001@localhost sent short message to room001@conference.localhost Apr 25, 2020 11:55:25 PM test.xmpp.xmpploadtest.XmppLoadTest chatRoomMessageTask INFO: user002@localhost sent short message to room002@conference.localhost ...

在user050情況下運行該工具時,您不會在Spark或以user050連接到的聊天客戶端中看到任何附件。

INFO: Sending attachment 'test.txt' to user user003@localhost [Sun May 10 17:55:15 CEST 2020] INFO: status is:Initial [Sun May 10 17:55:15 CEST 2020] INFO: status is:Initial [Sun May 10 17:55:15 CEST 2020] INFO: STATUS: Complete SIZE: 0 Stream ID : jsi_2604404248040129956 [Sun May 10 17:55:15 CEST 2020] INFO: File received test.txt [Sun May 10 17:55:15 CEST 2020] INFO: STATUS: In Progress SIZE: 0 Stream ID : jsi_4005559316676416776 [Sun May 10 17:55:16 CEST 2020] WARNING: Closing input stream [Sun May 10 17:55:16 CEST 2020] INFO: STATUS: In Progress SIZE: 0 Stream ID : jsi_6098909703710301467 [Sun May 10 17:55:16 CEST 2020] INFO: STATUS: In Progress SIZE: 0 Stream ID : jsi_2348439600749627884 [Sun May 10 17:55:16 CEST 2020] INFO: STATUS: In Progress SIZE: 0 Stream ID : jsi_8708250841661514027 [Sun May 10 17:55:16 CEST 2020] INFO: STATUS: In Progress SIZE: 0 Stream ID : jsi_2119745768373873364 [Sun May 10 17:55:16 CEST 2020] INFO: STATUS: In Progress SIZE: 0 Stream ID : jsi_6583436044582265363 [Sun May 10 17:55:16 CEST 2020] INFO: STATUS: In Progress SIZE: 0 Stream ID : jsi_3738252107587424431 [Sun May 10 17:55:16 CEST 2020] INFO: STATUS: In Progress SIZE: 0 Stream ID : jsi_4941117510857455094 [Sun May 10 17:55:16 CEST 2020] INFO: test.txt has been successfully transferred. [Sun May 10 17:55:16 CEST 2020] INFO: The file transfer is done. [Sun May 10 17:55:16 CEST 2020]

一旦運行了加載/壓力工具,就可以搜索XMPP服務器或客戶端的內存泄漏或CPU使用率過高。 您可以使用VisualVM之類的工具來監視內存和CPU,或者甚至可以根據需要使用YourKit或Java Flight Recorder之類的工具進行概要分析。

5.總結

在本教程中,我們學習了如何編寫自己的負載測試工具來對XMPP服務器(如Openfire)進行負載/壓力測試。 負載/壓力工具還可以用于測試XMPP客戶端(例如Spark)。 如果您編寫了自己的XMPP客戶端或服務器,那么它也可以用于測試它們。 該工具使用Smack XMPP庫以Java編寫。 它可以在兩種模式或場景下運行,既可以將消息發送到聊天室,也可以在用戶之間發送文件傳輸。 XMPP服務器需要使用模擬用戶和聊天室進行預配置。

您可以根據需要進行自定義,進一步擴展源代碼,例如用戶數量,消息或文件附件的大小,消息之間的延遲,發送消息和文件傳輸的組合或測試XMPP的其他方面協議。

6.參考

  • Aladev R.(2017a),“ XMPP負載測試–最終指南 ”。
  • Aladev R.(2017b),“ XMPP負載測試–高級方案 ”。
  • Gakwaya D.(2016),“ XMPP的友好介紹 ”。
  • Marx D.(2017),“ Java命令行界面(第1部分):Apache Commons CLI ”,JavaCodeGeeks。
  • Saint-Andre P.,Smith K.,Troncon R.(2009年), XMPP:權威指南 ,O'Reilly。
  • Smack API
  • 打擊文件
  • Tsagklis I.(2010a),“ Openfire服務器安裝-即時消息基礎結構 ”,JavaCodeGeeks。
  • Tsagklis I.(2010b),“ Openfire服務器配置-即時消息基礎結構 ”,JavaCodeGeeks。
  • Tsagklis I.(2010c),“ 帶有適用于Java應用程序的Smack的XMPP IM –即時消息基礎結構 ”,JavaCodeGeeks。
  • 7.下載Maven項目

    那是一篇有關Java XMPP負載測試工具的文章。

    下載
    您可以在此處下載完整的源代碼: Java XMPP負載測試工具

    翻譯自: https://www.javacodegeeks.com/java-xmpp-load-test-tool.html

    java xmpp

    總結

    以上是生活随笔為你收集整理的java xmpp_Java XMPP负载测试工具的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    久久不见久久见免费影院 | 欧美日韩亚洲第一页 | 久久这里只有精品视频99 | 91在线色| 国产一区欧美在线 | 香蕉精品视频在线观看 | 国产视频精品久久 | 久久国产精品久久精品国产演员表 | 国产va饥渴难耐女保洁员在线观看 | 天天摸天天舔 | www国产一区 | 色综合a | 免费日韩三级 | 国产高清亚洲 | 一本一道久久a久久精品 | 黄网站色视频 | 日本中文字幕在线免费观看 | 亚洲精品在线国产 | 在线观看中文字幕一区二区 | 国产精品成人一区 | 五月天综合网站 | 五月天精品视频 | 91在线视频观看免费 | 懂色av懂色av粉嫩av分享吧 | 人人添人人澡人人澡人人人爽 | 婷婷深爱网 | 天天艹天天操 | 视频二区在线 | 免费a视频在线 | 狠狠干2018 | 在线免费视频 你懂得 | 天天爱天天操天天射 | 深夜免费福利网站 | 超碰人人91 | 91精品一区二区在线观看 | 午夜视频色 | 国产免费国产 | 亚洲精品18日本一区app | 久久久免费播放 | 国产高清在线免费 | 成人试看120秒 | 丁香六月综合网 | 久草.com| 在线观看中文av | 人人狠狠综合久久亚洲婷 | 欧美亚洲国产一卡 | 男女视频91 | 国内精自线一二区永久 | 久久久激情网 | 日韩大片免费在线观看 | 成人av高清在线 | 国产精品久久久久久久妇 | 国产精品麻豆欧美日韩ww | 久久国产高清 | 玖玖视频精品 | 欧美一区视频 | 亚洲在线精品 | 91麻豆精品国产91久久久更新时间 | 国产不卡高清 | 狠狠的操狠狠的干 | 粉嫩一区二区三区粉嫩91 | 综合天天色 | 久久国产精品一区二区 | 狠狠干电影 | 国产精品99视频 | 色综合久久88色综合天天6 | 久久免费视频99 | 婷婷六月久久 | 天天射,天天干 | 五月天中文字幕mv在线 | 日韩av免费在线电影 | aaa毛片视频 | 成人观看 | 亚洲国产中文字幕在线观看 | 国产一区二区视频在线播放 | 亚洲一区精品人人爽人人躁 | 日韩高清一区 | 黄色毛片电影 | 国内精品久久天天躁人人爽 | 免费看一级特黄a大片 | 波多野结衣小视频 | 97免费在线观看视频 | 成人夜晚看av | 91av官网| 日韩免费高清在线 | 免费三级av| 国产二区电影 | 欧美日韩综合在线 | 日韩精品aaa| 在线天堂中文在线资源网 | 99精品免费久久久久久久久 | 日韩在线观看 | 亚洲精品18p | 欧美午夜a | 国产亚洲精品久久久久久电影 | 超碰人人干人人 | 国产小视频福利在线 | 欧美一进一出抽搐大尺度视频 | 高清一区二区三区 | 亚洲1级片 | 黄色一级免费 | 国产精品一区二区美女视频免费看 | 久久久久久蜜av免费网站 | 黄色免费网站大全 | 免费日韩一区二区三区 | 欧美日韩在线视频一区二区 | 一级片免费观看视频 | 婷婷色六月天 | 一区二区三区视频网站 | 日批视频在线观看免费 | 国产视频一区二区在线 | 国产视频中文字幕 | 午夜色大片在线观看 | 国产精品igao视频网网址 | 最近中文字幕免费av | 蜜臀av在线一区二区三区 | 亚洲精品视频偷拍 | 国产二区电影 | 欧美日韩国产成人 | www.大网伊人 | 亚洲精品国精品久久99热 | 黄色av一区二区三区 | 国产精品成人免费精品自在线观看 | 最近字幕在线观看第一季 | 一区三区视频在线观看 | 97在线免费观看 | 91精品国产综合久久福利 | 国产三级香港三韩国三级 | 在线观看免费高清视频大全追剧 | 国产 日韩 欧美 自拍 | 日日色综合| 欧美日韩综合在线 | 日韩在线短视频 | 久久不色 | 日日夜夜人人精品 | www.午夜视频 | 久久久精品在线观看 | 国产亚洲欧美精品久久久久久 | 99精品欧美一区二区三区 | 久久精品视频观看 | 永久免费精品视频网站 | 国产精品毛片一区二区在线 | 国产视频精品久久 | 在线视频一区观看 | 激情综合五月天 | 亚洲爱爱视频 | 1区2区3区在线观看 三级动图 | 国产黄色精品网站 | 国产二区视频在线观看 | 久草在线资源网 | 夜夜躁狠狠躁 | 色多多污污在线观看 | 久久男人免费视频 | www.色的| 91在线看免费 | 国产精品99爱 | 97av视频在线观看 | 国内精品久久久久久久久久 | 亚洲国产成人在线观看 | av日韩av| 美女网站黄免费 | 色综合久久88色综合天天 | 最近日本中文字幕 | 亚洲一区二区视频在线 | 国产一级片观看 | 精品久久久久久亚洲综合网站 | 国产精品视频免费观看 | 欧美最新另类人妖 | 久青草视频在线观看 | 夜夜看av | 欧美一区二区三区不卡 | 久久人人爽爽人人爽人人片av | 精品国内自产拍在线观看视频 | 国产最新91 | 国产97色 | 黄色av一区二区 | 国产乱视频 | 精品久久久久国产 | 91观看视频 | 黄a网 | 日韩一级电影在线 | 伊人久久电影网 | 午夜精品一区二区三区在线 | 99av国产精品欲麻豆 | 美女视频免费一区二区 | 天天干天天搞天天射 | 色视频网站在线观看一=区 a视频免费在线观看 | 日韩试看 | 国产福利在线免费 | 日韩性网站 | 热久久视久久精品18亚洲精品 | 亚洲激情免费 | 精品久久国产精品 | 久久r精品 | 在线视频你懂得 | 色免费在线 | 天天插日日操 | 国产精品亚州 | 日本中文字幕在线 | 精品国产1区2区3区 国产欧美精品在线观看 | 欧美日高清视频 | 91综合久久一区二区 | 国产精品美女视频网站 | 一级成人免费视频 | 欧美成人理伦片 | 欧美日韩视频 | 精品国产乱码久久久久久久 | 夜夜夜夜操 | 欧美激情操 | 婷婷色伊人 | 色综合中文字幕 | 96精品高清视频在线观看软件特色 | 国产男女无遮挡猛进猛出在线观看 | 精品国产一区二区三区av性色 | 玖草在线观看 | 91看毛片| 丰满少妇在线观看网站 | 亚洲精品在线观看av | 日本不卡123 | 日韩精品一区二区免费视频 | 欧美大片在线观看一区 | 视频一区二区在线 | 超碰av在线| 麻豆视频免费网站 | 99电影456麻豆 | 久热av | 日日夜夜网站 | 国产亚洲精品久久网站 | 日日夜夜骑 | www久久久久| 日韩欧美网站 | 91亚洲精品久久久蜜桃 | 久久 在线| 成人xxxx | 天天操·夜夜操 | 人人看看人人 | 亚洲国产精品女人久久久 | 人人干97| 国产免费影院 | 久久在线 | 天天操天天操天天操天天操天天操 | 亚洲精品乱码久久久久久写真 | 欧美极品少妇xbxb性爽爽视频 | 国产在线色视频 | 特级a老妇做爰全过程 | 精品一区二区久久久久久久网站 | 国产中文在线字幕 | 日韩国产欧美在线播放 | 91麻豆操 | 四虎国产精品免费 | 在线观看av国产 | 久久香蕉国产精品麻豆粉嫩av | 天天天天爱天天躁 | 中文字幕亚洲在线观看 | 能在线观看的日韩av | 久草久草在线 | 又黄又爽的视频在线观看网站 | 91精品国产综合久久婷婷香蕉 | 二区三区在线视频 | 色婷婷成人网 | 国产99久久精品一区二区永久免费 | 免费毛片aaaaaa| 久久论理 | 国产va饥渴难耐女保洁员在线观看 | av在线com| 亚洲美女精品区人人人人 | 国产中文在线观看 | 五月综合色| 国产成人精品免高潮在线观看 | 少妇精69xxtheporn| 国产精品综合av一区二区国产馆 | 91人人澡人人爽 | 精油按摩av | 久草精品网 | av电影免费看 | 五月婷婷av在线 | 天天色天天草天天射 | 久久看片网站 | 天天玩夜夜操 | 99精品国产一区二区三区麻豆 | 日韩精品不卡 | 激情婷婷色| 国产录像在线观看 | 亚洲激情网站免费观看 | 久久久久久久免费观看 | 九九日韩 | 国产精品毛片久久久久久久 | 麻豆视频免费播放 | 国产视频一区在线免费观看 | www.伊人色.com | 久久久久久久久毛片 | 国产精品青青 | 午夜国产一区二区三区四区 | 欧美日韩一区二区免费在线观看 | 夜色成人av | 亚洲精品美女久久久久 | 一区二区精品视频 | 深爱婷婷久久综合 | 国产高清 不卡 | 香蕉久草在线 | 天天干天天拍天天操 | 日日爽天天 | 99视频在线观看视频 | 日韩一级黄色av | 成人a视频片观看免费 | 久草亚洲视频 | 天天av天天 | 中文字幕影片免费在线观看 | 一级欧美黄 | 日韩欧美xxxx | 精品久久久久久久久久久久久久久久久久 | av片在线观看 | 日韩av电影中文字幕 | 91精品欧美| www最近高清中文国语在线观看 | 国产黑丝一区二区 | 91成人在线观看高潮 | 99人成在线观看视频 | 操一草 | 亚洲精品乱码久久久久久 | 99久久99久久免费精品蜜臀 | 天堂av在线网| 欧美久久九九 | 国产高清免费av | 免费a网址 | 久久久久久久久久久久电影 | 国产精品丝袜 | 国产高清久久久久 | 国产亚洲精品综合一区91 | 色婷婷在线观看视频 | 91精品国产麻豆国产自产影视 | av 在线观看| 色综合久久综合中文综合网 | 色5月婷婷| 精品国产一区二区三区久久久蜜臀 | 日韩激情小视频 | 国产精品久久久久久久久久免费 | 国产精品自在欧美一区 | 91精品国产福利在线观看 | 九九视频免费在线观看 | 中国一级片在线播放 | 精品久久在线 | 色视频在线 | 亚洲另类视频在线 | 69国产精品视频免费观看 | 天天干 夜夜操 | 日韩专区 在线 | 97在线视频免费播放 | 99精品视频在线观看播放 | 欧美va天堂va视频va在线 | 国产精品午夜久久久久久99热 | 国产日韩视频在线播放 | 色多视频在线观看 | 草莓视频在线观看免费观看 | 黄色小说免费在线观看 | 男女拍拍免费视频 | 免费福利影院 | 国产精品美女免费看 | 日韩精品在线视频免费观看 | 久久久久成人精品免费播放动漫 | 成人a级网站 | 久久99精品国产99久久 | 干av在线 | 欧美日韩精品网站 | 伊人狠狠 | 五月天婷婷综合 | 黄色精品视频 | 视频二区在线 | 久久视频 | 欧美成天堂网地址 | 狠狠操操| 国产伦精品一区二区三区免费 | 亚洲精品一区二区18漫画 | 国产色视频123区 | 国产精品s色| 国产 一区二区三区 在线 | 亚洲成人免费观看 | 国产精品久久久久久一区二区 | 友田真希x88av | 瑞典xxxx性hd极品 | 成年人在线观看免费视频 | 免费看的视频 | 超碰九九 | 香蕉影院在线 | 国产精品一区一区三区 | 在线看片中文字幕 | 免费色视频网站 | 日韩黄色在线观看 | ,午夜性刺激免费看视频 | 国产精品久久久久久久久久久久午 | 亚洲精品国产拍在线 | 91完整版在线观看 | 久久精品婷婷 | 日韩高清一 | 成人黄色在线电影 | 国产96在线观看 | 免费在线观看日韩欧美 | 丝袜美腿亚洲综合 | av三区在线| 久久激五月天综合精品 | 看片网站黄色 | 久久成熟| 国产精品九九久久久久久久 | 91精品国产乱码久久桃 | 一区二区伦理电影 | 久草在线视频资源 | 亚洲国产精品999 | 久久久久久久久久电影 | 欧美日韩亚洲精品在线 | 伊人午夜 | 色哟哟国产精品 | 色鬼综合网 | 国产在线播放一区 | 免费视频久久久 | 精品一区在线 | 久久久久久久久毛片精品 | av网站在线观看免费 | 五月天最新网址 | 国产一卡二卡四卡国 | 97香蕉超级碰碰久久免费软件 | 操操操干干干 | 午夜视频在线观看一区二区三区 | 亚洲日本中文字幕在线观看 | 又黄又爽的视频在线观看网站 | 麻豆网站免费观看 | 日韩欧美亚洲 | 日韩在线视频在线观看 | 欧美最猛性xxxxx免费 | 日韩在线第一区 | 国产精品一区二区果冻传媒 | 精品一区电影国产 | 国产精品网站一区二区三区 | 精品在线99 | 黄色av大片| 天天操夜夜操天天射 | 粉嫩一二三区 | 欧美日韩久久 | 丁香九月婷婷 | 欧美成人在线免费观看 | 国内成人综合 | 婷婷色综 | wwwwww色 | 玖玖视频免费在线 | 国产精品18久久久久久久久久久久 | 五月天婷亚洲天综合网精品偷 | 在线国产片 | 特黄免费av | 日韩av黄| 香蕉精品视频在线观看 | 亚洲 综合 国产 精品 | zzijzzij亚洲成熟少妇 | 97超碰人人| 丁香久久 | 久久久久久久久久久免费av | 国产69精品久久久久99尤 | 国产精品去看片 | 中文字幕一区在线 | 久久久久久久久久久网站 | 亚洲一区欧美激情 | 日韩欧美成 | 在线日本v二区不卡 | 在线看的毛片 | 91激情视频在线播放 | 亚洲va欧美va| 久久国产精品免费观看 | 中文字幕欲求不满 | 免费一级片在线 | 天天射天天操天天干 | 九九在线视频免费观看 | 天天色天天干天天色 | 亚洲九九九在线观看 | 日韩有码欧美 | 国内一区二区视频 | 视频在线观看入口黄最新永久免费国产 | 亚洲欧洲av | 九色精品| 91九色网站 | 色就干| 色综合久久久久综合体桃花网 | 日韩久久视频 | 国产小视频免费在线观看 | 亚洲成人黄色av | 久久视频这里有精品 | 国产精品国产三级国产不产一地 | 欧美在线视频不卡 | 狠狠网站 | 欧美在线久久 | 欧美精品首页 | 国产成人精品一区在线 | 欧美精品亚洲二区 | 狠狠狠狠狠狠天天爱 | 天天色成人 | 国产1区2 | 中文字幕在线观看免费观看 | 亚洲视频在线观看网站 | 五月天婷婷丁香花 | 成人va天堂| 国产日韩精品一区二区三区 | 国产资源 | 欧美aa在线 | 97超碰成人在线 | 人人澡人人澡人人 | 国产精品久久久久亚洲影视 | 亚洲aⅴ免费在线观看 | 99久久久久免费精品国产 | 亚州人成在线播放 | 在线观看中文字幕一区二区 | 欧美孕交vivoestv另类 | 亚洲视频电影在线 | 91九色最新 | 97色综合 | 国产精品高潮在线观看 | .国产精品成人自产拍在线观看6 | 国产一级片免费视频 | 久久久久中文字幕 | 国产三级视频 | 久久久久亚洲精品男人的天堂 | 91片黄在线观 | 中国一级片在线播放 | 久久国产三级 | 欧美国产日韩一区二区 | 国产黄大片在线观看 | 亚洲精品国偷拍自产在线观看 | 人人澡人人草 | 色视频网站免费观看 | 日韩精品一区二区在线视频 | 欧美一区二区三区在线 | 欧美亚洲专区 | 国产精品久久久99 | 干干日日 | 久久婷婷一区二区三区 | 久久这里只有精品久久 | www.亚洲精品在线 | 久久久久福利视频 | 91香蕉视频在线下载 | 成年人av在线播放 | 一级大片在线观看 | 一级成人在线 | 国产精品美女久久久久久久久久久 | 欧美成人影音 | 亚洲天天摸日日摸天天欢 | 国产一级黄色免费看 | 午夜久久久影院 | ,午夜性刺激免费看视频 | 久久久 精品 | 亚洲毛片一区二区三区 | av福利第一导航 | 欧美了一区在线观看 | 免费在线一区二区 | 国产五月 | 国产999精品 | 九色自拍视频 | 亚洲精品在线视频观看 | 日韩高清免费观看 | 成人午夜剧场在线观看 | 久久夜色精品国产亚洲aⅴ 91chinesexxx | 国产资源免费 | 中文字幕永久在线 | 日本动漫做毛片一区二区 | 日本aa在线 | 日韩一区二区三区免费视频 | 深爱五月网 | 亚洲无线视频 | 国产在线精品视频 | 色99在线 | 亚洲一区二区三区四区在线视频 | 欧美日韩另类视频 | 国产亚洲人 | 国产成人精品在线观看 | 麻豆免费观看视频 | 91视频免费国产 | av电影中文字幕在线观看 | 精品一区二区免费视频 | 亚洲 欧洲av| 久久久久亚洲精品成人网小说 | 高清av中文在线字幕观看1 | 久草在线在线精品观看 | 国产一卡久久电影永久 | 免费人做人爱www的视 | 在线综合色 | 欧美一级片免费播放 | 免费日韩 精品中文字幕视频在线 | av成年人电影 | 成人毛片久久 | 国产黄色高清 | 精品a在线 | 欧美精品一区二区在线观看 | 日韩在线观看视频中文字幕 | 色综合婷婷久久 | 免费av网址大全 | 亚洲闷骚少妇在线观看网站 | av在线一| 狠狠干夜夜爽 | www日韩在线 | 欧美黄色高清 | 亚州国产视频 | 成人免费影院 | 日韩在线第一 | 国产视频2区 | 欧亚日韩精品一区二区在线 | 三级在线国产 | aav在线| 日韩色在线观看 | 91视频 - x99av| 国产91精品一区二区绿帽 | 91亚洲综合 | 日本精品va在线观看 | 三级av片 | 久久久久二区 | 色五月情 | 在线日韩精品视频 | 91精品办公室少妇高潮对白 | 免费观看视频的网站 | 成人在线观看资源 | 久草9视频 | 特级西西444www大精品视频免费看 | 日韩欧美精品在线 | 麻豆av一区二区三区在线观看 | 国产精品12 | 天天操天天摸天天干 | 99精品国产兔费观看久久99 | 九九热在线精品视频 | 天天射天天干天天爽 | 深夜免费福利 | 三级av黄色 | 在线观看中文字幕第一页 | 超碰在线97国产 | 免费成人在线网站 | 亚洲精品综合在线观看 | 欧美在线久久 | 国产资源av | 91最新中文字幕 | 又污又黄的网站 | 五月婷婷香蕉 | 亚洲aⅴ在线观看 | 国产99色 | 日韩中文字幕网站 | 天天操夜夜操天天射 | a天堂最新版中文在线地址 久久99久久精品国产 | 亚洲第一久久久 | 国产香蕉久久 | 久久精品免费观看 | 久久精品永久免费 | 天天翘av | 日韩性色 | 中文字幕超清在线免费 | 国产精彩在线视频 | 久久婷婷综合激情 | 成人app在线免费观看 | 91福利社在线观看 | 黄污网站在线观看 | www.黄色在线 | 91伊人久久大香线蕉蜜芽人口 | 亚洲日本精品视频 | 久草在线国产 | 久久免费资源 | 成人全视频免费观看在线看 | 亚洲国产精品日韩 | 在线岛国av | 亚洲永久精品国产 | 五月天堂色| 免费观看国产成人 | 99这里只有精品99 | 久久久久久久久久久久电影 | 国语黄色片| 日本精品久久久久久 | 在线亚洲成人 | 精品伦理一区二区三区 | 欧美a影视 | 国产精品网址在线观看 | 免费中午字幕无吗 | 久久精品一区二区三区四区 | 亚洲成人资源 | 欧美片网站yy| 黄在线 | 国产96av| 欧美一级看片 | 亚洲性少妇性猛交wwww乱大交 | 一区二区三区在线观看中文字幕 | 欧美天堂视频在线 | 国产日韩视频在线观看 | 我爱av激情网| 国产美女在线免费观看 | 天天操欧美 | 五月婷婷视频在线 | 色在线免费 | 波多野结衣日韩 | 色姑娘综合网 | 精品国产网址 | 日日夜夜av| 黄色成人91 | 久久久免费视频播放 | 99热这里只有精品免费 | 美女黄色网在线播放 | 人人玩人人添人人 | 国产视频999 | 天堂中文在线视频 | 亚洲视屏一区 | 怡红院av久久久久久久 | 国产福利a | 中文字幕 国产精品 | 在线观看黄色的网站 | 婷婷色六月天 | 亚洲精品国偷自产在线91正片 | 亚洲精品视频在线看 | 欧美视频在线观看免费网址 | 超碰在线最新网址 | 日韩高清在线观看 | 成人高清av在线 | 亚洲专区在线播放 | 亚洲 综合 国产 精品 | 中文在线中文a | 亚洲人人网 | 国产1级视频 | 在线观看 亚洲 | 日韩a级免费视频 | 国产成人黄色在线 | 国产字幕在线看 | 99热这里只有精品在线观看 | 不卡视频在线看 | 国产精品96久久久久久吹潮 | 亚洲国产精品久久久久 | 不卡视频一区二区三区 | 99视频这里有精品 | 亚洲最大av网 | 青青河边草手机免费 | 国产香蕉视频在线播放 | 国产一级片免费播放 | 成人在线免费视频 | 国产在线成人 | 婷婷激情影院 | 久久精品影片 | 日韩免费精品 | 中文字幕一区二区三区乱码在线 | 免费高清在线一区 | 一级黄色毛片 | 国产一区视频免费在线观看 | 天天插日日插 | 91三级在线观看 | 99色资源 | 国产精品入口a级 | 美女av免费 | 久久美女免费视频 | 亚洲精品www久久久久久 | 中文亚洲欧美日韩 | 69国产精品成人在线播放 | av观看在线观看 | 中文字幕精品三级久久久 | 婷婷精品国产欧美精品亚洲人人爽 | 免费在线色视频 | 亚洲精品91天天久久人人 | 97热久久免费频精品99 | 91在线日本 | 日韩在线免费 | 一本一本久久a久久 | 超碰激情在线 | 日日夜夜精品视频 | 91欧美日韩国产 | 久久久www成人免费毛片 | 在线va网站| 国产精品乱码久久久久久1区2区 | 色视频在线免费观看 | 日韩免费视频网站 | 日韩特黄一级欧美毛片特黄 | 国产 在线 高清 精品 | 在线观看精品 | 91中文字幕在线播放 | 国产一区二区精品久久 | 一区二区三区四区五区在线视频 | 91网在线观看| 久久久精品在线观看 | 日韩欧美视频 | 久久国产精品一区二区三区四区 | 免费av黄色 | 亚洲成a人片77777潘金莲 | 欧美美女视频在线观看 | 久草在线在线 | 天天干天天综合 | 91香蕉亚洲精品 | 天天综合网~永久入口 | 国产视频1 | 久久激情网站 | avove黑丝 | 国产高清视频免费最新在线 | 夜色资源站国产www在线视频 | 超碰在线人人97 | 色五月成人 | 2017狠狠干 | 网站免费黄色 | 国产色爽| 色综合狠狠干 | 一区在线观看 | 丝袜少妇在线 | 99精品国产一区二区三区不卡 | 欧美一级黄色视屏 | 国产麻豆剧传媒免费观看 | 91中文在线视频 | 亚洲国产精品影院 | 久久精品黄色 | 美女视频久久黄 | 日日天天狠狠 | 日韩精品久久久久久久电影99爱 | 黄网站app在线观看免费视频 | 亚av在线 | 久久精品免费电影 | 久久手机精品视频 | 久久婷五月 | 91视频网址入口 | 在线观看免费视频你懂的 | 国产二区视频在线观看 | 精品国产伦一区二区三区 | 97视频免费在线观看 | 欧美在线日韩在线 | 黄色电影在线免费观看 | 亚洲国产av精品毛片鲁大师 | 国产一级黄色片免费看 | 亚洲午夜剧场 | 国产精品99久久久久久小说 | 国产福利在线免费观看 | 国产在线观看,日本 | 欧美日韩在线观看一区二区三区 | 中文字幕国语官网在线视频 | 911国产| 99视频久久 | 黄色91免费观看 | 婷婷成人亚洲综合国产xv88 | 97在线视 | 国产一级片直播 | 51久久夜色精品国产麻豆 | 91中文字幕永久在线 | 亚洲国产精久久久久久久 | 日日干夜夜爱 | 天堂视频中文在线 | 在线观看精品一区 | 草久在线视频 | 中文在线字幕免费观 | 国产中文字幕视频在线观看 | 婷婷激情五月 | 日韩av一区二区在线播放 | 99综合电影在线视频 | 成人影音在线 | 六月天综合网 | 四虎影视国产精品免费久久 | 日本在线免费看 | 欧美日本日韩aⅴ在线视频 插插插色综合 | 国产系列 在线观看 | 中文字幕在线看人 | 欧美国产日韩在线观看 | 日韩欧美一区二区在线播放 | 91最新地址永久入口 | 97精品视频在线 | 国产亚洲字幕 | 草久在线播放 | 色偷偷88888欧美精品久久久 | 4p变态网欧美系列 | 欧美另类交在线观看 | 手机av看片 | 国产精品久久网 | 国产中文字幕在线播放 | 国产高清不卡在线 | 在线亚洲午夜片av大片 | 456免费视频 | 亚洲 中文 欧美 日韩vr 在线 | 91欧美精品 | 日日夜色 | 亚洲一区久久久 | 亚洲午夜久久久久久久久久久 | 国产热re99久久6国产精品 | 国产不卡精品视频 | 色爱区综合激月婷婷 | 99热国产在线中文 | 亚洲乱亚洲乱亚洲 | 人人超碰在线 | 日韩久久久久久久 | 免费观看福利视频 | 男女免费视频观看 | 中文av资源站 | 日韩欧美xxx | 蜜桃传媒一区二区 | 狠狠色狠狠色综合系列 | 午夜精品一区二区三区可下载 | 中文字幕中文字幕在线一区 | 国产明星视频三级a三级点| 最近中文字幕在线播放 | 97超视频 | 国产精品一区二区在线播放 | 精品国产免费久久 | 国产一区二区在线免费播放 | 五月婷在线观看 | 99久久夜色精品国产亚洲96 | 日韩av片在线 | 久久婷婷精品视频 | 91天天操| 丁香视频 | 日韩精品一区二区三区在线播放 | 色婷婷国产精品一区在线观看 | 香蕉影视在线观看 | av日韩精品 | 日韩精品视频免费在线观看 | 亚洲理论电影 | 在线观看国产一区二区 | 福利一区在线 | 国产老妇av| 亚洲爱av | 欧美日韩性生活 | 99久久精品免费一区 | 一区二区三区在线免费 | 欧美精品亚洲精品 | 骄小bbw搡bbbb揉bbbb | 国产中文伊人 | 国产成人精品一区二区在线 | 少妇高潮冒白浆 | 色网址99 | 久久成人18免费网站 | 午夜美女视频 | 99这里只有 | 日韩av看片 | 中文在线免费看视频 | 九九九九九九精品任你躁 | av电影在线免费观看 | 三级黄色a| 天堂va欧美va亚洲va老司机 | 国产九九精品视频 | 黄色精品一区二区 | 午夜91在线 | 日韩精品在线视频免费观看 | 在线看日韩 | 国产精品久久久久久高潮 | 亚洲午夜精品久久久久久久久 | 亚洲 av网站 | 精品中文字幕在线 | 91cn国产在线 | 月丁香婷婷 | 天天艹天天操 | 狠狠色丁香婷婷综合 | 久久人人爽视频 | 色的网站在线观看 | 久草在线一免费新视频 | 一二三精品视频 | 97人人模人人爽人人少妇 | 99视频在线免费观看 | 久久国产精品一二三区 | 亚州av成人 | 综合色中色 | 久久在线免费观看 | 天天摸天天操天天舔 | 欧美精品在线观看 | 免费看的黄色的网站 | 免费在线色电影 | 欧美激情片在线观看 | www.69xx| 婷婷六月网 | 国产成人高清 | 国产精品九九久久久久久久 | 国产精品麻豆99久久久久久 | 91精品爽啪蜜夜国产在线播放 | 日韩黄视频 | 99久久夜色精品国产亚洲96 | 日日夜夜国产 | 亚洲综合少妇 | 中文字幕在线有码 | 懂色av懂色av粉嫩av分享吧 | 久久综合久久综合久久综合 | 操操日日 | 欧美一二三在线 | 欧美精品亚洲精品日韩精品 | 国产另类av | 天海冀一区二区三区 | 99草在线视频| 天天干天天拍天天操 | 久久xxxx| 特级aaa毛片| 91一区一区三区 | 色天天久久 | 黄色毛片视频 | 久久精品综合 | 日韩网站一区 | 亚洲在线资源 | 成人免费网视频 | 在线免费观看视频你懂的 | av三级av | 97av精品| 91福利区一区二区三区 | 狠狠干狠狠色 | 国产在线观看午夜 | 99精品视频免费观看视频 | 激情综合网五月 | 性色av免费在线观看 | 9热精品 | 99热超碰在线 | 国内视频一区二区 | 亚洲成人精品久久久 | 在线观看成人国产 | 成人午夜电影在线播放 | 色九九在线 | 国产裸体视频bbbbb | 亚洲国产日韩一区 | 欧美狠狠色 |