網絡編程主要用於解決計算機與計算機(手機、平板..)之間的數據傳輸問題。
網絡編程: 不需要基於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();
}
}