文章目錄
- 一、網絡程式設計三要素
-
- 1.1、IP
- 1.2、端口号
- 1.3、協定
- 二、InetAddress類
- 三、UDP通信程式
-
- 3.1、單點傳播
- 3.2、多點傳播
- 3.3、廣播
- 四、TCP協定
一、網絡程式設計三要素
- IP
- 端口号
- 協定
1.1、IP
IP:配置設定給上網裝置的數字标簽(上網裝置在網絡上的唯一位址)
IPV4:采用
32位
位址長度,分
4
組
- 目前主流方案
- 最多
的2
次方個IP,目前已經用完32
java基礎 網絡程式設計學習筆記一、網絡程式設計三要素二、InetAddress類三、UDP通信程式四、TCP協定
IPV6:采用
128
位的位址長度,分
8
組
- 為了解決
不夠用的問題而出現的IPV4
- 最多
的2
次方個IP128
- 甚至可以給地球上每一粒沙子都設定IP
1.2、端口号
由兩個位元組表示的整數,,其中
0-65535
0-1023
用于知名的網絡服務和應用
反正要使用的話用
以上的端口号
1024
注意:一個端口号隻能被一個程式應用
1.3、協定
資料傳輸的規則
UDP協定:使用者資料報協定
- 面向
通信協定無連接配接
-
、速度快
、大小限制(一次最多64K)
、資料不安全
容易丢失資料
- 應用在丢失一些資料無所謂的場景,如:網絡會議,語音通話
- 不管兩台電腦網絡是否連通,
收不到就拉倒
TCP協定: 傳輸控制協定
- 面向
通信協定連接配接
-
、速度慢
、大小不限制
資料安全
- 應用在需要完整資料的場景,如:下載下傳軟體,文字通信
java基礎 網絡程式設計學習筆記一、網絡程式設計三要素二、InetAddress類三、UDP通信程式四、TCP協定
二、InetAddress類
此類表示IP對象
- 有兩個子類,
,Inet4Address
Inet6Address
- 是以在建立
時,底層會判斷目前系統使用的是InetAddress
還是IP4
IP6
注意:此類沒有對外提供構造方法,是以不能new,隻能使用InetAddress.getByName()的方法建立對象,參數為主機名或IP
那麼建立出來的對象表示什麼?
就是IP對象,可以看做是一台電腦的對象
// 擷取InetAddress對象
public void testInetAddress() throws UnknownHostException {
// IP的對象 一台電腦的對象
InetAddress address = InetAddress.getByName("DESKTOP-6RGC961");
// getHostName() 小細節:如果因為網絡原因或者區域網路中壓根沒有這個台電腦,會傳回IP
String hostName = address.getHostName();
System.out.println(hostName);
String hostAddress = address.getHostAddress();
System.out.println(hostAddress);
}
三、UDP通信程式
UDP的三種通信方式:
- 單點傳播:發送給一台電腦
- 多點傳播:發送給一組電腦
多點傳播位址:224.0.0.0 ~ 239.255.255.255,其中224.0.0.0 ~ 224.0.0.255 為預留的多點傳播位址
- 廣播:發送給區域網路的所有電腦
廣播位址:255.255.255.255
3.1、單點傳播
發送端步驟:
- 建立發送端的
對象DatagramSocket
- 資料打包(
對象)DatagramPacket
- 發送資料
- 關閉連接配接
public void testUDPsend() throws IOException {
// 1.建立DatagramSocket對象
// 細節:
// 綁定端口以後就是用這個端口發送
// 有參:指定端口綁定
// 無參:随機端口綁定
DatagramSocket datagramSocket = new DatagramSocket();
// 2.打包資料
String str = "我是發送的資料!";//資料
byte[] strBytes = str.getBytes();//資料轉位元組
InetAddress address = InetAddress.getByName("127.0.0.1");//得到接受的IP對象
int port = 10086;//設定端口号
DatagramPacket datagramPacket=new DatagramPacket(strBytes,strBytes.length,address,port);
// 3.發送
datagramSocket.send(datagramPacket);
// 4.關閉連接配接,釋放資源
datagramSocket.close();
}
接受端步驟:
- 建立發送端的
對象DatagramSocket
- 接受打包好的資料(
)DatagramPacket
- 解析資料包
- 釋放資源
注意:接受打包好的資料是阻塞的,執行到這裡會死等,直到有資訊發過來
// 建立UDP通信,接受端
public void testUDPreceive() throws IOException {
// 1.建立接受對象
// 細節:
// 接受一定要綁定端口
// 發送時指定的是什麼端口,就綁定什麼端口
DatagramSocket datagramSocket = new DatagramSocket(10086);
// 2.接受資料
byte[] bytes = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
datagramSocket.receive(datagramPacket);
// 3.解析資料
byte[] data = datagramPacket.getData();
System.out.println("接受到的資料是:"+new String(data,0,data.length));
InetAddress address = datagramPacket.getAddress();
System.out.println("接受到的位址是:"+address);
int port = datagramPacket.getPort();
System.out.println("發送的端口是:"+port);
// 4.釋放資源
datagramSocket.close();
}
3.2、多點傳播
在單點傳播的基礎上做了修改
- 不再是建立
對象,而是DatagramSocket
對象MulticastSocket
-
更換成多點傳播的位址來設定傳送的位址,隻要是多點傳播内能使用的位址都行InetAddress.getByName("225.0.0.1");
- 接受端需要将本機添加到 發送端設定的位址添加到多點傳播中
InetAddress address = InetAddress.getByName("225.0.0.1");
multicastSocket.joinGroup(address );
- 多點傳播接受對象可以很多個
public static void main(String[] args) throws IOException {
// 1.建立發送對象
MulticastSocket multicastSocket = new MulticastSocket();
// 2.打包資料
String str = "我是發送的資料";
byte[] bytes = str.getBytes();
InetAddress address = InetAddress.getByName("225.0.0.1");
int port = 10086;
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, address, port);
// 3.發送資料
multicastSocket.send(datagramPacket);
// 4.釋放資源
multicastSocket.close();
}
public static void main(String[] args) throws IOException {
// 1.建立接受對象
MulticastSocket multicastSocket = new MulticastSocket(10086);
// 2.将本機添加到225.0.0.1這一組
InetAddress byName = InetAddress.getByName("225.0.0.1");
multicastSocket.joinGroup(byName);
// 3.得到資料
byte[] bytes = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
multicastSocket.receive(datagramPacket);
// 4.解析資料
byte[] data = datagramPacket.getData();
InetAddress address = datagramPacket.getAddress();
String str = new String(data, 0, data.length);
System.out.println(address + "說:" + str);
// 5.關閉連接配接
multicastSocket.close();
}
3.3、廣播
在單點傳播的基礎上,将發送的位址改成廣播的位址(255.255.255.255)
四、TCP協定
TCP通信協定是一種可靠的網絡協定
- 它在通信的兩端各自建立
對象Socket
- 通信之前
確定通信連接配接
- 通過
産生Socket
來進行網絡通信IO流
用戶端書寫步驟:
- 建立用戶端Socket對象(
)與指定服務端連接配接Socket
Socket(String host,int port)
- 擷取輸出流,寫資料
OutputStream getOutputStream()
- 關閉連接配接
void close()
服務端書寫步驟:
- 建立服務端的Socket對象(
)serverSocket
serverSocket(int port)
- 建立監聽,監聽用戶端,傳回一個
對象Socket
Socket accept()
- 擷取輸入流,讀資料
InputStream getInputStream()
- 關閉連接配接
void close()
用戶端代碼:
public class Main {
public static void main(String[] args) throws IOException {
// 1.建立Socket連接配接
// 細節:
// 在建立的同時會連接配接服務端
// 連接配接不上會報錯
Socket socket = new Socket("127.0.0.1",10086);
// 2.調用輸入流
OutputStream outputStream = socket.getOutputStream();
outputStream.write("你好啊".getBytes());
// 3.關閉
outputStream.close();
socket.close();
}
}
服務端代碼:
public class MainServerSocket {
public static void main(String[] args) throws IOException {
// 1.建立ServerSocket連接配接
ServerSocket serverSocket = new ServerSocket(10086);
// 2.監聽用戶端的連接配接
Socket socket = serverSocket.accept();
// 3.擷取輸入流
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
int b;
while ((b =bufferedReader.read())!=-1){
System.out.print((char) b);
}
// 4.關閉連接配接
socket.close();
serverSocket.close();
}
}