1. 程式人生 > 其它 >JAVA 網路程式設計基礎

JAVA 網路程式設計基礎

JAVA 網路程式設計基礎

一,前言

​ 瞭解計算機網路的概述,掌握Sokcet類程式設計,ServerSocket類,Socket類的構造方法和常用方法

二,計算機網咯

1.概述

​ 計算機網路計算機們組成的網路,同一個網路中,計算機可以直接通訊,因為計算機都需遵循同一種網路協議。

​ 網際網路是網路的網路(internet),即把很多計算機網路連線起來,形成一個全球統一的網際網路。

​ 某個計算機網路,可能使用網路協議ABC,而另一個可能使用網路協議XYZ。如通訊協議不統一,則無法連線形成網際網路。統一使用TCP/IP協議。

TCP/IP協議:

​ 泛指網際網路協議,其中最重要的兩個協議是TCP協議和IP協議。只有使用TCP/IP協議的計算機才能夠聯入網際網路,使用其他網路協議(例如NetBIOS、AppleTalk協議等)是無法聯入網際網路的。

2.IP地址

​ 在網際網路中,一個IP地址用於唯一標識一個網路介面(Network Interface)。一臺聯入網際網路的計算機至少有一個IP地址,或多個IP地址。

​ IP地址分為IPv4和IPv6兩種。

  • IPv4

IPv4採用32位地址,類似101.202.99.12,IPv4地址總共有232個(大約42億),IPv4的地址目前已耗盡。

  • IPv6

而IPv6採用128位地址,類似2001:0DA8:100A:0000:0000:1020:F2F3:1428,IPv6地址則總共有2128個(大約340萬億億億億),而IPv6的地址是根本用不完的。

有一個特殊的IP地址,稱之為本機地址,它總是:127.0.0.1(localhost)。

3.域名

​ 直接記憶IP地址困難,通常使用域名訪問某個特定的服務。域名解析伺服器DNS負責把域名翻譯成對應的IP,客戶端再根據IP地址訪問伺服器。

​ 在cmd中用nslookup可以檢視域名對應的IP地址

​ 有一個特殊的本機域名localhost

4.常用協議

TCP協議:

​ 是應用最廣泛的協議,許多高階協議都是建立在TCP協議之上的,例如HTTP、SMTP等。

UDP協議(User Datagram Protocol):

​ 是一種資料報文協議,它是無連線協議,不保證可靠傳輸。

三,TCP程式設計

​ 在開發網路應用程式的時候,我們又會遇到Socket這個概念。

​ Socket、TCP和部分IP的功能都是由作業系統提供的,不同的程式語言只是提供了對作業系統呼叫的簡單的封裝。

​ Socket就是由IP地址和埠號(範圍是0~65535)組成,可以把Socket簡單理解為IP地址加埠號。

​ 埠號由作業系統分配,特權埠(小於1024)需管理員許可權,普通埠(大於1024)任意使用者的應用程式開啟。

​ 比如mysql埠: 127.0.0.1:3306

四,Socket程式設計

​ Java提供的網路類庫(java.net),可以實現無縫的網路連線

​ 使用Socket進行網路程式設計時,本質上就是兩個程序之間的網路通訊。

​ 一個程序伺服器端,它會主動監聽某個指定的埠。一個客戶端,它必須主動連線伺服器的IP地址和指定埠,如果連線成功,伺服器端和客戶端就成功地建立了一個TCP連線,雙方後續就可以隨時傳送和接收資料。

1.ServerSocket類

構造方法:

//建立繫結到指定埠的伺服器套接字。
ServerSocket(int port)

常用方法:

Socket accept() throws IOException
	//等待客戶端的連線請求,返回與該客戶端進行通訊用的Socket物件
void setSoTimeout(int timeout) throws SocketException 
	//設定accept()方法等待連線的時間為timeout毫秒。若時間已到,還沒有客戶端連線,則丟擲InterruptedIOException異常,accept()方法不再阻塞,該傾聽Socket可繼續使用。若timeout值為0,則表示accept()永遠等待。該方法必須在傾聽Socket建立後,在accept()之前呼叫才有效。
void close()throws IOException
	//關閉監聽Socket
InetAddress getInetAddress()
	//返回此伺服器套接字的本地地址
int getLocalPort()
	//返回此套接字在其上監聽的埠號
SocketAddress getLocalSocketAddress()
	//返回此套接字繫結的端點的地址

2.sokect類

構造方法:

//建立流套接字並將其連線到指定IP地址的指定埠號。
Socket(InetAddress address, int port)

常用方法:

InetAddress getLocalAddress()
	//返回對方Socket中的IP的InetAddress物件
int getLocalPort()
	//返回本地Socket中的埠號
InetAddress getInetAddress()
	//返回對方Socket中IP地址
int getPort()
	//返回對方Socket中的埠號
void close() throws IOException
	//關閉Socket,釋放資源
InputStream getInputStream() throws IOException
	//獲取與Socket相關聯的位元組輸入流,用於從Socket中讀資料。
OutputStream getOutputStream() throws IOException
	//獲取與Socket相關聯的位元組輸出流,用於向Socket中寫資料。

五,Socket實現客戶端和服務端通訊

例:

  • 服務端程式碼
public class FuWuDuan {

	public static void main(String[] args) {
		ServerSocket ss = null;
		Socket s = null;
		InputStream is = null;
		OutputStream os = null;
		Scanner sc = null;
		try {
			
			ss = new ServerSocket(1314);
			sc= new Scanner(System.in);
			while (true) {
				
				//建立監聽,接受客服端請求
				s = ss.accept();
			
				is = s.getInputStream();
				//讀寫客戶端的請求
				byte b[] = new byte[1024];
				is.read(b);
				System.out.println("服務端收到:"+new String(b));					
						
				//輸出請求,發生客戶端
				os = s.getOutputStream();
				
				System.out.println("服務端請發出:");
				String str = sc.next();
				byte b1[] = str.getBytes();
				os.write(b1);
				os.flush();			
			}		
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			//關流	
		}	
	}
}
  • 客戶端程式碼
public static void main(String[] args) {
		
		Socket s = null;
		OutputStream os = null;
		Scanner sc = null;
		InputStream is = null;
		+
		try {
			//建立連線,連線服務端
			
			sc= new Scanner(System.in);
			
			while (true) {
				s = new Socket("192.168.2.88", 1314);
				//輸出請求,發生服務端
				os = s.getOutputStream();
				
				System.out.println("客服端請發出:");
				String str = sc.next();
				byte b[] = str.getBytes();
				os.write(b);
				os.flush();
			
				is = s.getInputStream();
				//讀寫服務端的請求
				byte b1[] = new byte[1024];
				is.read(b);
				System.out.println("客服端收到:"+new String(b));					
			}		
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			//關流
		}
	}
}