『黑馬程序員』---java--網絡編程--網絡編程概念+UDP基礎

----------- android培訓java培訓、java學習型技術博客、期待與您交流! ------------

網絡編程----說白了就是Socket編程.....

網絡模型

OSI參考模型

TCP/IP參考模型

網絡通訊要素

IP地址

端口號

傳輸協議




應用層--協議:http,ftp

傳輸層--協議:tcp,udp

網際層—協議:ip

網絡通訊要素

IP地址

網絡中設備的標識

不易記憶,可用主機名

本地迴環地址:127.0.0.1 主機名:localHost

✔端口號

用於標識進程的邏輯地址,不同進程標識

有效端口:0~65535,其中0~1024系統使用或保留端口

✔傳輸協議

通訊的規則

常見協議:TCP,UDP


TCP和UDP

✔UDP

將數據及源和目的封裝成數據包中,不需要建立連接

每個數據報的大小限制在64K內

因無連接,是不可靠協議

不需要建立連接,速度快

✔TCP

建立連接,形成傳輸數據的通道

在連接中進行大數據量的傳輸

通過三次握手完成連接,是可靠協議

必須建立連接,效率會稍低


UDP面向無連接,數據需要封包(限制在沒包64K以內).現實比擬,郵局發包裹.

TCP面向連接,現實比擬打電話過程.UDP現實比擬對講機傳話過程.


java.net 包中,用於描述IP地址的
類 InetAddress




Socket

✔Socket就是爲網絡服務提供的一種機制

✔通信的兩端都有Socket

✔網絡通信其實就是Socket間的通信

✔數據在兩個Socket間通過IO傳輸

Socket[插座;套接字]Socket主要記住流程.----網絡編程就是Socket編程


Socket就是港口.接送貨物的...


UDP傳輸

✔DatagramSocket與DatagramPacket

✔建立發送端,接受端

✔建立數據包

✔調用Socket的發送接受方法

✔關閉Socket

發送端與接收端是兩個獨立的運行程序




需求一:通過UDP協議傳輸一段文字數據到指定目的地.

思路:

1,建立UDPSocket服務

2,提供數據,並將數據封裝到數據包中

3,通過socket服務的發送功能,將數據包發出去

4,關閉資源



需求二:接受一個UDP協議傳輸過來的數據

思路:

1,定義UDPSocket服務,通常會監聽一個端口,其實就是給這個接受網絡應喲個程序定義數字標識.

方便於明確那些數據過來該應用程序可以處理.

2,定義一個數據包,因爲要存儲接受到的字節數據

因爲數據包對象中有更多功能可以提取字節數據中的不同數據信息

3,通過socket服務的receive()方法將收到的數據存入已經定義好的數據包中

4,通過數據包對象的特有功能,將這些不同的數據取出,打印在控制檯上

5,關閉資源ok

接收端要指定一個監聽的端口,時刻關注屬於自己的包裹.




實例:實現,循環輸入,循環接收………
import java.io.*;
import java.net.*;
class UdpSend{
	public static void main(String[] args)throws Exception{
	//建立socket服務,參數默認,系統自動分配端口.
	DatagramSocket ds=new DatagramSocket();
	//實現,鍵盤錄入,實時發送消息
	BufferedReader bur=
		new BufferedReader(new InputStreamReader(System.in));
	String line=null;
	while((line=bur.readLine())!=null){
		if(line.equals("exit"))
			break;
		byte[] btbuf=line.getBytes();
		//建立包裹,指定數據緩衝byte數組和其長度,並指定ip,和端口
		DatagramPacket dp=new DatagramPacket(btbuf,btbuf.length,InetAddress.getByName("127.0.0.1"),10000);
		//發送.
		ds.send(dp);
	}
	//exit後,關閉
		ds.close();
	}
	
	
	
	
}
class UdpRece{
	public static void main(String[] args)throws Exception{
	//建立服務,指定以下端口,讓他在這個端口處等候,包裹的到來
	DatagramSocket ds=new DatagramSocket(10000);
	//建立循環接受---內部有阻塞方法,不能構成死循環
	while(true){//注意 new DatagramSocket不要丟盡循環,會報[端口綁定異常]
	//建立byte緩存,以便下面等待包裹
	byte[] buf=new byte[1024];
	//建立包裹存儲收到的包裹
	DatagramPacket dp=new DatagramPacket(buf,buf.length);
	//結束命令啓動
	ds.receive(dp);
	//獲取信息
	String ip=dp.getAddress().getHostAddress();
	String data=new String(dp.getData(),0,dp.getLength());
	System.out.println(ip+":"+data+"---"+dp.getPort());
	}

	}
}

注意:

192.168.1.0網絡段

192.168.1.255廣播地址,所有的ip段內的ip都能接收到.


用UDP自制簡單局域網聊天小程序

import java.io.*;
import java.net.*;
class UdpSend implements Runnable{
	private DatagramSocket ds;
	UdpSend(DatagramSocket ds){
		this.ds=ds;
	}
	public void run(){
	//建立socket服務,參數默認,系統自動分配端口.
	try{
	//實現,鍵盤錄入,實時發送消息
		System.out.println("----------------------------------");
	BufferedReader bur=
								new BufferedReader(new InputStreamReader(System.in));
	String line=null;
	while((line=bur.readLine())!=null){
	
		if(line.equals("exit"))
			break;
		byte[] btbuf=line.getBytes();
		//建立包裹,指定數據緩衝byte數組和其長度,並指定ip,和端口
		DatagramPacket dp=new DatagramPacket(btbuf,btbuf.length,InetAddress.getByName("192.168.1.255"),10000);
		//發送.
		ds.send(dp);
	}
	//exit後,關閉
		ds.close();
	}
	catch(Exception i){
		throw new RuntimeException("檢修");
	}
	
	
	
}
}
class UdpRece implements Runnable{
	private DatagramSocket ds;
	UdpRece(DatagramSocket ds){
		this.ds=ds;
	}
	public void run(){
	try{
	//建立服務,指定以下端口,讓他在這個端口處等候,包裹的到來
	//建立循環接受
	while(true){
	//建立byte緩存,以便下面等待包裹
	byte[] buf=new byte[1024];
	//建立包裹存儲收到的包裹
	DatagramPacket dp=new DatagramPacket(buf,buf.length);
	//結束命令啓動
	ds.receive(dp);
	//獲取信息
	String ip=dp.getAddress().getHostAddress();
	String data=new String(dp.getData(),0,dp.getLength());
	System.out.println("*******************************");
	System.out.println(ip+":"+data+"---"+dp.getPort());
	System.out.println("*******************************");
	}

	}catch(Exception e){
			throw new RuntimeException("  ");
	}
}
}
class chat{
	public static void main(String[] args)throws Exception{
	DatagramSocket ds=new DatagramSocket();
	DatagramSocket d=new DatagramSocket(10000);
	System.out.println("聊天模式啓動");
	new Thread(new UdpSend(ds)).start();
	new Thread(new UdpRece(d)).start();

	}


}






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章