以前一直不太重視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的基本知識整理到這里,下一個博客將着重整理下長連接以及短連接的問題!