91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在Android中使用 asmack 實現文件的接收和發送

發布時間:2020-10-24 05:33:59 來源:網絡 閱讀:6583 作者:安靜的瘋子 欄目:移動開發

本篇主要是基于最近幫助朋友在 Android 中使用 asmack 庫實現文件的接收和發送 功能時,寫了個參考示例,這里做個記錄,以便于自己以后參考。


文件傳輸相關的XEP協議參考:

2XEP-0095StreamInitiation: http://xmpp.org/extensions/xep-0095.html

2XEP-0096SI FileTransfer: http://xmpp.org/extensions/xep-0096.html

2XEP-0030ServiceDiscovery: http://xmpp.org/extensions/xep-0030.html

2XEP-0065SOCKS5Bytestreams: http://xmpp.org/extensions/xep-0065.html

2XEP-0066Out of BandData: http://xmpp.org/extensions/xep-0066.html

2XEP-0047In-BandBytestreams: http://xmpp.org/extensions/xep-0047.html


本實例中主要采用的是SI + IBB 的方式發送和接收文件。


1,首先在連接和登錄之前設置 ProviderManager,同時設置好全局的文件傳輸管理器(FileTransferManager) fileTransferManager,如下:


   /**
      *
登錄 IM 服務器,同時負責  連接 和 登錄
      */
     public boolean login(String user, String password)
     {
         ConnectionConfiguration conf = new  ConnectionConfiguration(
                  IM_HOST, IM_PORT, IM_SERVICE_NAME);
         conf.setDebuggerEnabled(true);
         conf.setCompressionEnabled(false);
         conf.setSendPresence(true);
          conf.setSASLAuthenticationEnabled(false);
          conf.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
         connection = new  XMPPConnection(conf);

         ProviderManager pm =  ProviderManager.getInstance();

         // Private Data Storage
          pm.addIQProvider("query", "jabber:iq:private", new  PrivateDataManager.PrivateDataIQProvider());

         // Roster Exchange
          pm.addExtensionProvider("x", "jabber:x:roster", new  RosterExchangeProvider());

         // Message Events
          pm.addExtensionProvider("x", "jabber:x:event", new  MessageEventProvider());

         // Chat State
          pm.addExtensionProvider("active",  "http://jabber.org/protocol/chatstates", new  ChatStateExtension.Provider());
          pm.addExtensionProvider("composing",  "http://jabber.org/protocol/chatstates", new  ChatStateExtension.Provider());
          pm.addExtensionProvider("paused",  "http://jabber.org/protocol/chatstates", new  ChatStateExtension.Provider());
         pm.addExtensionProvider("inactive",  "http://jabber.org/protocol/chatstates", new  ChatStateExtension.Provider());
          pm.addExtensionProvider("gone",  "http://jabber.org/protocol/chatstates", new  ChatStateExtension.Provider());

         // XHTML
         pm.addExtensionProvider("html",  "http://jabber.org/protocol/xhtml-im", new  XHTMLExtensionProvider());

         // Group Chat Invitations
          pm.addExtensionProvider("x", "jabber:x:conference", new  GroupChatInvitation.Provider());

         // Service Discovery # Items
          pm.addIQProvider("query",  "http://jabber.org/protocol/disco#items", new  DiscoverItemsProvider());

         // Service Discovery # Info
          pm.addIQProvider("query",  "http://jabber.org/protocol/disco#info", new DiscoverInfoProvider());

         // Data Forms
          pm.addExtensionProvider("x", "jabber:x:data", new  DataFormProvider());

         // MUC User
          pm.addExtensionProvider("x",  "http://jabber.org/protocol/muc#user", new MUCUserProvider());

         // MUC Admin
          pm.addIQProvider("query",  "http://jabber.org/protocol/muc#admin", new MUCAdminProvider());

         // MUC Owner
          pm.addIQProvider("query",  "http://jabber.org/protocol/muc#owner", new MUCOwnerProvider());

         // Delayed Delivery
         pm.addExtensionProvider("x",  "jabber:x:delay", new DelayInformationProvider());

         // Version
         try {
              pm.addIQProvider("query", "jabber:iq:version",
                      Class.forName("org.jivesoftware.smackx.packet.Version"));
         } catch (ClassNotFoundException e)  {
             // Not  sure what's happening here.
         }

         // VCard
          pm.addIQProvider("vCard", "vcard-temp", new  VCardProvider());

         // Offline Message Requests
          pm.addIQProvider("offline", "http://jabber.org/protocol/offline",  new OfflineMessageRequest.Provider());

         // Offline Message Indicator
          pm.addExtensionProvider("offline",  "http://jabber.org/protocol/offline", new  OfflineMessageInfo.Provider());

         // Last Activity
          pm.addIQProvider("query", "jabber:iq:last", new  LastActivity.Provider());

         // User Search
          pm.addIQProvider("query", "jabber:iq:search", new  UserSearch.Provider());

         // SharedGroupsInfo
          pm.addIQProvider("sharedgroup", "http://www.jivesoftware.org/protocol/sharedgroup",  new SharedGroupsInfo.Provider());

         // JEP-33: Extended Stanza  Addressing
          pm.addExtensionProvider("addresses",  "http://jabber.org/protocol/address", new  MultipleAddressesProvider());

// FileTransfer
         pm.addIQProvider("si",  "http://jabber.org/protocol/si", new StreamInitiationProvider());
          pm.addIQProvider("query",  "http://jabber.org/protocol/bytestreams", new  BytestreamsProvider());


         // Privacy
         pm.addIQProvider("query",  "jabber:iq:privacy", new PrivacyProvider());

          pm.addIQProvider("command",  "http://jabber.org/protocol/commands",
                  new AdHocCommandDataProvider());

          pm.addExtensionProvider("malformed-action",
                  "http://jabber.org/protocol/commands",
                  new AdHocCommandDataProvider.MalformedActionError());

          pm.addExtensionProvider("bad-locale",
                  "http://jabber.org/protocol/commands",
                  new AdHocCommandDataProvider.BadLocaleError());

          pm.addExtensionProvider("bad-payload",
                  "http://jabber.org/protocol/commands",
                  new AdHocCommandDataProvider.BadPayloadError());

          pm.addExtensionProvider("bad-sessionid",
                  "http://jabber.org/protocol/commands",
                  new AdHocCommandDataProvider.BadSessionIDError());

          pm.addExtensionProvider("session-expired",
                  "http://jabber.org/protocol/commands",
                  new AdHocCommandDataProvider.SessionExpiredError());

         try
         {
              connection.connect();
              connection.login(user, password);
         }
         catch (XMPPException e)
         {
              e.printStackTrace();
             connection  = null;
             return  false;
         }

         fileTransferManager = new  FileTransferManager(connection);
         ServiceDiscoveryManager sdm =  ServiceDiscoveryManager.getInstanceFor(connection);
         if (sdm == null)
             sdm = new  ServiceDiscoveryManager(connection);
          sdm.addFeature("http://jabber.org/protocol/disco#info");
          sdm.addFeature("jabber:iq:privacy");
          FileTransferNegotiator.setServiceEnabled(connection, true);
         return true;
     }


2,發送文件,如下:


           Button btnSendFile  = (Button) rootView.findViewById(R.id.send_file_btn);
              btnSendFile.setOnClickListener(new View.OnClickListener()
             {
                  @Override
                  public void onClick(View v)
                  {
                      Toast.makeText(getActivity(), "send file",  Toast.LENGTH_SHORT).show();
new SendFileTask().execute(new Uri[]{ uriFile });
                  }
             });

 //
將發送文件的操作采用 AsyncTask 的方式實現(SendFileTask):
     public class SendFileTask extends AsyncTask<Uri, Integer,  Long> {

         @Override
         protected Long  doInBackground(Uri... params) {

             if  (params.length < 1) {
                  return Long.valueOf(-1);
             }

             Uri  uriFile = params[0];
              FileTransferManager ftm = MainHelloIM.getInstance().getFileTransferManager();
             if (ftm !=  null)
             {
OutgoingFileTransfer oft =  ftm.createOutgoingFileTransfer("blue@test.cn/Spark");
                  try
                  {
                      String[] proj = { MediaStore.Images.Media.DATA };
                      Cursor actualp_w_picpathcursor = managedQuery(uriFile,proj,null,null,null);
                      int actual_p_w_picpath_column_index
                              = actualp_w_picpathcursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                      actualp_w_picpathcursor.moveToFirst();
                      String filePath = actualp_w_picpathcursor.getString(actual_p_w_picpath_column_index);
                      File fileToSend = new File(filePath);
                      if (fileToSend.exists())
                      {
oft.sendFile(fileToSend, "recv my file!");
                          while (!oft.isDone())
                          {
                              if (oft.getStatus().equals(FileTransfer.Status.error))
                              {
                                  Log.e(TAG, "send failed");
                              }
                              else
                              {
                                  Log.i(TAG, "status:" + oft.getStatus() + "|progress:" +  oft.getProgress());
                              }
                              Thread.sleep(1000);
                          }
                      }
                  }
                  catch (XMPPException e)
                  {
                      e.printStackTrace();
                  }
                  catch (InterruptedException e)
                  {
                      e.printStackTrace();
                  }
             }

             return  Long.valueOf(0);
         }
     }


3,接收文件,主要通過設置 文件傳輸監聽器 來實現:


            FileTransferManager ftm = MainHelloIM.getInstance().getFileTransferManager();
ftm.addFileTransferListener(new FileTransferListener()
             {
                  @Override
                  public void fileTransferRequest(FileTransferRequest fileTransferRequest)
                  {
                      Log.i(TAG, "has file");
IncomingFileTransfer transfer =  fileTransferRequest.accept();
                      File sdDir = Environment.getExternalStorageDirectory();
                      String filePath = sdDir.toString() + "/" +  fileTransferRequest.getFileName();
                      try
                      {
transfer.recieveFile(new File(filePath));
                      }
                      catch (XMPPException e)
                      {
                          e.printStackTrace();
                      }
                  }
             });


下面為完整的文件傳輸的消息交互流程:



 /**
 *
前面主要遵循標準 XEP-0095 來協商采用的文件傳輸方式
 */

//----- negotiation profile and stream

hhy -> blue
// hhy 需要發送 p_w_picpath/png 格式的文件 bookCater.png 給 blue
 <iq id="VFDHn-4" to="blue@sharexun.cn/Spark"  from="hhy@sharexun.cn/Smack" type="set">
     <si xmlns="http://jabber.org/protocol/si"
         id="jsi_7839940461539037483"
         mime-type="p_w_picpath/png"
          profile="http://jabber.org/protocol/si/profile/file-transfer">
         <file  xmlns="https://cache.yisu.com/upload/information/20200311/46/202455.jpg" size="448" >
              <desc>recv my file!</desc>
         </file>
         <feature  xmlns="http://jabber.org/protocol/feature-neg">
             <x  xmlns="jabber:x:data" type="form">
                  <field var="stream-method" type="list-single">
                      <option>
                          <value>http://jabber.org/protocol/bytestreams</value>
                      </option>
                      <option>
                          <value>http://jabber.org/protocol/ibb</value>
                      </option>
                  </field>
             </x>
         </feature>
     </si>
 </iq>

blue -> hhy
// blue 返回的結果顯示 blue 支持 bytestreams 和 ibb 兩種方式傳輸文件
 <iq id="VFDHn-4" to="hhy@sharexun.cn/Smack"  from="blue@sharexun.cn/Spark" type="result">
     <si xmlns="http://jabber.org/protocol/si">
         <feature  xmlns="http://jabber.org/protocol/feature-neg">
             <x  xmlns="jabber:x:data" type="submit">
                  <field var="stream-method">
                      <value>http://jabber.org/protocol/bytestreams</value>
                      <value>http://jabber.org/protocol/ibb</value>
                  </field>
             </x>
         </feature>
     </si>
 </iq>

//----- service discovery

hhy -> blue
 <iq id="VFDHn-5" to="blue@sharexun.cn/Spark"  type="get">
     <query xmlns="http://jabber.org/protocol/disco#info"></query>
 </iq>

blue -> hhy
 <iq id="VFDHn-5" to="hhy@sharexun.cn/Smack"  type="result" from="blue@sharexun.cn/Spark">
     <query  xmlns="http://jabber.org/protocol/disco#info">
         <identity  category="client" name="Smack" type="pc"/>
         <feature  var="http://jabber.org/protocol/xhtml-im"/>
         <feature  var="http://jabber.org/protocol/muc"/>
         <feature  var="http://jabber.org/protocol/bytestreams"/>
         <feature  var="http://jabber.org/protocol/commands"/>
         <feature var="http://jabber.org/protocol/si/profile/file-transfer"/>
         <feature  var="http://jabber.org/protocol/si"/>
         <feature  var="http://jabber.org/protocol/ibb"/>
     </query>
 </iq>

hhy -> [server]
 <iq id="VFDHn-6" to="sharexun.cn"  type="get">
     <query  xmlns="http://jabber.org/protocol/disco#items"></query>
 </iq>

blue -> hhy
 <iq id="VFDHn-5" to="hhy@sharexun.cn/Smack"  type="result" from="blue@sharexun.cn/Spark">
     <query  xmlns="http://jabber.org/protocol/disco#info">
         <identity category="client"  name="Smack" type="pc"/>
         <feature  var="http://www.xmpp.org/extensions/xep-0166.html#ns"/>
         <feature  var="urn:xmpp:tmp:jingle"/>
     </query>
 </iq>

[server] -> hhy
 <iq type="result" id="VFDHn-6"  from="sharexun.cn" to="hhy@sharexun.cn/Smack">
     <query  xmlns="http://jabber.org/protocol/disco#items">
         <item  jid="proxy.sharexun.cn" name="Socks 5 Bytestreams  Proxy"/>
         <item  jid="pubsub.sharexun.cn" name="Publish-Subscribe  service"/>
         <item  jid="search.sharexun.cn" name="User Search"/>
         <item  jid="conference.sharexun.cn" name="............"/>
     </query>
 </iq>

hhy -> [server proxy]
 <iq id="VFDHn-7" to="proxy.sharexun.cn"  type="get">
     <query  xmlns="http://jabber.org/protocol/disco#info"></query>
 </iq>

[server proxy] -> hhy
 <iq type="result" id="VFDHn-7"  from="proxy.sharexun.cn" to="hhy@sharexun.cn/Smack">
     <query  xmlns="http://jabber.org/protocol/disco#info">
         <identity  category="proxy" name="SOCKS5 Bytestreams Service"  type="bytestreams"/>
         <feature  var="http://jabber.org/protocol/bytestreams"/>
         <feature  var="http://jabber.org/protocol/disco#info"/>
     </query>
 </iq>

hhy -> [server pubsub]
 <iq id="VFDHn-8" to="pubsub.sharexun.cn"  type="get">
     <query xmlns="http://jabber.org/protocol/disco#info"></query>
 </iq>

[server pubsub] -> hhy
 <iq type="result" id="VFDHn-8"  from="pubsub.sharexun.cn" to="hhy@sharexun.cn/Smack">
     <query  xmlns="http://jabber.org/protocol/disco#info">
         <identity  category="pubsub" name="Publish-Subscribe service"  type="service"/>
         <feature  var="http://jabber.org/protocol/pubsub"/>
         <feature  var="http://jabber.org/protocol/pubsub#collections"/>
         <feature  var="http://jabber.org/protocol/pubsub#config-node"/>
         <feature var="http://jabber.org/protocol/pubsub#create-and-configure"/>
         <feature  var="http://jabber.org/protocol/pubsub#create-nodes"/>
         <feature  var="http://jabber.org/protocol/pubsub#delete-nodes"/>
         <feature  var="http://jabber.org/protocol/pubsub#get-pending"/>
         <feature  var="http://jabber.org/protocol/pubsub#instant-nodes"/>
         <feature  var="http://jabber.org/protocol/pubsub#item-ids"/>
         <feature  var="http://jabber.org/protocol/pubsub#meta-data"/>
         <feature  var="http://jabber.org/protocol/pubsub#modify-affiliations"/>
         <feature  var="http://jabber.org/protocol/pubsub#manage-subscriptions"/>
         <feature  var="http://jabber.org/protocol/pubsub#multi-subscribe"/>
         <feature  var="http://jabber.org/protocol/pubsub#outcast-affiliation"/>
         <feature  var="http://jabber.org/protocol/pubsub#persistent-items"/>
         <feature  var="http://jabber.org/protocol/pubsub#presence-notifications"/>
         <feature  var="http://jabber.org/protocol/pubsub#publish"/>
         <feature  var="http://jabber.org/protocol/pubsub#publisher-affiliation"/>
         <feature  var="http://jabber.org/protocol/pubsub#purge-nodes"/>
         <feature  var="http://jabber.org/protocol/pubsub#retract-items"/>
         <feature  var="http://jabber.org/protocol/pubsub#retrieve-affiliations"/>
         <feature  var="http://jabber.org/protocol/pubsub#retrieve-default"/>
         <feature  var="http://jabber.org/protocol/pubsub#retrieve-items"/>
         <feature  var="http://jabber.org/protocol/pubsub#retrieve-subscriptions"/>
         <feature  var="http://jabber.org/protocol/pubsub#subscribe"/>
         <feature  var="http://jabber.org/protocol/pubsub#subscription-options"/>
         <feature  var="http://jabber.org/protocol/pubsub#default_access_model_open"/>
         <feature  var="http://jabber.org/protocol/disco#info"/>
     </query>
 </iq>

hhy -> [server search]
 <iq id="VFDHn-9" to="search.sharexun.cn"  type="get">
     <query  xmlns="http://jabber.org/protocol/disco#info"></query>
 </iq>

[server search] -> hhy
 <iq type="result" id="VFDHn-9"  from="search.sharexun.cn" to="hhy@sharexun.cn/Smack">
     <query  xmlns="http://jabber.org/protocol/disco#info">
         <identity  category="directory" type="user" name="User  Search"/>
         <feature  var="jabber:iq:search"/>
         <feature  var="http://jabber.org/protocol/disco#info"/>
         <feature  var="http://jabber.org/protocol/rsm"/>
     </query>
 </iq>

hhy -> [server conference]
 <iq id="VFDHn-10" to="conference.sharexun.cn"  type="get">
     <query xmlns="http://jabber.org/protocol/disco#info"></query>
 </iq>

[server conference] -> hhy
 <iq type="result" id="VFDHn-10"  from="conference.sharexun.cn"  to="hhy@sharexun.cn/Smack">
     <query  xmlns="http://jabber.org/protocol/disco#info">
         <identity  category="conference" name="............"  type="text"/>
         <identity  category="directory" name="Public Chatroom Search"  type="chatroom"/>
         <feature  var="http://jabber.org/protocol/muc"/>
         <feature  var="http://jabber.org/protocol/disco#info"/>
         <feature var="http://jabber.org/protocol/disco#items"/>
         <feature  var="jabber:iq:search"/>
         <feature  var="http://jabber.org/protocol/rsm"/>
     </query>
 </iq>

//----- 首先是采用 bytestreams 方式傳輸文件的

hhy -> [server proxy]
 <iq id="VFDHn-11" to="proxy.sharexun.cn"  type="get">
     <query  xmlns="http://jabber.org/protocol/bytestreams"/>
 </iq>

[server proxy] -> hhy
 <iq type="result" id="VFDHn-11"  from="proxy.sharexun.cn" to="hhy@sharexun.cn/Smack">
     <query  xmlns="http://jabber.org/protocol/bytestreams">
         <streamhost  jid="proxy.sharexun.cn" host="127.0.0.1"  port="7777"/>
     </query>
 </iq>

 hhy -> blue
// 這里要求 blue 采用 proxy server 方式來傳輸文件
 <iq id="VFDHn-12" to="blue@sharexun.cn/Spark"  type="set">
     <query  xmlns="http://jabber.org/protocol/bytestreams" sid="jsi_7839940461539037483"  mode = "tcp">
         <streamhost  jid="hhy@sharexun.cn/Smack" host="127.0.0.1"  port="7777"/>
         <streamhost  jid="proxy.sharexun.cn" host="127.0.0.1"  port="7777"/>
     </query>
 </iq>

 blue -> hhy
// 可以看到 blue 無法連接到 代理服務器,并返回了 404 的錯誤響應
 <iq id="VFDHn-12" to="hhy@sharexun.cn/Smack"  from="blue@sharexun.cn/Spark" type="error">
     <query  xmlns="http://jabber.org/protocol/bytestreams"  sid="jsi_7839940461539037483" mode="tcp">
         <streamhost  jid="hhy@sharexun.cn/Smack" host="127.0.0.1"  port="7777"/>
         <streamhost  jid="proxy.sharexun.cn" host="127.0.0.1"  port="7777"/>
     </query>
     <error code="404" type="CANCEL">
         <item-not-found  xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/>
         <text  xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"  xml:lang="en">Could not establish socket with any provided  host</text>
     </error>
 </iq>

//----- 上面方式不行,采用 IBB 方式傳輸

hhy -> blue
// 在上面無法采用代理服務器的方式后,這里協商采用 IBB 的方式來傳輸文件
 // 并且這里提示會采用 iq stanza 來傳輸文件內容

 <iq id="VFDHn-13" to="blue@sharexun.cn/Spark"  type="set">
     <open xmlns="http://jabber.org/protocol/ibb"  block-size="4096" sid="jsi_7839940461539037483"  stanza="iq"/>
 </iq>

blue -> hhy
// blue 確認采用此方式傳輸文件
 <iq id="VFDHn-13" to="hhy@sharexun.cn/Smack"  from="blue@sharexun.cn/Spark" type="result"/>

hhy -> blue
// hhy 使用 iq/data 方式來傳輸文件
 <iq id="VFDHn-14" to="blue@sharexun.cn/Spark"  type="set">
     <data xmlns="http://jabber.org/protocol/ibb"  seq="0" sid="jsi_7839940461539037483">
         iVBORw0KGgoAAAANSUhEUgAAACwAAAAsCAMAAAApWqozAAAAdVBMVEU0m/I0m/I0m/I0m/I0m/I0m/I0m/I0m/I0m/I0m/I0m/I0m/I0m/I0m/I0m/I0m/I0m/I0m/I0m/I0m/I0m/I0m/I0m/L///9bqfRrsPR6t/WVxPeu0fnj7/1JovPE3fq51/nZ6fyiy/jt9P2IvvbP4/v2+v54PNP4AAAAFnRSTlMABQYJCg4PEZOWmJmiqaqu7/Hy9/n8hZw2JQAAAORJREFUeF7l08luwlAMhWG3acvQeYh955sJ3v8RmxAsQErEyYoF//qTdTampRUroOJAV58lA5Xvzz3+YLA3oscSxb9ELwx3jm2FYy+SUdyIHLWvJ7rEKaoOMpHiC11hmM1+AB7DbHsQLZ+lbEix5iUnRjF3zDhmCCc3lhDsZMzdFpsQQo1gLdwLtgbHjXgUpyySQeyjiLQQ1sx1vDvSaIHL7Wgr1tjMYF3RupO1cRbnwe6Sztfq2c2Bx9wJd9M4xYY1pXvP17/bh0Nd4gkMtBg//KH2h5i2KN70+On1G6Ff64IW9Q/DwZoIf1KdbAAAAABJRU5ErkJggg==
     </data>
 </iq>

blue -> hhy
// 確認已經接收完成
 <iq id="VFDHn-14" to="hhy@sharexun.cn/Smack"  from="blue@sharexun.cn/Spark" type="result"/>

hhy -> blue
// hhy 關閉本次傳輸
 <iq id="VFDHn-15" to="blue@sharexun.cn/Spark"  type="set">
     <close xmlns="http://jabber.org/protocol/ibb"  sid="jsi_7839940461539037483"/>
 </iq>

blue -> hhy
// 本次文件傳輸結束
 <iq id="VFDHn-15" to="hhy@sharexun.cn/Smack"  from="blue@sharexun.cn/Spark" type="result"/>


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

枣阳市| 浮梁县| 通城县| 柯坪县| 海淀区| 青海省| 安化县| 彰化市| 丹巴县| 翼城县| 衡阳县| 墨脱县| 隆化县| 怀宁县| 正阳县| 贵阳市| 赞皇县| 青浦区| 定南县| 绩溪县| 安福县| 公主岭市| 抚州市| 宁城县| 古田县| 溆浦县| 芦溪县| 太谷县| 疏勒县| 沁阳市| 林甸县| 福贡县| 鹿邑县| 淳化县| 桑植县| 清水河县| 万州区| 法库县| 涟源市| 达日县| 繁峙县|