java 的底層通信--Socket


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

 

 
        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM