講解這篇博客的目的是爲了引出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。