最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java用局域網(wǎng)實(shí)現(xiàn)聊天室功能

 更新時(shí)間:2022年05月19日 16:29:40   作者:徐徐大嫂  
這篇文章主要為大家詳細(xì)介紹了Java用局域網(wǎng)實(shí)現(xiàn)聊天室功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了Java用局域網(wǎng)實(shí)現(xiàn)聊天室的具體代碼,供大家參考,具體內(nèi)容如下

類(lèi)和接口

Server類(lèi)(服務(wù)器端)

package Test;

import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
? ? private static final int SERVER_PORT=30000;
? ? //使用CrazyitMap對(duì)象來(lái)保存每個(gè)客戶名字和對(duì)應(yīng)輸出流之間的對(duì)應(yīng)關(guān)系
? ? public static CrazyitMap<String,PrintStream> clients=new CrazyitMap<>();
? ? public void init(){
? ? ? ? try( //建立監(jiān)聽(tīng)的ServerSocket
? ? ? ? ? ? ?ServerSocket ss=new ServerSocket(SERVER_PORT))
? ? ? ? {
? ? ? ? ? ? //采用死循環(huán)來(lái)不斷地接收來(lái)自客戶端的請(qǐng)求
? ? ? ? ? ? while(true){
? ? ? ? ? ? ? ? Socket socket=ss.accept();
? ? ? ? ? ? ? ? new ServerThread(socket).start();
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? //如果拋出異常
? ? ? ? catch (IOException ex){
? ? ? ? ? ? System.out.println("服務(wù)器啟動(dòng)失敗,是否端口"+SERVER_PORT+"已被占用");
? ? ? ? }
? ? }
? ? public static void main(String[] args){
? ? ? ? Server server=new Server();
? ? ? ? server.init();
? ? }
}

ServerThread類(lèi)

package Test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

public class ServerThread extends Thread {
? ? private Socket socket;
? ? BufferedReader br = null;
? ? PrintStream ps = null;

? ? //定義一個(gè)構(gòu)造器,用于接收一個(gè)Socket來(lái)創(chuàng)建ServerThread線程
? ? public ServerThread(Socket socket) {
? ? ? ? this.socket = socket;
? ? }

? ? public void run() {
? ? ? ? try {
? ? ? ? ? ? //獲取該Socket對(duì)應(yīng)的輸入流
? ? ? ? ? ? br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
? ? ? ? ? ? //獲取該Socket對(duì)應(yīng)的輸出流
? ? ? ? ? ? ps = new PrintStream(socket.getOutputStream());
? ? ? ? ? ? String line = null;
? ? ? ? ? ? while ((line = br.readLine()) != null) {
? ? ? ? ? ? ? ? //如果讀到的行以CrazyitProtocol.USER_ROUND開(kāi)始,并以其結(jié)束
? ? ? ? ? ? ? ? //則可以確定讀到的是用戶登錄的用戶名
? ? ? ? ? ? ? ? if (line.startsWith(CrazyitProtocol.USER_ROUND) && line.endsWith(CrazyitProtocol.USER_ROUND)) {
? ? ? ? ? ? ? ? ? ? //得到真實(shí)消息
? ? ? ? ? ? ? ? ? ? String userName = getRealMsg(line);
? ? ? ? ? ? ? ? ? ? //如果用戶名重復(fù)
? ? ? ? ? ? ? ? ? ? if (Server.clients.map.containsKey(userName)) {
? ? ? ? ? ? ? ? ? ? ? ? System.out.println("重復(fù)");
? ? ? ? ? ? ? ? ? ? ? ? ps.println(CrazyitProtocol.NAME_REP);
? ? ? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? ? ? System.out.println("成功");
? ? ? ? ? ? ? ? ? ? ? ? ps.println(CrazyitProtocol.LOGIN_SUCCESS);
? ? ? ? ? ? ? ? ? ? ? ? Server.clients.put(userName, ps);
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? //如果讀到的行以CrazyitProtocol.PRIVATE_ROUND開(kāi)始,
? ? ? ? ? ? ? ? //則可以確定是私聊信息,私聊信息只向特定的輸入流發(fā)送
? ? ? ? ? ? ? ? else if (line.startsWith(CrazyitProtocol.PRIVATE_ROUND) && line.endsWith(CrazyitProtocol.PRIVATE_ROUND)) {
? ? ? ? ? ? ? ? ? ? //得到真實(shí)的消息
? ? ? ? ? ? ? ? ? ? String userAndMsg = getRealMsg(line);
? ? ? ? ? ? ? ? ? ? //以SPLIT_SIGN分割字符串,前半是私聊用戶,后半是聊天信息
? ? ? ? ? ? ? ? ? ? String user = userAndMsg.split(CrazyitProtocol.SPLIT_SIGN)[0];
? ? ? ? ? ? ? ? ? ? String msg = userAndMsg.split(CrazyitProtocol.SPLIT_SIGN)[1];
? ? ? ? ? ? ? ? ? ? //獲取私聊用戶對(duì)應(yīng)的輸出流,并發(fā)送私聊信息
? ? ? ? ? ? ? ? ? ? Server.clients.map.get(user).println(Server.clients.getKeyByValue(ps) + "悄悄對(duì)你說(shuō):" + msg);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? //公聊要向每一個(gè)Socket發(fā)送
? ? ? ? ? ? ? ? else {
? ? ? ? ? ? ? ? ? ? //得到真實(shí)消息
? ? ? ? ? ? ? ? ? ? String msg = getRealMsg(line);
? ? ? ? ? ? ? ? ? ? //遍歷clients中的每個(gè)輸出流
? ? ? ? ? ? ? ? ? ? for (PrintStream clientPs : Server.clients.valueSet()) {
? ? ? ? ? ? ? ? ? ? ? ? clientPs.println(Server.clients.getKeyByValue(ps) + "說(shuō):" + msg);
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? //捕獲到異常后,表明Socket對(duì)應(yīng)的客戶端已經(jīng)出現(xiàn)了問(wèn)題
? ? ? ? //所以程序?qū)⑵鋵?duì)應(yīng)的輸出流從Map中刪除
? ? ? ? catch (IOException e) {
? ? ? ? ? ? Server.clients.removeByValue(ps);
? ? ? ? ? ? System.out.println(Server.clients.map.size());
? ? ? ? ? ? //關(guān)閉網(wǎng)絡(luò),IO資源
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? if (br != null) {
? ? ? ? ? ? ? ? ? ? br.close();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? if (ps != null) {
? ? ? ? ? ? ? ? ? ? ps.close();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? if (socket != null) {
? ? ? ? ? ? ? ? ? ? socket.close();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? } catch (IOException ex) {
? ? ? ? ? ? ? ? ex.printStackTrace();
? ? ? ? ? ? }
? ? ? ? }
? ? }

? ? //將讀到的內(nèi)容去掉前后協(xié)議字符,恢復(fù)成真實(shí)數(shù)據(jù)
? ? private String getRealMsg(String line) {
? ? ? ? return line.substring(CrazyitProtocol.PROTOCOL_LEN,line.length()-CrazyitProtocol.PROTOCOL_LEN);
? ? }
}

Client類(lèi)

package Test;

import javax.swing.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {
? ? private static final int SERVER_PORT=30000;
? ? private Socket socket;
? ? private PrintStream ps;
? ? private BufferedReader brServer;
? ? private BufferedReader keyIn;
? ? public void init(){
? ? ? ? try
? ? ? ? {
? ? ? ? ? ? //初始化代表鍵盤(pán)的輸入流
? ? ? ? ? ? keyIn=new BufferedReader(new InputStreamReader(System.in));
? ? ? ? ? ? //連接到服務(wù)器端
? ? ? ? ? ? socket=new Socket("127.0.0.1",SERVER_PORT);
? ? ? ? ? ? //獲取該Socket對(duì)應(yīng)的輸入流和輸出流
? ? ? ? ? ? ps=new PrintStream(socket.getOutputStream());
? ? ? ? ? ? brServer=new BufferedReader(new InputStreamReader(socket.getInputStream()));
? ? ? ? ? ? String tip=" ";
? ? ? ? ? ? //采用不斷循環(huán)地彈出對(duì)話框要求輸入用戶名
? ? ? ? ? ? while(true){
? ? ? ? ? ? ? ? String userName= JOptionPane.showInputDialog(tip+"輸入用戶名");
? ? ? ? ? ? ? ? //用戶輸入的用戶名前后增加協(xié)議字符串后發(fā)送
? ? ? ? ? ? ? ? ps.println(CrazyitProtocol.USER_ROUND+userName+CrazyitProtocol.USER_ROUND);
? ? ? ? ? ? ? ? //讀取服務(wù)器端的響應(yīng)
? ? ? ? ? ? ? ? String result=brServer.readLine();
? ? ? ? ? ? ? ? //如果用戶名重復(fù),則開(kāi)始下一次循環(huán)
? ? ? ? ? ? ? ? if (result.equals(CrazyitProtocol.NAME_REP)){
? ? ? ? ? ? ? ? ? ? tip="用戶名重復(fù),請(qǐng)重試";
? ? ? ? ? ? ? ? ? ? continue;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? //服務(wù)器端登錄成功
? ? ? ? ? ? ? ? if (result.equals(CrazyitProtocol.LOGIN_SUCCESS)){
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? //捕獲到異常,關(guān)閉網(wǎng)絡(luò)資源,并退出該程序
? ? ? ? catch (UnknownHostException ex){
? ? ? ? ? ? System.out.println("找不到遠(yuǎn)程服務(wù)器,請(qǐng)確定服務(wù)器已經(jīng)啟動(dòng)");
? ? ? ? ? ? closeRs();
? ? ? ? ? ? System.exit(1);
? ? ? ? }
? ? ? ? catch(IOException ex){
? ? ? ? ? ? System.out.println("網(wǎng)絡(luò)異常,請(qǐng)重新登錄");
? ? ? ? ? ? closeRs();
? ? ? ? ? ? System.exit(1);
? ? ? ? }
? ? ? ? //以該Socket對(duì)應(yīng)的輸入流啟動(dòng)ClientThread線程
? ? ? ? new ClientThread(brServer).start();
? ? }
? ? //定義一個(gè)讀取鍵盤(pán)輸出,并以網(wǎng)絡(luò)發(fā)送的方法
? ? private void readAndSend(){
? ? ? ? try
? ? ? ? {
? ? ? ? ? ? //不斷讀取鍵盤(pán)輸入
? ? ? ? ? ? String line=null;
? ? ? ? ? ? while ((line=keyIn.readLine())!=null){
? ? ? ? ? ? ? ? //如果發(fā)送的信號(hào)中有冒號(hào),并以//開(kāi)頭,則認(rèn)為想發(fā)送私聊信息
? ? ? ? ? ? ? ? if (line.indexOf(":")>0&&line.startsWith("http://")){
? ? ? ? ? ? ? ? ? ? line=line.substring(2);
? ? ? ? ? ? ? ? ? ? ps.println(CrazyitProtocol.PRIVATE_ROUND+line.split(":")[0]+CrazyitProtocol.SPLIT_SIGN+line.split(":")[1]+CrazyitProtocol.PRIVATE_ROUND);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? else{
? ? ? ? ? ? ? ? ? ? ps.println(CrazyitProtocol.MSG_ROUND+line+CrazyitProtocol.MSG_ROUND);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? catch (IOException ex){
? ? ? ? ? ? System.out.println("網(wǎng)絡(luò)通信異常!請(qǐng)重新登錄");
? ? ? ? ? ? closeRs();
? ? ? ? ? ? System.exit(1);
? ? ? ? }
? ? }
? ? //關(guān)閉Socket,輸入流,輸出流的方法
? ? private void closeRs(){
? ? ? ? try
? ? ? ? {
? ? ? ? ? ? if (keyIn!=null){
? ? ? ? ? ? ? ? ps.close();
? ? ? ? ? ? }
? ? ? ? ? ? if (brServer!=null){
? ? ? ? ? ? ? ? ps.close();
? ? ? ? ? ? }
? ? ? ? ? ? if (ps!=null){
? ? ? ? ? ? ? ? ps.close();
? ? ? ? ? ? }
? ? ? ? ? ? if (socket!=null){
? ? ? ? ? ? ? ? keyIn.close();
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? catch (IOException ex){
? ? ? ? ? ? ex.printStackTrace();
? ? ? ? }
? ? }

? ? public static void main(String[] args){
? ? ? ? Client client=new Client();
? ? ? ? client.init();
? ? ? ? client.readAndSend();
? ? }
}

ClientThread類(lèi)

package Test;

import java.io.BufferedReader;
import java.io.IOException;

public class ClientThread extends Thread {
? ? //該客戶端線程負(fù)責(zé)處理輸入流
? ? BufferedReader br=null;
? ? //使用一個(gè)網(wǎng)絡(luò)輸入流來(lái)創(chuàng)建客戶端線程
? ? public ClientThread(BufferedReader br){
? ? ? ? this.br=br;
? ? }
? ? public void run(){
? ? ? ? try
? ? ? ? {
? ? ? ? ? ? String line=null;
? ? ? ? ? ? //不斷地從輸入流中讀取數(shù)據(jù),并將這些數(shù)據(jù)打印輸出
? ? ? ? ? ? while((line=br.readLine())!=null){
? ? ? ? ? ? ? ? System.out.println(line);
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? catch (IOException ex){
? ? ? ? ? ? ex.printStackTrace();
? ? ? ? }
? ? ? ? finally {
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? if (br!=null){
? ? ? ? ? ? ? ? ? ? br.close();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? catch (IOException ex){
? ? ? ? ? ? ? ? ex.printStackTrace();
? ? ? ? ? ? }
? ? ? ? }
? ? }
}

CrazyitMap類(lèi)

package Test;

import java.util.*;

public class CrazyitMap<k,v> {
? ? //創(chuàng)建一個(gè)線程安全的HashMap
? ? public Map<k,v> map= Collections.synchronizedMap(new HashMap<k,v>());
? ? //根據(jù)value來(lái)刪除指定項(xiàng)
? ? public synchronized void removeByValue(Object value){
? ? ? ? for (Object key:map.keySet()){
? ? ? ? ? ? if (map.get(key)==value){
? ? ? ? ? ? ? ? map.remove(key);
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? }
? ? }
? ? //獲取所有value組成的Set集合
? ? public synchronized Set<v> valueSet(){
? ? ? ? Set<v> result=new HashSet<v>();
? ? ? ? //將map中的所有value添加到result集合中
? ? ? ? map.forEach((key,value)->result.add(value));
? ? ? ? return result;
? ? }
? ? //根據(jù)value查找key
? ? public synchronized k getKeyByValue(v value){
? ? ? ? //遍歷所有key組成的集合
? ? ? ? for (k key:map.keySet()){
? ? ? ? ? ? //如果指定key對(duì)應(yīng)的value與被搜索的value相同,則返回對(duì)應(yīng)的key
? ? ? ? ? ? if(map.get(key)==value||map.get(key).equals(value)){
? ? ? ? ? ? ? ? return key;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return null;
? ? }
? ? //實(shí)現(xiàn)put()方法,該方法不允許value重復(fù)
? ? public synchronized v put(k key,v value){
? ? ? ? //遍歷所有value組成的集合
? ? ? ? for (v val:valueSet()){
? ? ? ? ? ? //如果某個(gè)value與試圖放入集合的value相同
? ? ? ? ? ? //則拋出一個(gè)RuntimeException異常
? ? ? ? ? ? if (val.equals(value)&&val.hashCode()==value.hashCode()){
? ? ? ? ? ? ? ? throw new RuntimeException("MyMap實(shí)例不允許有重復(fù)的value");
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return map.put(key,value);
? ? }
}

CrazyitProtocol類(lèi)

package Test;

public interface CrazyitProtocol {
? ? //定義協(xié)議字符串的長(zhǎng)度
? ? int PROTOCOL_LEN=2;
? ? //下面是一些協(xié)議字符串,服務(wù)器端和客戶端交換的信息都應(yīng)該在前后添加這種特殊字符串
? ? String MSG_ROUND="ηθ";
? ? String USER_ROUND="∏∑";
? ? String LOGIN_SUCCESS="1";
? ? String NAME_REP="-1";
? ? String PRIVATE_ROUND="★【";
? ? String SPLIT_SIGN="卐";
}

運(yùn)行結(jié)果:

打開(kāi)服務(wù)器并且運(yùn)行三個(gè)客戶端用戶名分別是xuwei,jiji和yaou

首先發(fā)送一句公開(kāi)信息:
xuwei發(fā)送了一句話

jiji收到:

yaou收到:

再發(fā)送一句私聊信息給jiji
xuwei發(fā)送了一句悄悄話:

jiji收到:

yaou沒(méi)有收到:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring Boot整合ElasticSearch實(shí)現(xiàn)多版本兼容的方法詳解

    Spring Boot整合ElasticSearch實(shí)現(xiàn)多版本兼容的方法詳解

    簡(jiǎn)單說(shuō),ElasticSearch(簡(jiǎn)稱(chēng) ES)是搜索引擎,是結(jié)構(gòu)化數(shù)據(jù)的分布式搜索引擎。下面這篇文章主要給大家介紹了關(guān)于Spring Boot整合ElasticSearch實(shí)現(xiàn)多版本兼容的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧
    2018-05-05
  • Java幾種常用的斷言風(fēng)格你怎么選

    Java幾種常用的斷言風(fēng)格你怎么選

    這篇文章主要介紹了Java幾種常用的斷言風(fēng)格你怎么選,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 淺談Springboot2.0防止XSS攻擊的幾種方式

    淺談Springboot2.0防止XSS攻擊的幾種方式

    本文主要介紹了Springboot2.0防止XSS攻擊的幾種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Java多線程中的ThreadPoolExecutor解讀

    Java多線程中的ThreadPoolExecutor解讀

    這篇文章主要介紹了Java多線程中的ThreadPoolExecutor解讀,線程池中的核心線程數(shù),當(dāng)提交一個(gè)任務(wù)時(shí),線程池創(chuàng)建一個(gè)新線程執(zhí)行任務(wù),直到當(dāng)前線程數(shù)等于corePoolSize;如果當(dāng)前線程數(shù)為corePoolSize,繼續(xù)提交的任務(wù)被保存到阻塞隊(duì)列中,等待被執(zhí)行,需要的朋友可以參考下
    2023-09-09
  • 基于Java編寫(xiě)一個(gè)神奇的代碼恢復(fù)工具

    基于Java編寫(xiě)一個(gè)神奇的代碼恢復(fù)工具

    這篇文章主要為大家詳細(xì)介紹了如何基于Java編寫(xiě)一個(gè)神奇的代碼恢復(fù)工具,文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • springmvc 傳遞和接收數(shù)組參數(shù)的實(shí)例

    springmvc 傳遞和接收數(shù)組參數(shù)的實(shí)例

    下面小編就為大家分享一篇springmvc 傳遞和接收數(shù)組參數(shù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • Java對(duì)象Serializable接口實(shí)現(xiàn)詳解

    Java對(duì)象Serializable接口實(shí)現(xiàn)詳解

    這篇文章主要介紹了Java對(duì)象Serializable接口實(shí)現(xiàn)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Java實(shí)現(xiàn)判斷瀏覽器版本與類(lèi)型簡(jiǎn)單代碼示例

    Java實(shí)現(xiàn)判斷瀏覽器版本與類(lèi)型簡(jiǎn)單代碼示例

    這篇文章主要介紹了Java實(shí)現(xiàn)判斷瀏覽器版本與類(lèi)型簡(jiǎn)單代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • 利用spring AOP記錄用戶操作日志的方法示例

    利用spring AOP記錄用戶操作日志的方法示例

    這篇文章主要給大家介紹了關(guān)于利用spring AOP記錄用戶操作日志的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。
    2017-07-07
  • Java 通過(guò) 二三法 巧解前端數(shù)據(jù)顯示

    Java 通過(guò) 二三法 巧解前端數(shù)據(jù)顯示

    實(shí)踐來(lái)源于理論,做開(kāi)發(fā)前肯定要先了解相關(guān)的規(guī)則和原理,看到標(biāo)題或許你會(huì)好奇什么是二三法。本篇文章帶你深入了解,需要的朋友可以參考下
    2021-10-10

最新評(píng)論

焦作市| 筠连县| 葫芦岛市| 元朗区| 远安县| 环江| 宣武区| 林州市| 堆龙德庆县| 石台县| 陆河县| 石台县| 西充县| 东方市| 六安市| 微博| 绥江县| 乐山市| 光山县| 通榆县| 北流市| 门源| 永修县| 前郭尔| 平和县| 巴塘县| 杭州市| 寿光市| 元阳县| 辛集市| 阿拉善右旗| 甘肃省| 台湾省| 曲靖市| 湖南省| 印江| 金塔县| 台东市| 吉林省| 林芝县| 麟游县|