天天看點

網絡程式設計出入門

時至今日,計算機網絡縮短了人們之間的距離,把"地球村"變成現實,網絡應用已經成為計算機領域最廣泛的應用。

所謂計算機網絡,就是把分布在不同地理區域的計算機與專門的外部裝置用通信線路互連成 一個規模大、功能強的網絡系統,進而使衆多的計算機可以友善的互相傳遞資訊,共享硬體、軟體、資料資訊等資源。

IP 端口 url 協定

IP位址和端口号

IP位址用于唯一地辨別網絡中的一個通信實體,這個同通信實體即可以是一台主機,也可以是一台列印機,或者是路由器的某一個端口。而在基于IP協定網絡中傳輸的資料包,都必須使用IP位址來進行辨別。

IPV4 :32位

IPV6:128位

特殊的IP:

非注冊IP,供組織内部使用:192.168.0.0-192.168.255.255

127.0.0.1:本地IP,指本機

localhost:本地域名,也指本機

DNS 伺服器 :IP與域名解析

Java中如何表示IP:InetAddress(類)

public class InetAddressTest{
	public static void main(String() args){
		InterAddress ip=InterAddress.getByName("www.baidu.com");
		System.out.println("baidu是否可達:"+ip.isReachable(2000));
		System.out.println(ip.getHostAddress());
		System.out.println(ip.getLocalHost());
	}
}
           

基于TCP協定的網絡程式設計

TCP/IP通信協定是一種可靠的網絡協定,它在通信的兩端各建立一個Socket,進而在通信的兩端之間形成網絡虛拟鍊路。一旦建立了虛拟的網絡鍊路,兩端的程式就可以通過虛拟鍊路進行通信。Java對基于TCP協定的網絡通信提供了良好的封裝,Java使用Socket對象來嗲表兩端的通信端口,并通過Socket産生IO流來進行網絡通信。

使用ServerSocket建立TCP伺服器端

//建立一個ServerSocket,用于監聽用戶端Socket的連結請求
ServerSocket ss = new ServerSocket;
while(true){
	Socket s = ss.accept();
}
           

使用Socket進行通信

用戶端通常可以使用Socket的構造器來連結到指定伺服器,Socket通常可以使用如下兩個構造器。

Socket(InetAddress/String remoteAddress,int port):建立連接配接到指定遠端主機,遠端端口的Socket,該構造器沒有指定本地位址,本地端口,預設使用本機的預設IP位址,預設使用系統動态配置設定的端口。

Socket(InetAddress/String remoteAddress,int port,InetAddres loaclAddr ,int localPort):建立連接配接到指定遠端主機,遠端端口的Socket,并指定本地IP位址和本地端口,适用于本地主機有多個IP位址的情形。

上面兩個構造器中指定遠端主機時既可使用InetAddress來指定,也可直接使用String對象來指定,但程式通常使用String對象來指定遠端IP位址。當本地主機隻有一個IP位址時,使用第一個方法更簡單。如下代碼:

當程曉執行時上面代碼中的粗體字代碼時,該代碼将會連接配接到指定伺服器,讓伺服器端的ServerSocket的accept()方法向下執行,于是服務端和用戶端就産生一對互相連接配接的Socket。

當客服端,服務端産生了對象的Socket之後,程式無需再區分伺服器端和用戶端,而是通過各自的Socket提供了如下兩個方法來擷取輸入流和輸出流。

InputStream getInputStream():傳回該Socket對象對應的輸入流,讓程式通過該輸入流從Socket中取出資料。

OutputStream getOutputStream():傳回該Socket對象對應的輸出流,讓程式通過該輸出流從Socket中輸出資料。

public class Client {//用戶端
	public static void main(String[] args){
		Socket client = new Socket("127.0.0.1",9876);
		String str = "這是一個用戶端";
		DataOutputStream do = new DataOutputStream(client.getOutputStream());
		do.writeUTF(str);
		do.flush();
		do.close();
		client.close();
	}
}
           

伺服器端

public class Server {//伺服器端
	public static void main(String[] args){
		ServerSocket server = new ServerSocket(9876);
		Socket client = server.accept();//監聽
		System.out.println("-------一個用戶端接入---------------");//如果有用戶端連入輸出
		DataInputStream do = new DataInputStream(client.getInputStream());
		do.readUTF(str);
		do.close();
		client.close();
		server.close();//單次登入後關閉服務端
	}
}
           

上面兩個代碼簡單的模拟了一次用戶端和服務端響應。