Java網絡編程

如果涉及到兩臺主機之間進行通信,那麼就要引入網絡的概念。計算機網絡把不同主機連接起來,實現一些資源和數據的共享。

以TCP/IP五層模型爲例,回顧一下每一層的作用(從低到高):

  1. 物理層:定義物理設備如何進行數據的傳輸,各種硬件設備、網線、接口等,主要以比特爲單位傳輸;
  2. 數據鏈路層:將上面層的報文封裝成幀,具有差錯檢驗等功能(循環冗餘碼、海明碼);
  3. 網絡層:以ip數據報爲單位,每個主機或者路由器都有自己的ip地址,主要解決的是設備之間的數據點對點傳播問題;
  4. 傳輸層:解決的是源主機和目標主機之間端到端的通信問題,主要包括UDP和TCP兩個協議;
  5. 應用層:在操作系統之上,直接使用軟件獲取相關的網絡服務,一般協議由提供相關服務的軟件實現。

在Java網絡編程中,數據鏈路層及物理層的細節一般涉及不到;而網絡層和傳輸層用的相對較多。在這裏有一個 Socket 的概念非常重要,Socket也稱爲套接字,是一個ip地址和一個端口號的集合。
ip地址對應的是網絡層中的概念,每一臺主機都有自己的ip地址,其他主機若想訪問某臺主機,必須要知道其ip地址;端口號對應的是傳輸層中的概念,每個端口對應一種服務或一個進程。每臺主機總共有65536個可用端口,其中1024以下的都是一些常用端口,例如:80端口代表http,21端口代表ftp。1024以上的多爲自定義端口。

在兩臺主機進行通信時,一般來說,分爲一臺服務器和一臺客戶機。那麼在Java網絡編程中,兩臺主機之間建立通信的過程如下:

  1. 服務器打開一個端口,並監聽客戶機有無連接;
  2. 客戶機通過自己的Socket,向服務器的這個端口發出請求;
  3. 服務器接收到這個請求後,生成自己的Socket;
  4. 兩臺主機之間就可以通過 Stream 進行通信了。

看一段更加具體一點的代碼:

服務器代碼:

public class server_2 {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			//通過ServerSocket打開6666端口,等待客戶端請求
			ServerSocket ss = new ServerSocket(6666);
			System.out.println("打開端口:6666");
			//接收到客戶端請求後,服務端生成Socket
			Socket s = ss.accept();
			//通過輸入流來將客戶端的數據讀進來
			InputStream is = s.getInputStream();
			DataInputStream dis = new DataInputStream(is);
			String str = dis.readUTF();
			System.out.println(str);
			is.close();
			s.close();
			ss.close();
		}catch (IOException e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
}

客戶端代碼

public class client_2 {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			//新建Socket,指明想要連接的主機ip和端口號
			Socket s = new Socket("127.0.0.1",6666);
			//打開輸出流,將數據輸出給服務器端
			OutputStream os = s.getOutputStream();
			DataOutputStream dos = new DataOutputStream(os);			
			dos.writeUTF("520");
			os.close();
			s.close();
		}catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}	
	}
}

首先在服務器主機上運行代碼,服務端打開端口6666,並一直監聽是否有客戶端連接到自己的6666端口;之後在客戶端運行客戶端代碼,客戶端通過Socket,找到了服務器的ip以及打開的端口,並請求服務器進行服務。服務器接到客戶端的請求後,通過accept方法建立了自己的Socket,用於兩臺主機之間的通信。之後客戶端打開了輸出流,並把字符串“520”送入流中;服務端通過套接字得到輸入流,即可得到客戶端發送來的內容。

發佈了38 篇原創文章 · 獲贊 87 · 訪問量 7305
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章