1. 程式人生 > 實用技巧 >【Java】網路程式設計(NIO/BIO)

【Java】網路程式設計(NIO/BIO)

網路程式設計

1).認識網路名詞

IP地址:表示網路上的一臺主機,邏輯地址
MAC地址:表示網路上的一臺主機,實體地址
埠:標識主機中的一個程序 0 – 65535, 1024一下為預留埠
協議:通訊雙方之間的約定和標準
物理層 –> 資料鏈路層 –> 網路層 –> 傳輸層 –> 會話層 –> 表示層 –> 應用層

傳輸層:
	TCP:傳輸控制協議,面向連線的,是可靠的			(Transmission Control Protocol)
	UDP:使用者資料報協議,非面向連線的,不可靠的		(User Datagram Protocol)

2).TCP程式設計(Transmission Control Protocol)

TCP:	Socket 程式設計(套接字)	ServerSocket   Socket (伺服器端用兩個)
java包:java.net.*;
用法:如下
--------------------------------------------------------------
TCP: 模擬客戶端與伺服器端的通訊程式碼:先啟動伺服器端
客戶端(Client):
	public static void main(String[] args) throws Exception {
		Socket s = new Socket(“192.168.77.13”, 9000);  //向伺服器發起連線,引數分別是ip和埠
		InputStream is = new s.getInputStream();
		BufferedReader br = new BufferedReader(new InputStreamReader(is));
		for(int i = 1; i <= 20; i++) {
			String str = br.readLine(); //從伺服器端讀
			System.out.println(str);
		}
		s.close();
	}

伺服器端(Service)
	public static void main(String[] args) throws Exception {
		ServerSocket ss = new ServerSocket(9000); //伺服器程序繫結埠為9000
		Socket s = ss.accept();//接受訪問
		OutputStream os = s.getOutputStream();
		PrintWriter out = new PrintWriter(os); 
		for(int I = 1; I <= 20; i++) {
			out.println(“Hello” + i); //向客戶端寫
			out.flush();
			Thread.sleep(200);
		}
		s.close();
	}

3).UDP程式設計(User Datagram Protocol)

UDP:Socket 程式設計  	DatagramSocket   DatagramPacket
java包:java.net.*;
用法:如下
--------------------------------------------------------------
UDP: 模擬客戶端與伺服器端的通訊程式碼:先啟動伺服器端
客戶端(Client):向伺服器端送一封信
	public static void main(String[] args) throws Exception {
		//先發一封信
		DatagramSocket ds = new DatagramSocket();
		String str = “這裡是客戶端的信”;
		byte[] b = str.getBytes(); //可以設定編碼方式
		
		DatagramPacket sendLetter = new DatagramPacket(b, 0, b.length, InetAddress.getLocalHost(), 9090);//傳送信,前三個引數為信的內容,後兩個引數分別為本地IP和送信埠埠
		ds.send(sendLetter);

		//接受30封信
		for(int I = 0; I < 30; I++) {
			DatagramPacket receiveLetter = new DatagramPacket(new byte[100], 0, 100);
			ds.receive(receiveLetter);
			byte[] bs = receiveLetter.getData();
			int offset = receiveLetter.getOffset();
			int length = receiveLetter.getLength();
			String newStr = new String(bs, offset, length);//將陣列轉化為字串
		}
		ds.close();
}

伺服器端(Server):從客戶端端收信,返回30封信
	public static void main(String[] args) throws Exception {
		DatagramSocket ds = new DatagramSocket(9090);
		DatagramPacket receiveLetter = new DatagramPacket(new byte[100], 0 , 100);//將接收的信內容存入byte陣列
		ds.receive(receiveLetter);
		InetAddress address = receiveLetter.getAddress(); //獲得客戶端地址
		int port = receiveLetter.getPort();//獲取來信客戶端的埠
		
		//給客戶端傳送30封信
		forI(int I = 0; I <= 30; i++) {
			String str = “這是伺服器端的信”;
			byte[] b = str.getBytes();
			DatagramPacket sendLetter = new DatagramPacket(b, 0, b.length, address, port);	
			ds.send(sendLetter);
			Thread.sleep(200);
}
ds.close();
	}

4).URL程式設計(Uniform Resource Locator)

URL程式設計是在應用層, 統一資源定位器
	格式(字串):協議名://主機地址:埠號/相對路徑
java包  java.net.*;
	用法:
		public static void main(String[] args) throws Exception {
			URL url = new URL(“http://192.168.77.13/corejava.txt”);//建立url
			URLConnection uc = url.openConnection(); //開啟連線
			InputStream is = uc.getInputStream(); //讀取
			BufferedReader br = new BufferedReader(new InputStreamReader(is));//橋轉換
			while(true) {
				String str = br.readLine();
				if(Str == null)
					break;
				System.out.println(str);
			}
			in.close();
		}