網絡編程主要用於解決計算機與計算機(手機、平板..)之間的數據傳輸問題。
網絡編程: 不需要基於html頁面就可以達到數據之間的傳輸。 比如: feiQ , QQ , 微信....
網頁編程: 就是要基於html頁面的基礎上進行數據的交互的。 比如: 珍愛網、 oa(辦公自動化)、 高考的報告系統...
分布在不同地域 的計算機通過外部設備鏈接起來達到了消息互通、資源共享的效果就稱作為一個計算機網絡。
網絡通訊的三要素:
1. IP
2. 端口號。
3. 協議.
192.168.10.1
IP地址: IP地址的本質就是一個由32位的二進制數據組成的數據。 後來別人為了方便我們記憶IP地址,就把IP地址切成了4份,每份8bit. 2^8 = 0~255
00000000-00000000-00000000-00000000
IP地址 = 網絡號+ 主機號。
IP地址的分類:
A類地址 =一個網絡號 + 三個主機號 2^24 政府單位
B類地址 =兩個網絡號 + 兩個主機號 2^16 事業單位(學校、銀行..)
C類地址= 三個網絡號 + 一個主機號 2^8 私人使用..
InetAddress(IP類)
常用的獲取address對象的方法:
getLocalHost() 獲取本機的IP地址
getByName("IP或者主機名") 根據一個IP地址的字符串形式或者是一個主機名生成一個IP地址對象。 (用於獲取別人的IP地址對象)
getHostAddress() 返回一個IP地址的字符串表示形式。
getHostName() 返回計算機的主機名。
// getLocalHost 獲取本機的IP地址對象 /* * InetAddress address = InetAddress.getLocalHost(); * System.out.println("IP地址:"+address.getHostAddress()); * System.out.println("主機名:"+address.getHostName()); */ // 獲取別人機器的IP地址對象。 // 可以根據一個IP地址的字符串形式或者是一個主機名生成一個IP地址對象。 InetAddress address = InetAddress.getByName("YIFAN"); System.out.println("IP地址:" + address.getHostAddress()); System.out.println("主機名:" + address.getHostName());
端口號是沒有類描述的。
端口號的范圍: 0~65535
從0到1023, 系統緊密綁定於一些服務。
1024~65535 我們可以使用....
在java中網絡通訊業稱作為Socket(插座)通訊,要求通訊 的兩台器都必須要安裝Socket。
不同的協議就有不同 的插座(Socket)
1. 將數據極封裝為數據包,面向無連接。
2. 每個數據包大小限制在64K中
3. 因為無連接,所以不可靠
4. 因為不需要建立連接,所以速度快
5. udp 通訊是不分服務端與客戶端的,只分發送端與接收端。
比如: 物管的對講機, 飛Q聊天、 游戲...
DatagramSocket (udp插座服務)
DatagramPacket (數據包類)
DatagramPacket (buf, length, address, port)
buf: 發送的數據內容
length : 發送數據內容的大小。
address : 發送的目的IP地址對象
port : 端口號。
1. 建立udp的服務。
2. 准備數據,把數據封裝到數據包中發送。 發送端的數據包要帶上ip地址與端口號。
3. 調用udp的服務,發送數據。
4. 關閉資源。
發送端demo:
public class Demo1Sender { public static void main(String[] args) throws IOException { // 建立udp的服務 DatagramSocket datagramSocket = new DatagramSocket(); // 准備數據,把數據封裝到數據包中。 String data = "這個是我第一個udp的例子.."; // 創建了一個數據包 DatagramPacket packet = new DatagramPacket(data.getBytes(), data.getBytes().length, InetAddress.getLocalHost(), 9090); // 調用udp的服務發送數據包 datagramSocket.send(packet); // 關閉資源 ---實際上就是釋放占用的端口號 datagramSocket.close(); } }
1. 建立udp的服務
2. 准備空 的數據 包接收數據。
3. 調用udp的服務接收數據。
4. 關閉資源
接收端demo:
public class Demo1Receive { public static void main(String[] args) throws IOException { // 建立udp的服務 ,並且要監聽一個端口。 DatagramSocket socket = new DatagramSocket(9090); // 准備空的數據包用於存放數據。 byte[] buf = new byte[1024]; DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length); // 1024 // 調用udp的服務接收數據 socket.receive(datagramPacket); // receive是一個阻塞型的方法,沒有接收到數據包之前會一直等待。 // 數據實際上就是存儲到了byte的自己數組中了。 System.out.println("接收端接收到的數據:" + new String(buf, 0, datagramPacket.getLength())); // getLength() // 獲取數據包存儲了幾個字節。 // 關閉資源 socket.close(); } }
以上程序 分來運行,一個在命令行 ,一個在Eclipse。
udp是一個不可靠(數據包可能會丟失)的協議
什麼情況下數據包會出現丟失呢?
1.帶寬不足 。
2.cpu的處理能力不足。
public class SafeReceive { public static void main(String[] args) throws IOException, Exception { //建立udp的服務 DatagramSocket socket = new DatagramSocket(9090); //建立空的數據包存儲數據 byte[] buf = new byte[1024]; DatagramPacket packet = new DatagramPacket(buf, buf.length); //不斷接收數據包 while(true){ socket.receive(packet); System.out.println(new String(buf,0,packet.getLength())); Thread.sleep(10); } } }
TCP通訊協議特點:
1. tcp是基於IO流進行數據 的傳輸 的,面向連接。
2. tcp進行數據傳輸的時候是沒有大小限制的。
3. tcp是面向連接,通過三次握手的機制保證數據的完整性。 可靠協議。
4. tcp是面向連接的,所以速度慢。
5. tcp是區分客戶端與服務端 的。
比如: 打電話、 QQ\feiQ的文件傳輸、 迅雷下載....
*/
tcp協議下的Socket:
Socket(客戶端) , tcp的客戶端一旦啟動馬上要與服務端進行連接。
ServerSocket(服務端類)
tcp的客戶端使用步驟:
1. 建立tcp的客戶端服務。
2. 獲取到對應的流對象。
3.寫出或讀取數據
4. 關閉資源。
public class Demo1Clinet { public static void main(String[] args) throws IOException{ //建立tcp的服務 Socket socket = new Socket(InetAddress.getLocalHost(),9090); //獲取到Socket的輸出流對象 OutputStream outputStream = socket.getOutputStream(); //利用輸出流對象把數據寫出即可。 outputStream.write("服務端你好".getBytes()); //獲取到輸入流對象,讀取服務端回送的數據。 InputStream inputStream = socket.getInputStream(); byte[] buf = new byte[1024]; int length = inputStream.read(buf); System.out.println("客戶端接收到的數據:"+ new String(buf,0,length)); //關閉資源 socket.close(); } }
//tcp的服務端
/*
java.net.BindException: 端口被占用。
ServerSocket的使用 步驟
1. 建立tcp服務端 的服務。
2. 接受客戶端的連接產生一個Socket.
3. 獲取對應的流對象讀取或者寫出數據。
4. 關閉資源。
//服務端 public class Demo1Server { public static void main(String[] args) throws Exception { //建立Tcp的服務端,並且監聽一個端口。 ServerSocket serverSocket = new ServerSocket(9090); //接受客戶端的連接 Socket socket = serverSocket.accept(); //accept() 接受客戶端的連接 該方法也是一個阻塞型的方法,沒有客戶端與其連接時,會一直等待下去。 //獲取輸入流對象,讀取客戶端發送的內容。 InputStream inputStream = socket.getInputStream(); byte[] buf = new byte[1024]; int length = 0; length = inputStream.read(buf); System.out.println("服務端接收:"+ new String(buf,0,length)); //獲取socket輸出流對象,想客戶端發送數據 OutputStream outputStream = socket.getOutputStream(); outputStream.write("客戶端你好啊!".getBytes()); //關閉資源 serverSocket.close(); } }