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

Java中Socket用法詳解

 更新時(shí)間:2021年12月16日 16:24:56   作者:石碩頁(yè)  
本文詳細(xì)講解了Java中Socket的用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

1 問(wèn)題引入

1.1 網(wǎng)絡(luò)架構(gòu)模型

網(wǎng)絡(luò)架構(gòu)模型主要有OSI參考模型和TCP/IP五層模型

1.1.1 OSI參考模型

OSI(Open System Interconnect),即開(kāi)放式系統(tǒng)互聯(lián)。一般都叫OSI參考模型,是ISO(國(guó)際標(biāo)準(zhǔn)化組織)組織在1985年研究的網(wǎng)絡(luò)互連模型。ISO為了更好的使網(wǎng)絡(luò)應(yīng)用更為普及,推出了OSI參考模型,這樣所有的公司都按照統(tǒng)一的標(biāo)準(zhǔn)來(lái)指定自己的網(wǎng)絡(luò),就可以互通互聯(lián)了。

OSI定義了網(wǎng)絡(luò)互連的七層框架(物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層、會(huì)話層、表示層、應(yīng)用層)。

1.1.2 TCP/IP五層模型

TCP/IP五層協(xié)議(物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層、應(yīng)用層)

1.1.3 各協(xié)議層的說(shuō)明

應(yīng)用層

應(yīng)用層最靠近用戶的一層,是為計(jì)算機(jī)用戶提供應(yīng)用接口,也為用戶直接提供各種網(wǎng)絡(luò)服務(wù)。我們常見(jiàn)應(yīng)用層的網(wǎng)絡(luò)服務(wù)協(xié)議有:HTTP,HTTPS,F(xiàn)TP,TELNET等。

傳輸層

建立了主機(jī)端到端的鏈接,傳輸層的作用是為上層協(xié)議提供端到端的可靠和透明的數(shù)據(jù)傳輸服務(wù),包括處理差錯(cuò)控制和流量控制等問(wèn)題。該層向高層屏蔽了下層數(shù)據(jù)通信的細(xì)節(jié),使高層用戶看到的只是在兩個(gè)傳輸實(shí)體間的一條主機(jī)到主機(jī)的、可由用戶控制和設(shè)定的、可靠的數(shù)據(jù)通路。我們通常說(shuō)的,TCP UDP就是在這一層。端口號(hào)既是這里的“端”。

網(wǎng)絡(luò)層

本層通過(guò)IP尋址來(lái)建立兩個(gè)節(jié)點(diǎn)之間的連接,為源端的運(yùn)輸層送來(lái)的分組,選擇合適的路由和交換節(jié)點(diǎn),正確無(wú)誤地按照地址傳送給目的端的運(yùn)輸層。就是通常說(shuō)的IP層。這一層就是我們經(jīng)常說(shuō)的IP協(xié)議層。IP協(xié)議是Internet的基礎(chǔ)。

1.2 網(wǎng)絡(luò)編程中的問(wèn)題

常見(jiàn)的網(wǎng)絡(luò)編程中的問(wèn)題主要是怎么定位網(wǎng)絡(luò)上的一臺(tái)主機(jī)或多臺(tái)主機(jī),另一個(gè)是定位后如何進(jìn)行數(shù)據(jù)的傳輸。對(duì)于前者,在網(wǎng)絡(luò)層中主要負(fù)責(zé)網(wǎng)絡(luò)主機(jī)的定位,數(shù)據(jù)傳輸?shù)穆酚?,由IP地址可以唯一地確定Internet上的一臺(tái)主機(jī)。對(duì)于后者,在傳輸層則提供面向應(yīng)用的可靠(tcp)的或非可靠(UDP)的數(shù)據(jù)傳輸機(jī)制。

對(duì)于客戶端/服務(wù)器(C/S)結(jié)構(gòu)。 即通信雙方一方作為服務(wù)器等待客戶提出請(qǐng)求并予以響應(yīng)??蛻魟t在需要服務(wù)時(shí)向服務(wù)器提出申請(qǐng)。服務(wù)器一般作為守護(hù)進(jìn)程始終運(yùn)行,監(jiān)聽(tīng)網(wǎng)絡(luò)端口,一旦有客戶請(qǐng)求,就會(huì)啟動(dòng)一個(gè)服務(wù)進(jìn)程來(lái)響應(yīng)該客戶,同時(shí)自己繼續(xù)監(jiān)聽(tīng)服務(wù)端口,使后來(lái)的客戶也能及時(shí)得到服務(wù)。

對(duì)于瀏覽器/服務(wù)器(B/S)結(jié)構(gòu)。 客戶則在需要服務(wù)時(shí)向服務(wù)器進(jìn)行請(qǐng)求。服務(wù)器響應(yīng)后及時(shí)返回,不需要實(shí)時(shí)監(jiān)聽(tīng)端口。

1.3 TCP協(xié)議與UDP協(xié)議

1.3.1 TCP

TCP是(Tranfer Control Protocol)的簡(jiǎn)稱,是一種面向連接的保證可靠傳輸?shù)膮f(xié)議。通過(guò)TCP協(xié)議傳輸,得到的是一個(gè)順序的無(wú)差錯(cuò)的數(shù)據(jù)流。發(fā)送方和接收方的成對(duì)的兩個(gè)socket之間必須建立連接,當(dāng)一個(gè)socket(通常都是server socket)等待建立連接時(shí),另一個(gè)socket可以要求進(jìn)行連接,一旦這兩個(gè)socket連接起來(lái),它們就可以進(jìn)行雙向數(shù)據(jù)傳輸,雙方都可以進(jìn)行發(fā)送或接收操作。

TCP的三次握手

建立起一個(gè)TCP連接需要經(jīng)過(guò)“三次握手”:第一次握手:客戶端發(fā)送syn包(syn=j)到服務(wù)器,并進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器確認(rèn);第二次握手:服務(wù)器收到syn包,必須確認(rèn)客戶的SYN(ack=j+1),同時(shí)自己也發(fā)送一個(gè)SYN包(syn=k),即SYN+ACK包,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài);第三次握手:客戶端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1),此包發(fā)送完畢,客戶端和服務(wù)器進(jìn)入ESTABLISHED狀態(tài),完成三次握手。

握手過(guò)程中傳送的包里不包含數(shù)據(jù),三次握手完畢后,客戶端與服務(wù)器才正式開(kāi)始傳送數(shù)據(jù)。理想狀態(tài)下,TCP連接一旦建立,在通信雙方中的任何一方主動(dòng)關(guān)閉連接之前,TCP?連接都將被一直保持下去。斷開(kāi)連接時(shí)服務(wù)器和客戶端均可以主動(dòng)發(fā)起斷開(kāi)TCP連接的請(qǐng)求。

1.3.2 UDP

UDP是(User Datagram Protocol)的簡(jiǎn)稱,是一種無(wú)連接的協(xié)議,每個(gè)數(shù)據(jù)報(bào)都是一個(gè)獨(dú)立的信息,包括完整的源地址或目的地址,它在網(wǎng)絡(luò)上以任何可能的路徑傳往目的地,因此能否到達(dá)目的地,到達(dá)目的地的時(shí)間以及內(nèi)容的正確性都是不能被保證的。

1.3.3 TCP和UDP的區(qū)別

UDP:
  • 1、每個(gè)數(shù)據(jù)報(bào)中都給出了完整的地址信息,因此無(wú)需要建立發(fā)送方和接收方的連接。
  • 2、UDP傳輸數(shù)據(jù)時(shí)是有大小限制的,每個(gè)被傳輸?shù)臄?shù)據(jù)報(bào)必須限定在64KB之內(nèi)。
  • 3、UDP是一個(gè)不可靠的協(xié)議,發(fā)送方所發(fā)送的數(shù)據(jù)報(bào)并不一定以相同的次序到達(dá)接收方
TCP:
  • 1、面向連接的協(xié)議,在socket之間進(jìn)行數(shù)據(jù)傳輸之前必然要建立連接,所以在TCP中需要連接時(shí)間。
  • 2、TCP傳輸數(shù)據(jù)沒(méi)有大小限制,一旦連接建立起來(lái),雙方的socket就可以按統(tǒng)一的格式傳輸大的數(shù)據(jù)。
  • 3、TCP是一個(gè)可靠的協(xié)議,它確保接收方完全正確地獲取發(fā)送方所發(fā)送的全部數(shù)據(jù)。
應(yīng)用:
  • 1、TCP在網(wǎng)絡(luò)通信上有極強(qiáng)的生命力,例如遠(yuǎn)程連接(Telnet)和文件傳輸(FTP)都需要不定長(zhǎng)度的數(shù)據(jù)被可靠地傳輸。但是可靠的傳輸是要付出代價(jià)的,對(duì)數(shù)據(jù)內(nèi)容正確性的檢驗(yàn)必然占用計(jì)算機(jī)的處理時(shí)間和網(wǎng)絡(luò)的帶寬,因此TCP傳輸?shù)男什蝗鏤DP高。
  • 2、UDP操作簡(jiǎn)單,而且僅需要較少的監(jiān)護(hù),因此通常用于局域網(wǎng)高可靠性的分散系統(tǒng)中client/server應(yīng)用程序。例如視頻會(huì)議系統(tǒng),并不要求音頻視頻數(shù)據(jù)絕對(duì)的正確,只要保證連貫性就可以了,這種情況下顯然使用UDP會(huì)更合理一些。

2 socket網(wǎng)絡(luò)編程

2.1什么是socket?

Socket的英文原義是“孔”或“插座”。在網(wǎng)絡(luò)編程中,網(wǎng)絡(luò)上的兩個(gè)程序通過(guò)一個(gè)雙向的通信連接實(shí)現(xiàn)數(shù)據(jù)的交換,這個(gè)連接的一端稱為一個(gè)socket。

Socket套接字是通信的基石,是支持TCP/IP協(xié)議的網(wǎng)絡(luò)通信的基本操作單元。它是網(wǎng)絡(luò)通信過(guò)程中端點(diǎn)的抽象表示,包含進(jìn)行網(wǎng)絡(luò)通信必須的五種信息:連接使用的協(xié)議,本地主機(jī)的IP地址,本地進(jìn)程的協(xié)議端口,遠(yuǎn)地主機(jī)的IP地址,遠(yuǎn)地進(jìn)程的協(xié)議端口。

Socket本質(zhì)是編程接口(API),對(duì)TCP/IP的封裝,TCP/IP也要提供可供程序員做網(wǎng)絡(luò)開(kāi)發(fā)所用的接口,這就是Socket編程接口;HTTP是轎車(chē),提供了封裝或者顯示數(shù)據(jù)的具體形式;Socket是發(fā)動(dòng)機(jī),提供了網(wǎng)絡(luò)通信的能力。

2.2 Socket的原理

Socket實(shí)質(zhì)上提供了進(jìn)程通信的端點(diǎn)。進(jìn)程通信之前,雙方首先必須各自創(chuàng)建一個(gè)端點(diǎn),否則是沒(méi)有辦法建立聯(lián)系并相互通信的。正如打電話之前,雙方必須各自擁有一臺(tái)電話機(jī)一樣。

套接字之間的連接過(guò)程可以分為三個(gè)步驟:服務(wù)器監(jiān)聽(tīng),客戶端請(qǐng)求,連接確認(rèn)。

  • 1、服務(wù)器監(jiān)聽(tīng):是服務(wù)器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態(tài),實(shí)時(shí)監(jiān)控網(wǎng)絡(luò)狀態(tài)。
  • 2、客戶端請(qǐng)求:是指由客戶端的套接字提出連接請(qǐng)求,要連接的目標(biāo)是服務(wù)器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務(wù)器的套接字,指出服務(wù)器端套接字的地址和端口號(hào),然后就向服務(wù)器端套接字提出連接請(qǐng)求。
  • 3、連接確認(rèn):是指當(dāng)服務(wù)器端套接字監(jiān)聽(tīng)到或者說(shuō)接收到客戶端套接字的連接請(qǐng)求,它就響應(yīng)客戶端套接字的請(qǐng)求,建立一個(gè)新的線程,把服務(wù)器端套接字的描述發(fā)給客戶端,一旦客戶端確認(rèn)了此描述,連接就建立好了。而服務(wù)器端套接字繼續(xù)處于監(jiān)聽(tīng)狀態(tài),繼續(xù)接收其他客戶端套接字的連接請(qǐng)求。

3 基于java的socket網(wǎng)絡(luò)編程實(shí)現(xiàn)

Server端Listen監(jiān)聽(tīng)某個(gè)端口是否有連接請(qǐng)求,Client端向Server 端發(fā)出連接請(qǐng)求,Server端向Client端發(fā)回Accept接受消息。這樣一個(gè)連接就建立起來(lái)了。Server端和Client端都可以通過(guò)Send,Write等方法與對(duì)方通信。

對(duì)于一個(gè)功能齊全的Socket,都要包含以下基本結(jié)構(gòu),其工作過(guò)程包含以下四個(gè)基本的步驟:

  • 1、創(chuàng)建Socket;
  • 2、 打開(kāi)連接到Socket的輸入/出流;
  • 3、按照一定的協(xié)議對(duì)Socket進(jìn)行讀/寫(xiě)操作;
  • 4、關(guān)閉Socket。

3.1 基于TCP的socket實(shí)現(xiàn)

SocketClient.java

public class SocketClient {
	
	public static void main(String[] args) throws InterruptedException {
		try {
			// 和服務(wù)器創(chuàng)建連接
			Socket socket = new Socket("localhost",8088);
			
			// 要發(fā)送給服務(wù)器的信息
			OutputStream os = socket.getOutputStream();
			PrintWriter pw = new PrintWriter(os);
			pw.write("客戶端發(fā)送信息");
			pw.flush();
			
			socket.shutdownOutput();
			
			// 從服務(wù)器接收的信息
			InputStream is = socket.getInputStream();
			BufferedReader br = new BufferedReader(new InputStreamReader(is));
			String info = null;
			while((info = br.readLine())!=null){
				System.out.println("我是客戶端,服務(wù)器返回信息:"+info);
			}
			
			br.close();
			is.close();
			os.close();
			pw.close();
			socket.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
 
}

SocketServer.java

public class SocketServer {
	
	public static void main(String[] args) {
		try {
			// 創(chuàng)建服務(wù)端socket
			ServerSocket serverSocket = new ServerSocket(8088);
			
			// 創(chuàng)建客戶端socket
			Socket socket = new Socket();	
			
			//循環(huán)監(jiān)聽(tīng)等待客戶端的連接
            while(true){
            	// 監(jiān)聽(tīng)客戶端
            	socket = serverSocket.accept();
            	
            	ServerThread thread = new ServerThread(socket);
            	thread.start();
            	
            	InetAddress address=socket.getInetAddress();
                System.out.println("當(dāng)前客戶端的IP:"+address.getHostAddress());
            }
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
 
}

ServerThread.java

public class ServerThread extends Thread{
	
	private Socket socket = null;
	
	public ServerThread(Socket socket) {
		this.socket = socket;
	}
 
	@Override
	public void run() {
		InputStream is=null;
        InputStreamReader isr=null;
        BufferedReader br=null;
        OutputStream os=null;
        PrintWriter pw=null;
        try {
			is = socket.getInputStream();
			isr = new InputStreamReader(is);
			br = new BufferedReader(isr);
			
			String info = null;
			
			while((info=br.readLine())!=null){
				System.out.println("我是服務(wù)器,客戶端說(shuō):"+info);
			}
			socket.shutdownInput();
			
			os = socket.getOutputStream();
			pw = new PrintWriter(os);
			pw.write("服務(wù)器歡迎你");
			
			pw.flush();
        } catch (Exception e) {
			// TODO: handle exception
		} finally{
			//關(guān)閉資源
            try {
                if(pw!=null)
                    pw.close();
                if(os!=null)
                    os.close();
                if(br!=null)
                    br.close();
                if(isr!=null)
                    isr.close();
                if(is!=null)
                    is.close();
                if(socket!=null)
                    socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
		}
	}
 
}

在運(yùn)行時(shí),若先執(zhí)行SocketClient會(huì)提示無(wú)法連接到服務(wù)器,因?yàn)榇藭r(shí)沒(méi)有服務(wù)在監(jiān)聽(tīng)8088端口。此demo是多線程實(shí)現(xiàn),在先啟動(dòng)SocketServer后,服務(wù)器會(huì)一直監(jiān)聽(tīng)8088端口,再執(zhí)行SocketClient就會(huì)正常輸出結(jié)果。

3.2 基于UDP的socket實(shí)現(xiàn)

SocketClient.java

public class SocketClient {
	
	public static void main(String[] args) {
		try {
            // 要發(fā)送的消息
            String sendMsg = "客戶端發(fā)送的消息";
            
            // 獲取服務(wù)器的地址
            InetAddress addr = InetAddress.getByName("localhost");
            
            // 創(chuàng)建packet包對(duì)象,封裝要發(fā)送的包數(shù)據(jù)和服務(wù)器地址和端口號(hào)
            DatagramPacket packet = new DatagramPacket(sendMsg.getBytes(),
            		sendMsg.getBytes().length, addr, 8088); 
            
            // 創(chuàng)建Socket對(duì)象
            DatagramSocket socket = new DatagramSocket();
            
            // 發(fā)送消息到服務(wù)器
            socket.send(packet);
 
            // 關(guān)閉socket
            socket.close();
            
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
	}
}

SocketServer.java

public class SocketServer {
	
	public static void main(String[] args) {
		try {
			 // 要接收的報(bào)文
			byte[] bytes = new byte[1024];
			DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
			
			// 創(chuàng)建socket并指定端口
			DatagramSocket socket = new DatagramSocket(8088);
			
			// 接收socket客戶端發(fā)送的數(shù)據(jù)。如果未收到會(huì)一致阻塞
			socket.receive(packet);
			String receiveMsg = new String(packet.getData(),0,packet.getLength());
			System.out.println(packet.getLength());
			System.out.println(receiveMsg);
			
			// 關(guān)閉socket
			socket.close();
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
 
}

運(yùn)行時(shí),先啟動(dòng)SocketServer,再啟動(dòng)SocketClient,會(huì)正常打印數(shù)據(jù)。在先啟動(dòng)SocketServer時(shí),代碼執(zhí)行到socket.receive(packet)時(shí)會(huì)一致阻塞在這里,直到啟動(dòng)SocketClient后,SocketServer會(huì)繼續(xù)執(zhí)行,并將收到SocketClient的信息打印出來(lái)。如果是先啟動(dòng)SocketClient,會(huì)立即執(zhí)行完畢,再執(zhí)行SocketServer時(shí),依舊會(huì)阻塞在receive方法處,直到下一次SocketClient的執(zhí)行。

參考

Java Scoket編程

WebSocket與消息推送

JAVA 通過(guò) Socket 實(shí)現(xiàn) TCP 編程

OSI七層模型與TCP/IP五層模型

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

相關(guān)文章

  • SpringBoot實(shí)現(xiàn)發(fā)送短信的示例代碼

    SpringBoot實(shí)現(xiàn)發(fā)送短信的示例代碼

    這篇文章主要介紹了SpringBoot實(shí)現(xiàn)發(fā)送短信的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Java實(shí)現(xiàn)銀行ATM系統(tǒng)

    Java實(shí)現(xiàn)銀行ATM系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)銀行ATM系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • 最新IntelliJ IDEA 2020版本的安裝教程詳解

    最新IntelliJ IDEA 2020版本的安裝教程詳解

    這篇文章主要介紹了最新IntelliJ IDEA 2020版本的安裝教程詳解,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • java實(shí)戰(zhàn)之桌球小游戲

    java實(shí)戰(zhàn)之桌球小游戲

    這篇文章主要為大家詳細(xì)介紹了java實(shí)戰(zhàn)之桌球小游戲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • maven子模塊相互依賴打包時(shí)報(bào)錯(cuò)找不到類(lèi)的解決方案

    maven子模塊相互依賴打包時(shí)報(bào)錯(cuò)找不到類(lèi)的解決方案

    本文主要介紹了maven子模塊相互依賴打包時(shí)報(bào)錯(cuò)找不到類(lèi)的解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Gson中的TypeToken與泛型擦除詳情

    Gson中的TypeToken與泛型擦除詳情

    這篇文章主要介紹了Gson中的TypeToken與泛型擦除詳情,其Gson類(lèi)提供了toJson()與fromJson()方法,分別用來(lái)序列化與反序列化,更多相關(guān)內(nèi)容需要的朋友可以參考一下
    2022-09-09
  • JedisPool資源池優(yōu)化方法

    JedisPool資源池優(yōu)化方法

    這篇文章主要介紹了JedisPool資源池優(yōu)化方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • java讀取json文件的2種方式例子

    java讀取json文件的2種方式例子

    這篇文章主要給大家介紹了關(guān)于java讀取json文件的2種方式,在開(kāi)發(fā)過(guò)程中有時(shí)會(huì)遇到需要讀取.json文件的需求,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • Java流處理stream使用詳解

    Java流處理stream使用詳解

    Java8的另一大亮點(diǎn)Stream,它與java.io包里的InputStream和OutputStream是完全不同的概念,下面這篇文章主要給大家介紹了關(guān)于Java8中Stream詳細(xì)使用方法的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • Java圖形界面超實(shí)用使用教程

    Java圖形界面超實(shí)用使用教程

    在Java編程中圖形界面應(yīng)用程序是非常常見(jiàn)和重要的一部分,下面這篇文章主要給大家介紹了關(guān)于Java圖形界面的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01

最新評(píng)論

崇左市| 桃园市| 濉溪县| 红安县| 共和县| 青铜峡市| 遵义县| 资源县| 遵义县| 海林市| 曲周县| 宽城| 敦化市| 运城市| 天水市| 云安县| 岳阳市| 苍溪县| 滁州市| 维西| 鄱阳县| 阿拉善左旗| 吉安县| 宁国市| 柳林县| 黎川县| 安乡县| 大庆市| 通州区| 仲巴县| 金山区| 大庆市| 凉城县| 信宜市| 榕江县| 都江堰市| 洛隆县| 绥德县| 涿鹿县| 基隆市| 沅陵县|