以前一直不太重視java 基礎的整理,感覺在實際開發中好像java 基礎用處不大,感覺不了解一些底層的東西對開發工作影響也不大。不過,後來我發現,很多東西都是互相聯系的,如果底層的東西你不了解,後面的很多與之有聯系的工具、架構等用起來會糊裡糊塗的,出錯之後也不能高效地準确定位,是以,接下來打算好好整理下java SE部分的基礎知識,今天首先整理下Socket通訊方面的基礎知識。
一、Socket是什麼
1、客戶與伺服器
在接觸Socket之前,請先看下面的醜圖:
一般來說,現在很多應用都是這樣的服務方式:用戶端安裝在客戶的終端那裡,而核心業務服務則是在伺服器完成,這兩者之間的連接配接依靠網絡完成,而抽象出來就是依靠對應的流機制來完成。
但是,在java中,一般不會直接操作網絡流來進行通訊,一般通過一個叫做嵌套字的東西進行通訊(可以了解為一部電話),這個類就是Socket,通過操作Socket進行網絡通訊,這其實便是用java實作的web容器的底層原理。
2、Socket:個人了解就是一個可以操作網絡流的類。
3、ServerSocket:對應服務端的伺服器,不過伺服器内部也是通過ServerSocket生成對應某個客戶的Socket,然後互相操作流進行必要的通信的。
二、Socket的使用方法
1、構造方法的用法(對應連接配接伺服器),看以下簡單例子
//Socket建立方法一
public Socket setSocket() throws UnknownHostException, IOException{
String ip = "127.0.0.1";
int port = 8080;
Socket socket = new Socket(ip, port);//這裡會阻塞
return socket;
}
顯然,通路一個伺服器必須知道它的ip以及端口号,這個就展現在Socket的構造函數上面了。不過這種構造方法是不推薦的,原因是:
new Socket(ip, port)這個構造方法會一直阻塞的,如果網絡不好沒有響應,則會空等待。是以一般推薦以下的這個方法進行Socket的構造:
public Socket setSocket() throws IOException{
socket = new Socket();
//設定最長等待時間
socket.setSoTimeout(timeout);
//進行連接配接請求
socket.connect(new InetSocketAddress(ip, port));
return socket;
}
這裡有個設定等待時間,這樣,如果網絡不好就可以即時響應使用者避免過長時間的等待。
2、利用socket進行操作輸入輸出流
Socket類封裝了java對網絡流的操作,是以使用起來比較簡單,直接使用相應的方法擷取對應的流操作即可,請看代碼:
//Socket擷取網絡輸入以及輸出流
//擷取輸輸入
public InputStream getInputStream(Socket socket) throws IOException{
return socket.getInputStream();
}
//擷取輸出流
public OutputStream getOutputStream(Socket socket) throws IOException{
return socket.getOutputStream();
}
然後,擷取流之後,所有通訊通過流進行就行啦,是不是炒雞簡單!
三、ServerSocket的使用方法
1、核心方法:SocketServer.accept(),具體用法請先看代碼例子:
//服務端監聽方法
public void listener() throws IOException{
Socket socket = null;
int i = 0;
while(true){
i++;
socket = server.accept();//這也是個阻塞的方法來的
System.out.println("有" + i + "個使用者連接配接了伺服器");
new Thread(new ServerDoThread(socket)).start();
}
}
accept也是個阻塞的方法來的,它不停地監聽着對應端口有沒有請求進來,如果有,則進行相應操作。一般來說,如果伺服器是多使用者的話,有使用者請求進來便會調用線程進行處理(這裡是直接建立一個線程)
2、ServerSocket與用戶端具體的通訊流程:
請先看醜圖
顯然,服務端進行通訊的話,同樣需要擷取Socket,然後重複二中的步驟進行響應。
是以,是不是很簡單呢!是以,其實web伺服器的基本工作流程和Socket 以及ServerSocket的工作流程差不多,隻是多了複雜的處理内部并發問題的優化代碼罷了,是以,學了Sokcet 以及ServerSocket,你就可以勇敢的說:我也可以寫個Tomcat啦!
Ok,Socket 和ServerSocket的基本知識整理到這裡,下一個部落格将着重整理下長連接配接以及短連接配接的問題!