日韩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负载测试工具的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    91视频中文字幕 | 亚洲涩涩色 | 97网| 免费看一级黄色大全 | 一本一本久久a久久精品综合妖精 | 69精品久久久 | 网站在线观看你们懂的 | 中文字幕在线观看日本 | 国产专区精品视频 | 久久经典视频 | 久艹在线免费观看 | 国产1级毛片 | 最新成人在线 | 麻豆视频免费在线观看 | 超碰免费观看 | 天堂av在线网址 | 日韩剧 | 91视频久久久 | 色片网站在线观看 | 在线a人v观看视频 | 日韩视频1| 超级碰碰碰视频 | 99理论片 | 亚洲精品在线看 | 久久久久女教师免费一区 | 久草视频一区 | 国产日韩精品一区二区 | 亚洲激情六月 | 中文字幕欧美日韩va免费视频 | 天天天干夜夜夜操 | 日本精品一 | 中文字幕免费成人 | 日本99热 | 国产成人综合在线观看 | 久草视频在线免费看 | 精品国产色 | 一区二区三区在线观看中文字幕 | 国产成人精品一区二区三区福利 | 日韩婷婷 | 国产精品99久久久久久有的能看 | 久久精品视频免费 | 国产精品手机视频 | 中文字幕一区二区三区在线视频 | 天天操天天干天天玩 | 日日操操 | 国产一级黄色免费看 | 狠狠操导航 | 在线中文字幕播放 | 四虎影视av | 99热最新精品 | 91高清免费观看 | 亚洲精品国精品久久99热 | 高清av中文在线字幕观看1 | 久精品视频在线 | 日韩在线视频观看 | 中文字幕在线第一页 | 九色在线 | 午夜av在线电影 | av日韩av| 激情视频综合网 | 久久免费看a级毛毛片 | 国产精品久久久久久久久久久杏吧 | 国产精品 国产精品 | 色 免费观看 | 国产精品毛片久久久久久 | 免费看成人av| 亚洲男男gaygayxxxgv | 97自拍超碰| 欧美日韩在线视频免费 | 色综合人人 | 黄色一级在线免费观看 | 国产精品影音先锋 | 成x99人av在线www | 国产精品 久久 | 热精品| 免费看的毛片 | 欧美在线观看视频一区二区三区 | 在线国产视频观看 | 深夜免费福利 | www.夜夜干.com| a资源在线 | 69国产精品视频 | 中文字幕在线专区 | 天天色天天射天天综合网 | 插综合网 | 天天干,天天干 | 五月婷婷丁香色 | 日日日干 | 欧美大片www | 最新不卡av | 欧美激情h| 99精品国产高清在线观看 | 亚洲欧美日韩精品一区二区 | 天海冀一区二区三区 | 91视频在线播放视频 | 亚洲经典视频在线观看 | 91精品国| av在线免费网 | 一区二区三区精品在线视频 | 黄色在线免费观看网站 | 少妇精品久久久一区二区免费 | 国产一区二区精品久久 | 天天射天天添 | 中文字幕国语官网在线视频 | 亚洲精品国产精品乱码在线观看 | 国产精品九色 | 亚洲精品视频在线观看免费 | 中文字幕国内精品 | 午夜精品视频免费在线观看 | 丁香花中文字幕 | 97超碰国产精品 | 亚洲专区欧美专区 | 在线观看免费国产小视频 | 中文字幕在线日亚洲9 | 91久久黄色 | 久久久亚洲网站 | www.com.日本一级 | 婷婷色五| 欧美激情视频一区二区三区 | 亚洲一区精品人人爽人人躁 | 99电影456麻豆 | 欧美日韩91 | 亚洲国产免费看 | 亚洲欧美少妇 | 国产在线超碰 | 丁香电影小说免费视频观看 | 色偷偷人人澡久久超碰69 | 波多野结衣电影一区二区 | 综合黄色网 | 青青河边草免费观看 | 亚洲高清精品在线 | 久草在线资源免费 | 精品一区二区三区香蕉蜜桃 | 久久久91精品国产 | 最近中文字幕高清字幕在线视频 | 区一区二区三区中文字幕 | 久久久www成人免费毛片麻豆 | 精品国产免费一区二区三区五区 | 992tv在线 | www.五月天婷婷 | 欧美日韩不卡在线视频 | 四虎在线免费观看 | 四虎在线视频 | 国产精品视屏 | 九九久久久久久久久激情 | 成人免费一级片 | 亚洲成年片 | 人人爽人人搞 | 色天天天| 亚洲一区日韩在线 | 最新日韩在线观看 | 免费在线观看av片 | 国产美女免费观看 | 久久免费一| 精品国产精品一区二区夜夜嗨 | 中文字幕视频观看 | 国产精品99久久久久的智能播放 | 98精品国产自产在线观看 | 97视频人人澡人人爽 | 国产亚洲精品中文字幕 | 高清av网站 | 国产精品va在线观看入 | 日本中文字幕影院 | 69av免费视频 | 一级黄色片在线播放 | 一区二区视频电影在线观看 | 国产在线日韩 | 韩日电影在线 | 四虎在线观看视频 | 欧美日韩高清在线观看 | 国产夫妻性生活自拍 | 亚洲激情网站免费观看 | 久久久久久久久黄色 | 久久免费视频一区 | 色姑娘综合天天 | 久草网站在线 | 中文字幕在线观看av | 国产对白av | 欧美成人黄色 | 欧美日本不卡高清 | 欧洲色吧 | 波多野结衣视频在线 | 国产精品1000 | 日韩在线理论 | 亚洲精品中文字幕在线观看 | 国产 一区二区三区 在线 | 99精品国产在热久久下载 | 在线日韩精品视频 | 精品久久久久久亚洲综合网 | 国产精品福利在线播放 | 欧美日韩视频免费看 | 亚洲欧美视频在线 | 在线观看v片 | 在线观看日韩中文字幕 | 午夜成人影视 | 久久久网站 | 色婷婷中文 | 99中文在线 | av电影中文字幕在线观看 | 色婷婷国产精品一区在线观看 | 久久夜色精品国产欧美乱 | 日本中文字幕在线视频 | 免费看片网站91 | 97成人在线免费视频 | 日韩精品在线视频免费观看 | 国产无遮挡又黄又爽在线观看 | 日日摸日日添夜夜爽97 | 中文字幕在线成人 | 9999国产| 中文字幕国语官网在线视频 | 成年人免费看片网站 | 福利久久久 | 人人玩人人添人人澡97 | 亚洲五月 | 中文字幕文字幕一区二区 | 久草在线在线视频 | 国产传媒中文字幕 | 精品xxx | 国产精品18久久久久久久网站 | 亚洲欧美日韩一二三区 | 91久久久久久国产精品 | 91精品久久久久久久久 | 91精品电影 | 国产精品12345| 国产美女网 | 国产成人一二片 | 九九精品无码 | 夜夜高潮夜夜爽国产伦精品 | 国产一区在线看 | 天天色天天色天天色 | 青草视频在线 | 在线观看的av网站 | 欧美精品一区二区三区四区在线 | 国产精品va最新国产精品视频 | 日韩视频一区二区三区 | 国产一级91| 亚洲综合激情五月 | 成人久久电影 | 久久亚洲综合国产精品99麻豆的功能介绍 | 国产一区二区三区四区大秀 | 亚洲经典视频在线观看 | 四虎影视国产精品免费久久 | 五月花丁香婷婷 | 精品国产乱码久久久久久1区二区 | 超碰97在线资源 | 婷婷开心久久网 | 日韩在线观看一区二区 | 国产 字幕 制服 中文 在线 | 久久成人资源 | 成人高清在线 | 国产精品中文久久久久久久 | 亚洲精品午夜aaa久久久 | 国产精品毛片完整版 | 精品国模一区二区三区 | 成人免费在线视频 | 精品免费99久久 | 国产美女久久久 | 91亚洲精品乱码久久久久久蜜桃 | 久久亚洲美女 | 日韩一区精品 | 免费在线观看黄色网 | 91精品亚洲影视在线观看 | 亚洲欧美日韩国产一区二区 | 在线观看成人av | 国产欧美在线一区二区三区 | 在线免费试看 | 91精品爽啪蜜夜国产在线播放 | 婷婷丁香六月天 | 国产成人久久av977小说 | 伊人天天综合 | 国产精品久久电影网 | 欧美日韩国产色综合一二三四 | 久久久久欧美精品999 | 亚洲综合色播 | 日本黄色免费大片 | 久久国产精品免费一区 | 中文字幕av网站 | 午夜视频欧美 | 国产一级黄色av | 91精品麻豆 | 激情五月伊人 | 午夜精品一区二区国产 | 成年人在线观看 | 狠狠狠狠狠狠干 | 成人播放器 | 亚洲涩涩色 | 在线看一区二区 | 国产日韩精品一区二区在线观看播放 | 成年人在线观看视频免费 | 国产一级视频在线 | 97超碰中文 | 午夜国产福利视频 | 国产五月婷 | 中文在线天堂资源 | 一级黄色大片 | 一区二区三区久久 | 99久久夜色精品国产亚洲96 | 97天堂网| 久久久久久蜜av免费网站 | 国产精品福利无圣光在线一区 | 九九免费观看全部免费视频 | 免费成人在线电影 | 国产精品久久片 | 国产在线国偷精品产拍 | 99久久精品免费看国产麻豆 | 国产精品99免费看 | 国产精品成人一区二区三区吃奶 | 2021国产在线视频 | 婷婷六月网 | 久久综合久久综合这里只有精品 | 亚洲激情小视频 | 久艹在线免费观看 | 国产一区视频免费在线观看 | 狠狠狠色丁香婷婷综合久久88 | 九九热在线观看视频 | 午夜视频99 | av日韩中文 | 亚洲精品美女在线观看播放 | 久久精品一二区 | 色视频网址 | 日日爱av | 国产黄在线播放 | 亚洲精品一区二区在线观看 | 亚洲成av人片在线观看www | 国产日韩一区在线 | www视频免费在线观看 | 久久黄视频| 日韩在线免费高清视频 | 日韩在线二区 | 色爱成人网 | 久草视频首页 | 99视频免费看 | 国产高清福利在线 | 超碰97人人爱 | 97超碰资源| 免费观看福利视频 | 最近中文字幕免费av | 国内精品久久久久影院男同志 | 国产精品永久免费在线 | 99视频在线观看一区三区 | 高清av免费一区中文字幕 | 日本中文字幕在线 | 99久久er热在这里只有精品15 | 亚洲三级黄色 | 午夜国产在线观看 | 久久久亚洲影院 | 欧美激情视频在线免费观看 | 91久久丝袜国产露脸动漫 | 夜夜视频欧洲 | 久草资源免费 | 99爱视频在线观看 | 久久精品一区二区国产 | 一级欧美一级日韩 | 精品久久久久久久久久国产 | 99视频精品在线 | 在线 国产 日韩 | 六月婷婷久香在线视频 | 九九九九九九精品 | 在线色亚洲 | 精品一区二区在线免费观看 | 国产麻豆电影在线观看 | 中文字幕亚洲精品在线观看 | 四川bbb搡bbb爽爽视频 | 91久久久久久久一区二区 | 最新国产一区二区三区 | 91成人国产 | 国产中文字幕一区二区 | 国产a级精品 | 四月婷婷在线观看 | 国产视频在线播放 | 久久艹久久 | 97成人精品视频在线播放 | 亚洲欧美观看 | 午夜美女福利直播 | 亚洲午夜久久久久久久久久久 | 国产视频一区二区在线观看 | 91精品人成在线观看 | 91视视频在线直接观看在线看网页在线看 | 免费在线观看一区 | 热re99久久精品国产99热 | 国内视频在线 | 成人wwwxxx视频 | 日本三级中文字幕在线观看 | 亚洲区另类春色综合小说 | 成人免费视频网址 | 国产成人精品久久久久 | 久草手机视频 | 狠狠狠狠狠狠操 | 国产精品久久久久久久久久不蜜月 | 久久人人爽爽人人爽人人片av | 日本久久免费视频 | 五月天激情婷婷 | 国内精品久久久久影院男同志 | 成人午夜电影免费在线观看 | 黄色一级网 | 国产精品不卡av | 欧美黄色特级片 | 韩国一区视频 | 日韩高清免费在线 | 久久成人麻豆午夜电影 | 99re国产视频 | 久草在线视频看看 | 久久久久久黄色 | 日本中文乱码卡一卡二新区 | 人人人爽 | 亚洲欧美一区二区三区孕妇写真 | 6080yy精品一区二区三区 | 四虎在线免费观看 | 日韩精品在线观看av | 日韩精品综合在线 | 国产亚洲精品电影 | 国产精品高清在线 | 激情黄色一级片 | 在线免费观看欧美日韩 | 黄色中文字幕在线 | 天天视频色版 | 97人人超碰在线 | 黄色官网在线观看 | 久久精品国产免费看久久精品 | 久草观看视频 | 亚洲精品午夜久久久久久久久久久 | 欧美色888| www.av在线播放 | 白丝av免费观看 | 久久观看免费视频 | 国产一区在线免费观看视频 | 五月天视频网 | 激情xxxx| 国产精品毛片 | 欧美贵妇性狂欢 | 麻豆一区二区三区视频 | 国产一级视频在线免费观看 | 特级a毛片| 亚洲人成人天堂h久久 | 日韩在线第一区 | 97av超碰| 久久人网 | 免费在线精品视频 | 中文字幕 影院 | 免费黄色一区 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 国产亚洲精品bv在线观看 | 日本精品在线看 | 国产又粗又猛又色又黄视频 | 亚洲欧美婷婷六月色综合 | 成年人视频免费在线 | 在线看91| 国产黄网站在线观看 | 99热这里精品| 日日爱av| 五月婷婷开心中文字幕 | 亚洲第一伊人 | 亚洲精品白浆高清久久久久久 | 国产一区二区三区四区在线 | 日日干 天天干 | 婷婷综合网 | 亚洲欧洲一区二区在线观看 | 日韩在线观看三区 | 婷婷六月天天 | www.97色.com| 黄色官网在线观看 | 色五月成人 | 欧美精品久久人人躁人人爽 | av高清一区二区三区 | 黄色av电影在线观看 | 免费看三片| 狠狠躁日日躁狂躁夜夜躁 | 99视频国产在线 | 91aaa在线观看 | 亚洲视频一级 | 久久国产免 | 国产精品无av码在线观看 | 在线观看av中文字幕 | 黄色小视频在线观看免费 | 91在线看视频 | 99精品欧美一区二区蜜桃免费 | av在线色| 美女一区网站 | 亚洲日韩欧美视频 | 精品国产欧美 | 久久一本综合 | 黄色一级在线观看 | 亚洲精品国产精品乱码不99热 | 国产精品久久久久久一区二区三区 | 国产一级免费观看 | 日韩色区 | 欧美精品黑人性xxxx | 国产精品99免费看 | 韩国在线视频一区 | 国产亚洲午夜高清国产拍精品 | 日韩av一区二区三区四区 | 久久美女免费视频 | 亚洲午夜精品久久久久久久久久久久 | 中文字幕一区二区三区在线观看 | 午夜成人免费影院 | 高清精品久久 | 伊人网站 | 亚洲精品视频在线免费播放 | 在线观看av免费 | 欧美日韩中 | 久久99在线视频 | 九九日韩 | 黄网站色成年免费观看 | 日韩欧美在线综合网 | 日韩av福利在线 | 国产伦理一区二区三区 | 久草免费在线观看视频 | 久久精品综合 | 91精品啪啪| 中文字幕在线免费看 | 在线岛国av | 成人黄色视 | 亚洲欧美在线视频免费 | 九九精品视频在线观看 | 中文字幕在线观看第二页 | 久久久av免费| a级免费观看 | 在线看国产精品 | 亚洲免费小视频 | 国产一区二区三区免费在线 | 亚洲第一av在线 | 91香蕉视频污在线 | 精品国产aⅴ一区二区三区 在线直播av | 国产高清免费观看 | 国语精品免费视频 | 日韩欧美69 | av网站在线免费观看 | 日韩高清激情 | 久久精美视频 | 热久久99这里有精品 | 午夜精品久久久久久久久久 | 国产精品区免费视频 | 国产精品久久久久一区二区国产 | 五月婷婷网站 | 西西人体4444www高清视频 | 色婷婷在线观看视频 | 久久精品99国产 | 日本久久不卡视频 | 亚洲伊人色 | 国产午夜精品一区二区三区在线观看 | 成人免费网站在线观看 | 欧洲精品在线视频 | 欧美成人黄色 | 久久久精品午夜 | 亚洲涩综合 | 日韩特级黄色片 | 国产精品毛片完整版 | 久久人人爽人人人人片 | www99久久 | 最近中文字幕久久 | ,午夜性刺激免费看视频 | 超碰com| 黄色片网站av | 国产精品久久久久久久电影 | 菠萝菠萝在线精品视频 | 91在线视频在线 | 看片网站黄 | 精品在线视频一区二区三区 | 夜夜躁日日躁狠狠久久av | 亚洲成人欧美 | 99精品在线免费 | 欧美天天射 | 99精品国产一区二区三区不卡 | 亚洲精品女人久久久 | 久一在线 | 私人av| 欧洲一区二区在线观看 | 美女久久视频 | 久久综合欧美精品亚洲一区 | 激情综合啪 | 欧美在线aaa | 日韩成人一级大片 | 久久久久国产精品视频 | 国产精品一区在线观看 | 九九免费观看全部免费视频 | 超碰97免费| 特及黄色片 | 免费看的av片 | 亚洲综合在线播放 | 成人av在线亚洲 | 欧美激情综合五月色丁香 | 国产精品日韩欧美 | 国产精品婷婷 | 97超碰中文字幕 | 美女激情影院 | 综合网在线视频 | 日韩av一区二区三区 | 国产成人三级三级三级97 | 国产精品av一区二区 | 久久艹在线观看 | 日本视频不卡 | 五月天综合网站 | 一区二区三区免费播放 | 一本之道乱码区 | 在线免费观看国产视频 | 久久精品视频在线看 | 美女免费视频网站 | 一区二区 不卡 | 麻豆国产精品永久免费视频 | 韩日精品在线观看 | 一二三精品视频 | 国产精品福利午夜在线观看 | 九色精品免费永久在线 | 欧美精品久久 | 婷婷六月网 | 国产精品久久久999 国产91九色视频 | 亚洲精品美女在线观看播放 | 国产精品99久久久久人中文网介绍 | 亚洲精品乱码白浆高清久久久久久 | 少妇bbw撒尿 | 亚洲视频aaa| 久久系列 | 国产精品手机在线 | 亚洲一区黄色 | 黄色激情网址 | 欧美一区二区伦理片 | 亚洲丁香久久久 | 成人av av在线 | 极品久久久 | 精品国产乱码久久久久久久 | 精品久久久久久亚洲综合网 | 又黄又爽又刺激的视频 | 天天射天天射 | av日韩在线网站 | 91人人澡人人爽人人精品 | 在线观看完整版免费 | 国产精品视频在线看 | 少妇性xxx| 97av精品| 超碰成人网 | 国产精品久久久久久久久久东京 | 久久成人精品电影 | 免费电影一区二区三区 | 在线观看日韩免费视频 | 香蕉视频久久久 | av中文字幕在线观看网站 | 国产精品久久久久久高潮 | 美女福利视频网 | 日韩午夜av| 久久久久麻豆v国产 | 欧美天天射 | 不卡av在线免费观看 | 久久成人一区 | 婷婷伊人综合 | 欧美一区二区三区四区夜夜大片 | 久久精品国产免费看久久精品 | 99久久er热在这里只有精品15 | 91av免费看 | 久久亚洲精品国产亚洲老地址 | 狠狠色丁香久久婷婷综合五月 | 精品一区二区在线免费观看 | 99久久99精品 | 在线观看色视频 | 国产一区在线视频 | 在线导航av | 国产尤物在线 | 中文字幕在线观看视频一区二区三区 | 超碰九九 | 久久中文字幕在线视频 | 日日弄天天弄美女bbbb | www.狠狠色| 91福利视频免费 | 麻豆一区在线观看 | 日韩精品一区二区在线视频 | 午夜视频在线观看一区二区三区 | 91成人看片| 欧美日韩亚洲精品在线 | 精品99免费| 久久国产精品久久国产精品 | 亚洲视频中文 | 国产精品久久久久一区二区三区共 | 亚洲免费高清视频 | 狠狠网站| 久草com | 欧美xxxx性xxxxx高清 | 国产剧情av在线播放 | 天天爱天天草 | 国产精品a成v人在线播放 | 成人va天堂| 亚洲欧美成人综合 | 亚色视频在线观看 | 91在线小视频 | 美女黄频在线观看 | 国产福利小视频在线 | 成人午夜剧场在线观看 | 亚洲a资源| 日韩免费在线看 | 日本中文字幕在线电影 | 骄小bbw搡bbbb揉bbbb | 在线观看av中文字幕 | 日韩在线观看影院 | 久久久九色精品国产一区二区三区 | 久草精品在线观看 | 91久久久久久久 | 1024手机看片国产 | 精品国产免费一区二区三区五区 | 国产手机av在线 | 免费观看一级特黄欧美大片 | 一区二区三区视频网站 | 成人午夜电影在线观看 | 五月天激情视频在线观看 | 精品国产一区二区三区四区vr | 久草免费在线 | 在线 影视 一区 | 在线小视频你懂的 | 国语久久 | 天天色天天 | 欧美日韩一区二区久久 | av黄色av| 色五丁香 | 视频国产一区二区三区 | 日韩美女免费线视频 | 深夜免费小视频 | www.com黄色| 国产一区二区在线观看视频 | 99精品一区二区 | 日本久久高清视频 | 国产精品一区二区av日韩在线 | 麻豆手机在线 | 99999精品视频 | 一本大道久久精品懂色aⅴ 五月婷社区 | 日日夜夜天天 | 色婷婷久久 | 一区二区三区精品在线视频 | 精品九九九 | 久久精品99国产精品日本 | 久久一区二区三区四区 | 久草在在线 | zzijzzij日本成熟少妇 | 99精品国产福利在线观看免费 | 色网站免费在线观看 | 亚洲精品一区二区网址 | 在线精品观看国产 | 成人av一级片 | 青青五月天 | 久久久91精品国产一区二区精品 | 国产91丝袜在线播放动漫 | 国产香蕉97碰碰久久人人 | 国产精品中文在线 | 久久99精品久久久久久久久久久久 | 激情伊人五月天 | 国产色区| 成人av一区二区在线观看 | 久久伦理电影 | 在线观看成人国产 | 欧洲亚洲激情 | 激情文学综合丁香 | 成人在线观看免费视频 | 夜夜躁狠狠躁日日躁视频黑人 | 中文字幕亚洲精品日韩 | 91porny九色在线播放 | 免费观看一级视频 | 在线观看一区视频 | 国产亚洲精品久久网站 | 免费麻豆 | 三级动图 | 国产精品国内免费一区二区三区 | 国产精品不卡av | 超碰99在线 | av三区在线 | 亚洲欧美日韩国产一区二区 | 精品国产片 | 亚洲精品456在线播放第一页 | 韩国精品福利一区二区三区 | 欧美日韩国产在线观看 | av一区二区三区在线播放 | 日韩理论影院 | 久99久在线视频 | 欧美日韩有码 | 亚洲精品国产精品国自产观看 | 美女视频是黄的免费观看 | 久久理论电影网 | 日韩欧美亚州 | 二区在线播放 | 国产福利在线免费 | 婷婷激情综合五月天 | 亚洲在线色 | 久插视频 | 欧美经典久久 | 日韩三级.com | 国产小视频你懂的在线 | 精品亚洲一区二区 | 91精品久久久久久久99蜜桃 | 成人va视频 | 在线观看免费视频 | 日本 在线 视频 中文 有码 | 播五月婷婷 | 97av视频 | 96亚洲精品久久 | www.99久久.com | 久久中文精品视频 | 成人网在线免费视频 | 伊人久在线 | 精品久久99 | 日韩成人一级大片 | 午夜久久久久 | 在线看毛片网站 | 久久婷婷综合激情 | 欧美乱熟臀69xxxxxx | 色婷婷综合久色 | 日韩一区二区三区不卡 | 久久成年人视频 | 91网页版在线观看 | 欧美伦理一区二区三区 | 正在播放日韩 | 在线观看视频亚洲 | 69久久久久久久 | 国产在线观看二区 | 最近中文字幕国语免费av | 国产又黄又爽又猛视频日本 | 亚洲影院天堂 | 99久久99久国产黄毛片 | 国产成人久久av | 亚洲国产欧美一区二区三区丁香婷 | 中文字幕在线播放一区二区 | 国产成人精品一区二区在线观看 | 久久99热这里只有精品国产 | 在线免费观看黄 | 麻豆国产网站 | 亚洲国产69 | 久久免费国产电影 | 天天天色 | 中文在线字幕免费观 | 久在线观看视频 | 色视频在线观看 | 中文不卡视频在线 | av夜夜操| 手机av看片 | 午夜久久久久久久久 | 久久丁香 | 久久午夜精品影院一区 | 婷婷在线网站 | 日日干av | 日韩免费电影在线观看 | 久久不见久久见免费影院 | 玖操| 国产精品久久久久一区二区 | 国产超碰97 | 免费av网站在线 | 91资源在线观看 | 亚洲高清激情 | 久久久久国产一区二区 | 精品三级av| 福利一区二区三区四区 | 亚洲精品欧洲精品 | 天天操天天操天天操 | 五月天激情综合 | 三上悠亚在线免费 | 国产精久久久 | 日韩在线一二三区 | 久久精品99国产精品日本 | 91色九色| 国产精品欧美一区二区三区不卡 | www.com在线观看 | 国产精品久久久久久久久免费 | 国产成人av | 亚洲黄污| 亚洲高清网站 | 久久久久黄色 | 成年人网站免费观看 | 最近中文字幕mv | 欧美日韩国产在线 | 又黄又爽又色无遮挡免费 | 97看片网 | 91成人免费在线视频 | 麻豆系列在线观看 | 国产资源网| 日韩欧美综合视频 | 日韩免费福利 | 国产91av视频在线观看 | 日本公妇在线观看高清 | 日韩av一区二区三区在线观看 | 国产精品久久久区三区天天噜 | 日本久久免费电影 | 人人爽人人爽人人片av免 | 97视频在线观看播放 | 欧美日韩3p | 毛片永久新网址首页 | av在线超碰 | 精品国产乱码久久久久久三级人 | 欧美专区国产专区 | 射射射av| 婷婷成人综合 | 日日日爽爽爽 | 国产精品男女啪啪 | 麻豆视频在线免费看 | 欧洲视频一区 | 午夜美女福利直播 | 久久综合久久综合这里只有精品 | 一本一本久久aa综合精品 | 综合色综合色 | 一本到视频在线观看 | 日日干天天插 | 国内揄拍国产精品 | 久久影视一区二区 | 日本在线中文在线 | 国产小视频你懂的在线 | 干狠狠| 国产视频二 | 新版资源中文在线观看 | 狠狠久久综合 | 97精品久久 | 欧美日韩国产成人 | 六月丁香婷 | 九九热视频在线 | 91视频久久久久久 | 人人插人人舔 | 五月天av在线 | 免费看黄色毛片 | 日韩成人免费在线观看 | 福利二区视频 | 欧美精品在线一区 | 九九九九九国产 | 国产精品免费一区二区三区在线观看 | 在线91av | 美女精品久久久 | 制服丝袜亚洲 | 亚洲理论电影 | 中文字幕在线观看免费高清完整版 | 日韩欧美一区二区三区在线观看 | 国产视频高清 | 欧美精品日韩 | 免费的黄色的网站 | 中国一级片在线观看 | 丁香六月网| 人人人爽 | av免费播放 | 欧美一级久久久 | 国产精品1区 | 亚洲爱爱视频 | 女人高潮一级片 | 国产美女在线精品免费观看 | 国产精品初高中精品久久 | 亚洲人成网站精品片在线观看 | 亚洲综合五月天 | 国产第一页福利影院 | 亚洲一区二区三区四区精品 | 黄色大片免费播放 | 玖玖在线精品 | 精品久久久久久久 | 精品久久久一区二区 | 久久久久久高潮国产精品视 | www.久艹 | 久久国内精品99久久6app | 国产一区二区不卡在线 | 草久在线 | 国产精品久久久精品 | 国产成人精品999 | 麻豆你懂的 | 日韩在线观 | 人人搞人人爽 | 国产成人精品亚洲日本在线观看 | 狠狠色丁香婷婷综合久小说久 | 国产白浆视频 | 免费看黄在线观看 | 国产不卡av在线播放 | 成人精品视频久久久久 | 91成熟丰满女人少妇 | 久久综合五月天婷婷伊人 | 激情五月婷婷激情 | 国产一区二区中文字幕 | 精品久久一区二区三区 | 日女人免费视频 | 久久69精品 | 美女视频黄网站 | 久久天天躁狠狠躁亚洲综合公司 | 中文字幕在线一区二区三区 | 国内成人精品视频 | 日韩在线视频网站 | 91精品久久久久久久91蜜桃 | 99久久精品午夜一区二区小说 | 国产精品一码二码三码在线 | 精品国产一区二区三区久久久蜜月 | 国产精品久免费的黄网站 | 久久久久久久久久久综合 | 亚a在线| 蜜桃视频色 | 永久免费毛片在线观看 | 一级黄色在线免费观看 | 伊人久久国产 | 成人av在线网 | 91色在线观看 | 深爱激情开心 | 又湿又紧又大又爽a视频国产 | 在线免费三级 | 欧美精品免费视频 | 亚洲天堂精品视频在线观看 | 色wwwww| 亚洲综合射 | 天天操夜夜做 | 欧美成人手机版 | 在线 欧美 日韩 | 草久在线播放 | 精品国模一区二区 | 999久久久久久久久6666 | 久久精品视频在线免费观看 | 91精品国产自产在线观看永久 | 四川妇女搡bbbb搡bbbb搡 |