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

歡迎訪問 生活随笔!

生活随笔

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

java

Java XMPP负载测试工具

發布時間:2023/12/3 java 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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用戶, 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 (可以是其他名稱),使用相同的密碼模擬了50個用戶a :

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( 消息 , 存在和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時,對等網絡將失敗。 它速度更快,除了上述問題之外,您無法控制要交換的內容。
  • 代理服務器 (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负载测试工具的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    日韩精品一区不卡 | 国产成人精品一区二区三区网站观看 | 国产一级三级 | 911久久香蕉国产线看观看 | 99久久国产免费,99久久国产免费大片 | 在线视频你懂得 | 91片黄在线观看 | 欧美一级视频在线观看 | 五月婷婷深开心 | 国产亚洲高清视频 | 4hu视频 | 欧美性极品xxxx做受 | 国内精品99 | 久草在线国产 | 欧美日韩国产在线观看 | 国产一区二区在线免费视频 | 亚洲免费在线观看视频 | 国产字幕在线看 | 91精品国产亚洲 | 福利久久久 | 中文字幕在线看视频国产 | 日韩免费久久 | 欧美色插| 中文字幕人成不卡一区 | 91精品啪在线观看国产 | 亚洲成av人影片在线观看 | 视频在线日韩 | 在线视频你懂得 | 久久久国产一区 | 婷婷久草 | 免费黄在线观看 | 免费一级特黄毛大片 | 日韩在线视频网站 | 日韩免费中文字幕 | 亚洲免费公开视频 | 九九视频这里只有精品 | 国产精品ssss在线亚洲 | 亚洲综合在线观看视频 | 又色又爽的网站 | 99久久久久成人国产免费 | 国产精品电影一区 | 国产精品久久久久久999 | 99热这里只有精品国产首页 | 国产麻豆视频网站 | 国产夫妻av在线 | 丁香六月在线 | 日韩视频专区 | 国产精选视频 | 韩国av免费观看 | 欧美色图另类 | 在线免费av观看 | 黄色成人毛片 | 中文字幕久久精品 | 在线观看视频免费播放 | japanesefreesex中国少妇 | 国产亚洲视频在线免费观看 | 久久色视频 | 99久热精品 | 国产在线色| 国产精品久久久久久久久大全 | 色狠狠狠 | 国产中文视频 | 一区二区三区在线观看免费 | 亚洲成人黄色 | 综合激情婷婷 | 高清不卡一区二区在线 | 成人av影院在线观看 | a黄色一级 | 亚洲精品国产成人av在线 | 日韩精品在线观看av | 91精品国产乱码在线观看 | 日日色综合 | 日日麻批40分钟视频免费观看 | 99视频精品 | av国产在线观看 | 国产97av | 国产黄色在线观看 | 久久免费黄色大片 | 免费国产一区二区 | 日韩高清精品免费观看 | 日韩免费观看高清 | 色99导航 | 成人超碰在线 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 人人爱在线视频 | 免费观看第二部31集 | 狠狠干天天操 | 久久国产免 | 五月开心婷婷 | av色一区| 精品国产电影 | 日韩在线激情 | 久久久午夜电影 | 91看片在线| 国产一二区免费视频 | 天天av天天 | 国内精品二区 | 超碰成人免费电影 | 亚洲精品国产综合99久久夜夜嗨 | 国产69精品久久久久99尤 | 国产高清在线永久 | 国产一区二区三区视频在线 | 福利网址在线观看 | 国产九九九九九 | 国产性xxxx | 亚洲一级黄色av | 激情五月激情综合网 | 国产 视频 高清 免费 | 黄色av高清 | 在线观看视频在线 | 亚洲日b视频 | 精品久久片 | 天天操天天射天天 | 狠狠色香婷婷久久亚洲精品 | 国产女人40精品一区毛片视频 | 日韩av免费在线看 | 成人av网站在线 | 成人av地址 | 午夜精品久久久久久久99 | 天天干天天拍天天操天天拍 | 综合婷婷久久 | 99成人免费视频 | 91在线在线观看 | 午夜久久精品 | 日本在线观看一区 | 天天操狠狠干 | 国产精品每日更新 | 丰满少妇对白在线偷拍 | 国产精品原创 | 国产精品第10页 | 天天操人人干 | 久久情爱 | 久久理论片 | 久久久久久久久久久黄色 | 欧美激情视频一二区 | 在线视频手机国产 | 亚洲少妇激情 | 欧美另类巨大 | 国产综合激情 | 96精品视频 | 欧美日韩精品影院 | 97人人网 | 天天综合五月天 | 成人av观看 | 国产成人精品一区二区三区网站观看 | 在线观看日韩中文字幕 | 91香蕉视频在线下载 | 国产精品一区二区在线观看 | 色av色av色av | 韩日三级av| 99成人免费视频 | 91精品国产麻豆国产自产影视 | 国产在线精品国自产拍影院 | 国语久久| 人人爱人人添 | 亚洲aⅴ在线观看 | 国产精品欧美精品 | 综合色久 | 亚洲精品久久久久中文字幕二区 | 国产日韩高清在线 | 超碰在线94 | 国产亚洲成av人片在线观看桃 | 天天干天天射天天插 | 亚洲aⅴ久久精品 | 日本久热 | 激情综合网五月婷婷 | 在线国产视频 | 五月开心激情 | 韩国av免费观看 | 少妇精品久久久一区二区免费 | 欧美最猛性xxxxx免费 | 男女激情片在线观看 | 三级黄色三级 | 久久精品久久精品久久 | 色综合小说 | 在线 成人 | 久青草国产在线 | 999视频网| 一级一级一片免费 | 免费高清影视 | 91尤物国产尤物福利在线播放 | 精品久久久久久久久久 | 在线观看免费视频 | 四虎在线视频免费观看 | 久久精品国产久精国产 | 久久99国产视频 | 在线v | 日日狠狠 | 亚洲精品国偷拍自产在线观看蜜桃 | 中文字幕乱码电影 | av官网在线 | 一区二区三区免费在线播放 | 91精品一区在线观看 | 人人草在线视频 | 97超碰中文字幕 | 久久久精华网 | av一区二区三区在线播放 | 亚洲国产精品小视频 | 日本中文在线观看 | 亚洲va欧美va人人爽春色影视 | 欧美精品免费在线 | 黄色在线观看www | 欧美精品中文 | 欧美日韩网站 | 狠狠操.com| 国产精品 日韩精品 | 精品国产一区二区三区久久久久久 | 日韩在线色视频 | 五月婷婷在线综合 | 国产日韩在线视频 | 久久久资源 | 精品亚洲va在线va天堂资源站 | 国产午夜小视频 | 亚洲国产一区二区精品专区 | 日韩a欧美 | 最新av电影网址 | 狠狠干网站 | 不卡精品视频 | 国产精品国产自产拍高清av | 黄色小说视频网站 | 欧美aⅴ在线观看 | 欧美韩国日本在线观看 | 亚洲精品中文字幕视频 | 97看片网 | 中文字幕精品三级久久久 | 欧美成人理伦片 | 狠狠狠色丁香婷婷综合久久五月 | 国产一级免费av | 九九热免费在线观看 | 特级毛片爽www免费版 | 又黄又爽又刺激 | 99一级片 | 国产精品va在线播放 | 一区在线电影 | 婷婷激情小说网 | 日韩美一区二区三区 | 在线婷婷| 色综合亚洲精品激情狠狠 | 97国产小视频 | 欧美性大胆 | 最近能播放的中文字幕 | 永久免费看av| 免费观看国产精品视频 | 久久久免费高清视频 | 国内精品毛片 | 免费看片网页 | 日韩有码在线观看视频 | 麻豆视频国产 | 欧美久久久 | 午夜精品福利一区二区三区蜜桃 | 精品一区二区电影 | 色婷婷av在线 | 97综合在线 | 最新av在线播放 | 97精品国自产拍在线观看 | 亚洲免费不卡 | 国产在线观看,日本 | 婷婷激情五月 | 激情视频免费观看 | www免费在线观看 | 成人精品影视 | 欧美久久久久 | 丁香六月欧美 | 四虎影视成人精品 | 色婷婷电影 | 亚洲精品美女久久久久 | 国产区精品区 | av经典在线| 久久五月激情 | 狠狠的操狠狠的干 | 中文字幕中文字幕在线中文字幕三区 | 国产精品成人aaaaa网站 | 97超碰在线视 | 欧美日韩另类在线观看 | 日本激情视频中文字幕 | 国产成人三级 | 国产综合福利在线 | 香蕉成人在线视频 | 日韩精品一区二区在线观看视频 | 一区二区三区在线看 | 99精品系列| 国产一区电影在线观看 | 亚洲黄色av一区 | 中文字幕日韩国产 | 午夜成人免费电影 | 天天色天天射天天综合网 | 中文字幕资源网 国产 | 在线视频婷婷 | 91av中文| 色综合天| 97超碰超碰久久福利超碰 | 91亚洲精品国偷拍自产在线观看 | 91手机视频在线 | 日日操天天操夜夜操 | 亚洲美女精品 | 国产日韩精品一区二区在线观看播放 | av在线看片 | 伊人久久国产精品 | 亚洲精品乱码久久久久久蜜桃动漫 | 永久免费在线 | 中文在线免费一区三区 | 97在线播放视频 | 欧美日韩视频一区二区 | 热久久影视| 日韩在线视频免费播放 | 亚洲欧美国内爽妇网 | 91精品国产九九九久久久亚洲 | 天天狠狠 | 在线观看视频色 | 欧美极品xxx | 久久国产精品免费 | 中文字幕精品在线 | 中文电影网 | 国产成人精品综合 | 国产精品都在这里 | 国产精品毛片一区二区在线看 | 激情婷婷亚洲 | 99免在线观看免费视频高清 | 国产高清久久久久 | 91av在线视频播放 | 91精品资源 | 久久伊人色综合 | www日 | 国产黄色片久久久 | 久久精品一区二区国产 | 中文字幕一区二区三区四区视频 | 久久久久久久久综合 | 黄色片免费电影 | 国产精品专区h在线观看 | 日日夜精品 | 人人要人人澡人人爽人人dvd | 色狠狠久久av五月综合 | 色天天综合久久久久综合片 | 欧美日韩中文在线观看 | 国产女v资源在线观看 | 亚洲精品在线免费观看视频 | 欧美狠狠色 | 日本中文字幕观看 | 亚洲天堂网站视频 | 黄色一级大片在线免费看产 | 国产日本在线 | 99爱在线观看 | 亚洲欧美精品在线 | 九九99 | 91麻豆视频网站 | 天天操操操操操操 | 国产精品久久久电影 | 国产一级电影在线 | 91视频91自拍 | 激情av综合 | 久久综合狠狠狠色97 | 亚洲免费观看视频 | 五月宗合网| 欧美人交a欧美精品 | 久久国产精品久久精品 | 亚洲狠狠丁香婷婷综合久久久 | 日本精品一区二区三区在线观看 | 在线免费观看黄色av | 九九九在线观看 | 午夜精品av在线 | 国产一区二区视频在线播放 | 国产亚洲精品精品精品 | 日韩视频一区二区三区 | 久久少妇| 青青草国产精品视频 | 黄网站www| 不卡的av在线 | 成人在线视频观看 | 99这里只有精品视频 | 99欧美 | 国产精品高潮久久av | 日韩欧美黄色网址 | av在线小说 | 毛片美女网站 | 天天干天天干天天干天天干天天干天天干 | 日批视频| 91亚洲网站 | 国产手机在线观看视频 | 国产一区欧美日韩 | 国产99久久久国产精品免费二区 | 九九久久婷婷 | 91高清免费在线观看 | 欧美性天天 | 亚洲国产欧美在线看片xxoo | www.夜色321.com| 999超碰| 日韩av视屏在线观看 | 日韩欧美不卡 | 日韩精品在线免费播放 | 国产二区视频在线观看 | 久久精品成人热国产成 | 日韩一级黄色大片 | 久久99久久99久久 | 婷婷国产一区二区三区 | 九九九九精品九九九九 | 精品久久电影 | 天天插天天操天天干 | www.久久com | 男女视频91 | 开心色插 | 国产综合精品一区二区三区 | 午夜精品久久久久久99热明星 | 亚洲成人午夜在线 | 人人干网 | 国产精品一区二区三区久久 | 久久久久久久久久久精 | 一区在线观看 | 最近乱久中文字幕 | 久久久久久久久久久久久久电影 | 国产在线色视频 | 999国内精品永久免费视频 | 国产精品普通话 | 欧美一级小视频 | 亚洲精品国产精品国自 | 一区二区视频欧美 | 激情视频区 | 97人人视频 | 国产精品成人自产拍在线观看 | 免费久久网站 | 欧美日韩在线看 | 91在线网址| 亚洲 欧美 综合 在线 精品 | 国产我不卡 | 免费看国产一级片 | 国产精品入口麻豆 | 国产区精品在线观看 | 日本特黄一级片 | 日韩精品1区2区 | 综合天堂av久久久久久久 | 国产精品久久久久毛片大屁完整版 | 国产高清黄色 | 欧美在线观看视频免费 | 在线观看精品一区 | 国产精品黄 | 五月激情六月丁香 | 国语精品免费视频 | 77国产精品 | 久久大香线蕉app | 在线观看亚洲国产精品 | 91色国产| 亚洲最大的av网站 | 999久久久免费精品国产 | 久久成人国产精品 | 亚洲五月婷 | 亚洲国产一二三 | 久久免费美女视频 | 午夜影院一级片 | 永久免费的啪啪网站免费观看浪潮 | 超碰在线人人艹 | 最近中文字幕高清字幕免费mv | 亚洲麻豆精品 | 欧美日韩中 | 日韩av成人在线观看 | 一区二区三区免费在线观看视频 | 婷婷综合五月 | 人成在线免费视频 | 国产无区一区二区三麻豆 | 亚洲黄色免费 | 国产一区二区三区高清播放 | 九九精品视频在线观看 | 在线观看亚洲专区 | 99热国产在线观看 | 亚洲精品播放 | 久久高清 | 欧美尹人 | 亚洲精品视频在线免费 | 日韩av电影网站在线观看 | 欧美在线观看小视频 | 久久国产精品成人免费浪潮 | 久久老司机精品视频 | 日本h视频在线观看 | 久久经典国产视频 | 96av麻豆蜜桃一区二区 | 国产精品久久久久久久久久尿 | 精品国产99 | 高清av中文在线字幕观看1 | 二区三区av| 成人中文字幕在线 | 国产专区视频 | 成人av亚洲 | 8x成人免费视频 | 免费在线观看成年人视频 | 亚洲 欧洲 国产 精品 | 天天综合久久综合 | 97人人爽 | 久久久久免费精品视频 | 欧美韩国日本在线观看 | 99精品色 | 成人a视频 | 亚洲综合色婷婷 | 天天操夜夜逼 | 久久夜夜操 | 欧美日本啪啪无遮挡网站 | 成人a视频 | 久久久国产精品成人免费 | 狠狠狠色丁香婷婷综合久久五月 | 国产色在线,com | www成人av | 黄色字幕网 | 丁香六月在线 | 麻花豆传媒mv在线观看网站 | 最新av在线播放 | 国产精品黄网站在线观看 | 亚洲精品美女免费 | 亚洲国产成人精品在线观看 | 玖玖精品在线 | 亚州性色| 欧美一区在线观看视频 | 国产精品中文字幕在线观看 | 美女视频网站久久 | 波多野结衣精品 | 国产精品永久在线观看 | 91福利免费| 国产在线视频一区二区三区 | 天天插天天色 | 国产91勾搭技师精品 | 久久免费视频1 | 国产 欧美 在线 | 婷婷精品国产一区二区三区日韩 | 美女视频黄,久久 | 三级av片 | 精品一区二区在线观看 | 久久影视一区 | 久久最新网址 | 日本久久久久久科技有限公司 | 亚洲日韩欧美视频 | 在线观看第一页 | 香蕉视频在线视频 | 久草在线免费资源 | 福利视频一区二区 | 最新国产在线视频 | 97视频在线观看成人 | av福利在线免费观看 | 国产精品一级视频 | 亚洲天堂网在线观看视频 | 在线影院 国内精品 | 麻豆影视在线播放 | 免费视频久久久久久久 | 久久久久女教师免费一区 | 色网站在线免费观看 | 五月激情亚洲 | 成人免费观看完整版电影 | 国产精品亚洲片在线播放 | 中文字幕二区在线观看 | 永久免费的啪啪网站免费观看浪潮 | 亚洲3级| 久久歪歪 | 国产五月天婷婷 | 97综合网 | 久草视频手机在线 | 又黄又刺激| 中文字幕av免费观看 | 国产成人亚洲在线观看 | 久久综合中文字幕 | 韩日成人av | 香蕉影院在线播放 | 91av在线视频播放 | av高清不卡 | 91精品影视| 日韩免费av片 | 精品国产一区二区三区四区vr | 国产一级黄 | 国产无吗一区二区三区在线欢 | 综合网成人 | 国产成人av电影在线观看 | 亚州日韩中文字幕 | 国产婷婷精品av在线 | 91最新中文字幕 | 成人av电影在线观看 | 六月激情久久 | 日韩精品久久中文字幕 | 天天爱天天 | 日韩在线视频免费播放 | 最近中文字幕国语免费高清6 | 成人影片在线免费观看 | 色资源中文字幕 | 一级黄色片毛片 | 色婷婷激婷婷情综天天 | 久久激情视频免费观看 | 国产伦精品一区二区三区无广告 | 国产精品高潮呻吟久久久久 | 五月激情五月激情 | 日韩欧美视频一区二区 | av网址aaa | 久久这里只有精品久久 | 五月婷婷综合在线视频 | 日本精品小视频 | 日韩视频在线不卡 | av黄色大片 | 99精品国产一区二区三区不卡 | 97超碰在线久草超碰在线观看 | 色婷婷久久一区二区 | 成年人免费看片 | 99热这里精品 | 韩日电影在线观看 | 日韩高清在线一区二区三区 | 国产亚洲在线视频 | 精品国内自产拍在线观看视频 | 国产精品一区二区三区四 | 成人午夜剧场在线观看 | 亚洲精欧美一区二区精品 | 久久久免费视频播放 | 国产涩涩在线观看 | 91久久爱热色涩涩 | 国产黄色高清 | 国产福利一区二区三区在线观看 | 综合久久久久久久久 | 91免费国产在线观看 | 亚洲精品午夜久久久久久久久久久 | 中文欧美字幕免费 | 狠狠色伊人亚洲综合网站野外 | av成年人电影| 欧美日韩不卡一区 | 一级黄色视屏 | 91最新在线 | 91成人网在线观看 | 91av久久 | 日韩一区二区三区观看 | 午夜精品麻豆 | 免费日韩av片 | 热久久这里只有精品 | 99综合久久 | 亚洲欧美日韩国产一区二区 | 毛片精品免费在线观看 | 成人蜜桃 | 四虎天堂 | 国产高清黄色 | 五月天婷婷视频 | 亚洲国产电影在线观看 | 国产精品美女久久久久久久久久久 | 91爱爱电影 | 国产精品亚洲a | 久久久久精| 九九免费观看全部免费视频 | 五月导航 | 亚洲一区二区三区在线看 | 国产精品99久久久精品 | 九九九九热精品免费视频点播观看 | 四虎影视8848dvd | 国产午夜精品一区二区三区在线观看 | 日本精品免费看 | 国产成人福利在线观看 | 欧美日韩高清一区二区 | 欧美亚洲免费在线一区 | 日韩免费二区 | 日狠狠 | 欧美日韩国产xxx | 国产亚洲高清视频 | 色婷婷在线播放 | 97视频在线观看播放 | 热99在线视频| 久久99婷婷| www.色com | 国产成人61精品免费看片 | 人人射 | 日日夜夜天天人人 | 久久精品视频在线播放 | 麻花传媒mv免费观看 | 8x成人在线 | av黄色成人| 正在播放五月婷婷狠狠干 | 天天做天天射 | 国产亚洲aⅴaaaaaa毛片 | 欧美激情在线看 | 国产美女被啪进深处喷白浆视频 | 中文国产成人精品久久一 | 91爱看片| 麻豆视频免费在线观看 | 中文在线字幕免 | 深爱激情五月婷婷 | 国产a视频免费观看 | 天堂网在线视频 | 成人精品一区二区三区电影免费 | 亚洲视频中文 | 久久国产剧场电影 | 四虎国产免费 | 久久香蕉电影 | 日韩高清精品一区二区 | 久草热久草视频 | 91麻豆免费视频 | 成人在线视频免费 | 99这里都是精品 | 国产在线精品国自产拍影院 | 午夜av剧场| 国产黄色视 | 久久影院午夜论 | 人人看人人爱 | 99久久日韩精品免费热麻豆美女 | 婷婷激情站 | 黄色网址a| www.夜色.com| 亚洲天堂免费视频 | 亚洲aⅴ免费在线观看 | 13日本xxxxxⅹxxx20 | 久草免费新视频 | 国产精品久久久久久妇 | 中文字幕中文字幕中文字幕 | 日本中文字幕在线一区 | 亚洲成年人av | 久久你懂的 | 国产91精品久久久久 | 国内精品久久久久影院男同志 | 国产精品日韩在线观看 | 亚洲色图av | 日韩v欧美v日本v亚洲v国产v | av免费电影在线 | 最近高清中文字幕 | 婷婷丁香色 | 亚洲第一区精品 | 日本中文字幕网址 | 天天插天天操天天干 | 国产精品a级 | 日韩 在线| 国产精品久久久久影院日本 | 国产91在线观看 | 久久国产高清 | 在线看av网址 | 天天操综合 | 99国产在线视频 | av电影在线播放 | 午夜精品久久久久久久久久久久 | 久久精品一二三 | 极品美女被弄高潮视频网站 | 亚洲深爱激情 | 免费看wwwwwwwwwww的视频 久久久久久99精品 91中文字幕视频 | www视频在线观看 | 欧美在线一二 | 久久免费成人 | 在线观看国产一区二区 | 日韩亚洲精品电影 | 天天综合入口 | 免费观看性生活大片3 | 一区二区中文字幕在线播放 | 中文字幕av有码 | 五月婷婷综 | 欧美一区免费观看 | 免费成视频 | 成人国产精品一区 | 国产中文字幕视频在线 | 久久久久久蜜桃一区二区 | 亚洲高清视频一区二区三区 | 亚洲欧美国产日韩在线观看 | 97超碰免费在线 | 国产剧在线观看片 | av在线播放不卡 | 天天干天天干天天色 | 在线观看国产v片 | 天天干天天干天天干 | 天天干夜夜夜 | 国产精品毛片一区视频 | 国产在线色视频 | 欧美永久视频 | 涩涩成人在线 | 午夜国产一区 | 国产免费又粗又猛又爽 | 一区二区中文字幕在线观看 | 亚洲欧美在线观看视频 | 国产在线观看你懂得 | 免费看黄的| 天天操福利视频 | 天天插天天干 | 亚洲成免费 | 丁香婷婷综合五月 | bayu135国产精品视频 | 亚州成人av在线 | 日韩两性视频 | 色婷婷狠狠五月综合天色拍 | 国产精品成人一区二区三区吃奶 | 免费观看国产成人 | 最新精品视频在线 | 国产视频1| 国产91精品一区二区麻豆网站 | 日韩在线观看av | 99视频在线观看免费 | 免费日韩视频 | 四虎影视av | 国产精品免费久久久久久 | 色婷婷狠狠五月综合天色拍 | 久久国产区 | 黄色av播放 | 日本精品久久久久中文字幕 | 狠狠色伊人亚洲综合网站色 | 中文网丁香综合网 | 亚洲欧美日韩国产精品一区午夜 | 99精品国产99久久久久久福利 | 中文字幕视频网站 | 国产一区在线免费观看视频 | 西西www4444大胆视频 | 亚洲午夜精品久久久久久久久 | 亚洲精品视频网站在线观看 | 狠狠狠狠狠狠狠狠干 | 国产精品黄色影片导航在线观看 | 天天鲁一鲁摸一摸爽一爽 | 成人h视频 | 成人综合免费 | 成人免费中文字幕 | 国产无遮挡又黄又爽在线观看 | 欧美日韩99 | 国产精品久久久久久久久搜平片 | 久久精品福利 | 国产精品久久综合 | 九九热国产视频 | 亚洲激情一区二区三区 | 亚洲理论片在线观看 | 黄色小说在线观看视频 | 一级特黄aaa大片在线观看 | 欧美日韩久 | 在线观看成人国产 | 国产日韩中文字幕 | 久久九九影院 | 极品嫩模被强到高潮呻吟91 | se视频网址 | 亚洲精品18p | 激情视频一区 | 欧美精品久久人人躁人人爽 | 国产精品观看 | 最新中文字幕视频 | 国产免费一区二区三区最新6 | 国产精品一区二区三区在线免费观看 | 香蕉久久久久久av成人 | 日韩日韩日韩日韩 | 日韩av中文字幕在线免费观看 | 免费网站污 | 久久久国产视频 | 欧美日韩国产精品爽爽 | 天天操网址 | 免费一级日韩欧美性大片 | 人人干人人超 | 欧美日产一区 | 久久一区国产 | 亚洲精品久久久久中文字幕二区 | 超碰av在线 | 免费看的黄色录像 | 欧美日韩国产精品一区二区三区 | 狠狠操夜夜 | 中文字幕色婷婷在线视频 | 欧美 日韩 视频 | 丁香六月婷婷开心 | 91免费版在线观看 | 97精品伊人| 五月婷婷综合在线观看 | 午夜久久福利视频 | 国产美女免费看 | 国产综合精品一区二区三区 | 国产精品视频99 | 亚洲视频专区在线 | 欧美另类一二三四区 | 就要干b | 日韩欧美精品一区二区 | 特级西西444www大胆高清无视频 | 香蕉手机在线 | 久久综合九色欧美综合狠狠 | 精品久久久久久亚洲综合网站 | 成人av一区二区兰花在线播放 | 国产成人三级在线观看 | 久久综合久久久久88 | 久久免费视频5 | 久久电影日韩 | 99久久精品一区二区成人 | 日韩欧美高清在线 | 中文一区二区三区在线观看 | 五月婷婷av | 五月天综合在线 | 免费的成人av | 国产精品区在线观看 | 欧美一级网站 | 精品成人a区在线观看 | 综合中文字幕 | 色资源网免费观看视频 | 国产麻豆精品免费视频 | 国产91在线播放 | 亚洲精品久久久久久久不卡四虎 | 亚洲1区在线 | 在线播放 日韩专区 | 狠狠狠干狠狠 | 精品一区二区在线免费观看 | 日韩精品欧美一区 | 在线看成人av | 97超碰色偷偷| 亚洲精品乱码白浆高清久久久久久 | 在线观看一二三区 | 亚洲成人av片在线观看 | 麻豆精品在线视频 | 91精品国产自产在线观看永久 | 中文字幕免费高 | 一个色综合网站 | av资源免费观看 | 九九热在线免费观看 | 韩国精品一区二区三区六区色诱 | 天堂av在线网 | 91传媒91久久久 | 亚洲人毛片 | 最新日韩在线观看视频 | 国产高清永久免费 | 国产二区视频在线观看 | 欧洲精品码一区二区三区免费看 | 国产伦理久久精品久久久久_ | 香蕉网站在线观看 | 亚洲婷婷网 | 激情伊人五月天 | 超碰97人 | 婷婷四房综合激情五月 | 玖操 | 天天操天天射天天爽 | 亚洲视频在线视频 | 视频在线观看入口黄最新永久免费国产 | 最近乱久中文字幕 | 国产一级片直播 | 亚洲天堂免费视频 | 国产韩国日本高清视频 | 中文久草 | 美女黄网久久 | 国产97av | 亚洲视频精品 | 天天干天天干天天干天天干天天干天天干 | 丝袜美腿在线视频 | 免费h精品视频在线播放 | 天天色综合1 | 蜜臀av一区二区 | 亚洲精品高清在线 | 久久午夜色播影院免费高清 | 人人干人人搞 | 91亚洲影院| 国产精品美女在线观看 | 午夜精品久久久久久久99 | 成人四虎| 美女视频黄免费的 | 九九热久久久 | 91九色蝌蚪在线 | 五月天丁香综合 | 91午夜精品 | 亚洲最新av网站 | 国产最新福利 | 激情开心色 | 欧美日韩在线第一页 | 黄色片毛片 | 亚洲h在线播放在线观看h | www天天干com| 男女男视频 | 黄色大全免费网站 | 欧美激情综合五月色丁香 | 午夜美女wwww | 黄色一级性片 | 欧美成人h版电影 | a级国产乱理伦片在线观看 亚洲3级 | 午夜精品电影一区二区在线 | 欧美日韩免费在线观看视频 | 国产精品11 | 欧美日韩在线视频观看 | 中文字幕亚洲国产 | 蜜桃视频成人在线观看 | www国产一区 | 国产中的精品av小宝探花 | 国产精品女同一区二区三区久久夜 | 在线观看中文字幕第一页 | 91在线91| 不卡国产在线 | 91污视频在线 | 亚洲黄色片 | 丁香六月天 | 五月开心婷婷网 | 色婷婷电影 | 欧美日韩国产一区 | 国产精品久久久久一区二区三区共 | 精品国产电影 | 丁香婷婷激情国产高清秒播 | 亚洲精品91天天久久人人 | 成人超碰97| 久久免费在线观看视频 | 99精品国产免费久久久久久下载 | 免费在线色电影 | 久久久久影视 | 在线观看视频亚洲 | 亚洲一区二区三区四区在线视频 | 亚洲影视资源 | 狠狠干夜夜操 | 国产精品一区二区三区四区在线观看 | 日韩av免费一区 | 91在线中字 | 在线观看免费av片 | 欧美三级免费 | 中文字幕欧美三区 | 久久免费大片 | 欧亚久久 | 国产色婷婷 | 中文字幕免费观看全部电影 | 伊人伊成久久人综合网站 | 亚洲欧洲国产日韩精品 | 日韩av手机在线看 | 亚洲国产美女精品久久久久∴ | 在线成人高清电影 | 亚洲成a人片在线www | 99热国产在线 | 日日干av | 久久黄色网址 | 免费国产在线精品 | 九九久久精品视频 | 天天操综 |