使用Socket實現遠程通信

     講解這篇博客的目的是爲了引出WebService,不過Socket是比較接近底層的東西,可能有的時候比較難理解,但是作爲一個java開發攻城獅也是需要我們瞭解的。下面講解使用socket模擬一個查詢天氣預報的小程序,比較的簡單

1、Socket基本概念

     Socket又稱"套接字",應用程序通常通過"套接字"向網絡發出請求或者應答網絡請求, Socket本質是編程接口(API),是對TCP/IP的封裝,TCP/IP也要提供可供程序員做網絡開發所用的接口,這就是Socket編程接口;HTTP是轎車,提供了封裝或者顯示數據的具體形式;Socket是發動機,提供了網絡通信的能力(如果說TCP/IP協議不懂可以去查一下)。

2、創建服務端,因爲我們需要提供一個可持續提供服務的,所以需要選擇多線程的。

public class WeatherServer {
	
	public static void main(String[] args) throws Exception {
		// 第一步:創建一個java工程
		// 第二步:創建一個ServerSocket對象,綁定一個端口
		// 端口要大於1024
		ServerSocket serverSocket = new ServerSocket(12333);
		while (true) {
			// 第三步:等待客戶端建立連接
			// 阻塞的方法
			final Socket socket = serverSocket.accept();
			Runnable runnable = new Runnable() {
				@Override
				public void run() {
					try {
						// 第四步:使用輸入流接收客戶端發送的請求。
						DataInputStream dataInputStream = new DataInputStream(
								socket.getInputStream());
						String cityName = dataInputStream.readUTF();
						System.out.println("接收到客戶端發送的請求:" + cityName);
						// 第五步:根據城市名稱查詢天氣。
						// 查詢。。。。。。
						Thread.sleep(1000);
						String result = "今天天氣很冷";
						System.out.println("返回天氣信息:" + result);
						// 第六步:返回查詢結果,使用輸出流。
						DataOutputStream dataOutputStream = new DataOutputStream(
								socket.getOutputStream());
						dataOutputStream.writeUTF(result);
						// 第七步:關閉輸入輸出流。
						dataInputStream.close();
						dataOutputStream.close();
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			};
			//啓動線程
			new Thread(runnable).start();
		}
	}
}

3、創建客戶端調用服務端

public class WeatherClient {
	public static void main(String[] args) throws Exception {	
		while(true) {
			// 第一步:創建一java工程
			// 第二步:創建一個socket對象。和服務端建立連接
			Socket socket = new Socket("127.0.0.1", 12333);
			// 第三步:發送城市名稱查詢天氣。輸出流
			DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
			dataOutputStream.writeUTF("北京|上海|深圳");
			System.out.println("請求查詢天氣:" + "北京");
			// 第四步:接收返回結果,使用輸入流。
			DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
			String result = dataInputStream.readUTF();
			// 第五步:打印返回結果
			System.out.println("北京的天氣:" + result);
			// 第六步:關閉輸入輸出流。
			dataInputStream.close();
			dataOutputStream.close();
		}
	}
}

4、用debug啓動服務端

5、編寫調用服務端的腳本(把txt後綴名改成bat,運行即可)


6、多啓動幾個腳本



7、查看結果



   小結:這是一個簡單的socket調用遠程服務,但是裏面涉及到了多線程的知識點,這個是每個程序員都必備的知識點,多線程還是要熟練使用的,其中socket其中涉及了tcp/ip的知識點。這個我們也得了解。下篇博客介紹WebService。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章