Java21-day12【网络编程(网络编程入门(ip地址、端口、协议、InetAddress)、UDP通信程序、TCP通信程序)】
- 視頻+資料【鏈接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg? ?提取碼:zjxs】
- Java基礎--學習筆記(零起點打開java世界的大門)--博客匯總表
? ?? ??
目? ?錄
01_網(wǎng)絡編程概述
1.1、網(wǎng)絡編程概述
02_網(wǎng)絡編程三要素
1.2、網(wǎng)絡編程三要素
03_IP地址
1.3、IP地址
04_InetAddress
1.4、InetAddress的使用
05_端口和協(xié)議
1.5、端口
1.6、協(xié)議
06_UDP發(fā)送數(shù)據(jù)
2.1、UDP通信原理
2.2、UDP發(fā)送數(shù)據(jù)
07_UDP接收數(shù)據(jù)
2.3、UDP接收數(shù)據(jù)
08_UDP通信程序練習
2.4、UDP通信程序練習
09_TCP發(fā)送數(shù)據(jù)
3.1、TCP通信原理
3.2、TCP發(fā)送數(shù)據(jù)
10_TCP接收數(shù)據(jù)
3.3、TCP接收數(shù)據(jù)
11_TCP通信程序練習1(服務器給出反饋)
3.4、TCP通信程序練習
12_TCP通信程序練習2(客戶端數(shù)據(jù)來自于鍵盤錄入)
3.4、TCP通信程序練習
13_TCP通信程序練習3(服務器數(shù)據(jù)寫入文本文件)
3.4、TCP通信程序練習
14_TCP通信程序練習4(客戶端數(shù)據(jù)來自于文本文件)
3.4、TCP通信程序練習
15_TCP通信程序練習5(上傳文件服務器給出反饋)
3.4、TCP通信程序練習
1、ServerDemo.java
2、ClientDemo.java
16_TCP通信程序練習6(多線程實現(xiàn)文件上傳)
3.4、TCP通信程序練習
1、ServerDemo.java
2、ClientDemo.java
3、ServerThread.java
01_網(wǎng)絡編程概述
? ??
1.1、網(wǎng)絡編程概述
計算機網(wǎng)絡:
- 是指將地理位置不同的具有獨立功能的多臺計算機及其外部設備,通過通信線路連接起來,在網(wǎng)絡操作系統(tǒng),網(wǎng)絡管理軟件及網(wǎng)絡通信協(xié)議的管理和協(xié)調下,實現(xiàn)資源共享和信息傳遞的計算機系統(tǒng)。
網(wǎng)絡編程:
- 在網(wǎng)絡通信協(xié)議下,實現(xiàn)網(wǎng)絡互連的不同計算機上運行的程序間可以進行數(shù)據(jù)交換。
02_網(wǎng)絡編程三要素
1.2、網(wǎng)絡編程三要素
IP地址
- 要想讓網(wǎng)絡中的計算機能夠互相通信,必須為每臺計算機指定一個標識號,通過這個標識號來指定要接收數(shù)據(jù)的計算機和識別發(fā)送的計算機,而IP地址就是這個標識號。也就是設備的標識。
端口
- 網(wǎng)絡的通信,本質上是兩個應用程序的通信。每臺計算機都有很多的應用程序,那么在網(wǎng)絡通信時,如何區(qū)分這些應用程序呢?如果說IP地址可以唯一標識網(wǎng)絡中的設備,那么端口號就可以唯一標識設備中的應用程序了。也就是應用程序的標識。
協(xié)議
- 通過計算機網(wǎng)絡可以使多臺計算機實現(xiàn)連接,位于同一個網(wǎng)絡中的計算機在進行連接和通信時需要遵守一定的規(guī)則,這就好比在道路中行駛的汽車一定要遵守交通規(guī)則一樣。在計算機網(wǎng)絡中,這些連接和通信的規(guī)則被稱為網(wǎng)絡通信協(xié)議,它對數(shù)據(jù)的傳輸格式、傳輸速率、傳輸步驟等做了統(tǒng)一規(guī)定,通信雙方必須同時遵守才能完成數(shù)據(jù)交換。常見的協(xié)議有UDP協(xié)議和TCP協(xié)議。
03_IP地址
1.3、IP地址
IP地址:是網(wǎng)絡中設備的唯一標識。
IP地址分為兩大類:
- IPv4:是給每個連接在網(wǎng)絡上的主機分配一個32bit地址。按照TCP/IP規(guī)定,IP地址用二進制來表示,每 個IP地址長32bit,也就是4個字節(jié)。例如一個采用二進制形式的IP地址是“11000000 10101000 00000001 01000010”,這么長的地址,處理起來也太費勁了。為了方便使用,IP地址經(jīng)常被寫成十進制的形式,中間使用符號“.”分隔不同的字節(jié)。于是,上面的IP地址可以表示為“192.168.1.66”。IP地址的這種表示法叫做“點分十進制表示法”,這顯然比1和0容易記憶得多。
- IPv6:由于互聯(lián)網(wǎng)的蓬勃發(fā)展,IP地址的需求量愈來愈大,但是網(wǎng)絡地址資源有限,使得IP的分配越發(fā)緊張。為了擴大地址空間,通過IPv6重新定義地址空間,采用128位地址長度,每16個字節(jié)一組,分成8組十六進制數(shù),這樣就解決了網(wǎng)絡地址資源數(shù)量不夠的問題。
DOS常用命令:
- ipconfig:查看本機IP地址。
- ping IP地址:檢查網(wǎng)絡是否連通。
特殊IP地址:
- 127.0.0.1:是回送地址,可以代表本機地址,一般用來測試使用。
? ??
?
04_InetAddress
1.4、InetAddress的使用
為了方便我們對IP地址的獲取和操作,Java提供了一個類InetAddress供我們使用。
InetAddress:此類表示Internet協(xié)議(IP)地址。
InetAddress類,無構造方法,大多數(shù)方法 都是 非靜態(tài)方法。此類提供靜態(tài)方式,得到該類對象。
??
05_端口和協(xié)議
1.5、端口
端口:設備上應用程序的唯一標識。
端口號:用兩個字節(jié)表示的整數(shù),它的取值范圍是0~65535。其中,0~1023之間的端口號用于一些知名的網(wǎng)絡服務和應用,普通的應用程序需要使用1024以上的端口號。如果端口號被另外一個服務或應用所占用,會導致當前程序啟動失敗(啟動失敗,修改端口號)。
1.6、協(xié)議
協(xié)議:計算機網(wǎng)絡中,連接和通信的規(guī)則被稱為網(wǎng)絡通信協(xié)議。
UDP協(xié)議
- 用戶數(shù)據(jù)報協(xié)議(User Datagram Protocol)
- UDP是無連接通信協(xié)議,即在數(shù)據(jù)傳輸時,數(shù)據(jù)的發(fā)送端和接收端不建立邏輯連接。簡單來說,當一臺計算機向另外一臺計算機發(fā)送數(shù)據(jù)時,發(fā)送端不會確認接收端是否存在,就會發(fā)出數(shù)據(jù),同樣接收端在收到數(shù)據(jù)時,也不會向發(fā)送端反饋是否收到數(shù)據(jù)。由于使用UDP協(xié)議消耗資源小,通信效率高,所以通常都會用于音頻、視頻和普通數(shù)據(jù)的傳輸。
- 例如視頻會議通常采用UDP協(xié)議,因為這種情況即使偶爾丟失一兩個數(shù)據(jù)包,也不會對接收結果產(chǎn)生太大影響。但是在使用UDP協(xié)議傳送數(shù)據(jù)時,由于UDP的面向無連接性,不能保證數(shù)據(jù)的完整性,因此在傳輸重要數(shù)據(jù)時不建議使用UDP協(xié)議。
TCP協(xié)議
- 傳輸控制協(xié)議 (Transmission Control Protocol)
- TCP協(xié)議是面向連接的通信協(xié)議,即傳輸數(shù)據(jù)之前,在發(fā)送端和接收端建立邏輯連接,然后再傳輸數(shù)據(jù),它提供了兩臺計算機之間可靠無差錯的數(shù)據(jù)傳輸。在TCP連接中必須要明確客戶端與服務器端,由客戶端向服務端發(fā)出連接請求,每次連接的創(chuàng)建都需要經(jīng)過“三次握手”。
- 三次握手:TCP協(xié)議中,在發(fā)送數(shù)據(jù)的準備階段,客戶端與服務器之間的三次交互,以保證連接的可靠。
第一次握手,客戶端向服務器端發(fā)出連接請求,等待服務器確認。
第二次握手,服務器端向客戶端回送一個響應,通知客戶端收到了連接請求。
第三次握手,客戶端再次向服務器端發(fā)送確認信息,確認連接。
- 完成三次握手,連接建立后,客戶端和服務器就可以開始進行數(shù)據(jù)傳輸了。由于這種面向連接的特性,TCP協(xié)議可以保證傳輸數(shù)據(jù)的安全,所以應用十分廣泛。例如上傳文件、下載文件、瀏覽網(wǎng)頁等。
06_UDP發(fā)送數(shù)據(jù)
2.1、UDP通信原理
Java中的UDP通信
- UDP協(xié)議是一種不可靠的網(wǎng)絡協(xié)議,它在通信的兩端各建立一個Socket對象,但是這兩個Socket只是發(fā)送,接收數(shù)據(jù)的對象,因此對于基于UDP協(xié)議的通信雙方而言,沒有所謂的客戶端和服務器的概念。
- Java提供了DatagramSocket類作為基于UDP協(xié)議的Socket。? ?通過DatagramSocket實現(xiàn)UDP發(fā)送、接收數(shù)據(jù)。
2.2、UDP發(fā)送數(shù)據(jù)
發(fā)送數(shù)據(jù)的步驟:
- ①創(chuàng)建發(fā)送端的Socket對象(DatagramSocket)? ?//?UDP協(xié)議,是用戶數(shù)據(jù)包協(xié)議。
DatagramSocket?()
- ②創(chuàng)建數(shù)據(jù),并把數(shù)據(jù)打包
DatagramPacket(bys[] buf, int length, InetAddress address, int port);
- ③調用DatagramSocket對象的方法發(fā)送數(shù)據(jù)
void send(DatagramPacket p)
- ④關閉發(fā)送端
void close()
? ??
?
數(shù)據(jù)發(fā)送成功【沒有接收端】!把數(shù)據(jù)發(fā)送到xxx主機的xxxx端口。
07_UDP接收數(shù)據(jù)
2.3、UDP接收數(shù)據(jù)
接收數(shù)據(jù)的步驟:
- ①創(chuàng)建接收端的Socket對象(DatagramSocket)
DatagramSocket(int port)
- ②創(chuàng)建一個數(shù)據(jù)包,用于接收數(shù)據(jù)? ?//?接收發(fā)送端的數(shù)據(jù)
DatagramPacket(byte[] buf, int length)
- ③調用DatagramSocket對象的方法接收數(shù)據(jù)
void receive(DatagramPacket p)
- ④解析數(shù)據(jù)包,并把數(shù)據(jù)在控制臺顯示
byte[] getData()? ?// 得到數(shù)據(jù)緩沖區(qū)
int getLength()??? // 得到發(fā)送端實際發(fā)送了多少數(shù)據(jù)。
- ⑤關閉接收端
void close()
優(yōu)化代碼:
?
08_UDP通信程序練習
2.4、UDP通信程序練習
按照下面的要求實現(xiàn)程序(案例需求):
- UDP發(fā)送數(shù)據(jù):數(shù)據(jù)來自于鍵盤錄入,直到輸入的數(shù)據(jù)是886,發(fā)送數(shù)據(jù)結束。
- UDP接收數(shù)據(jù):因為接收端不知道發(fā)送端什么時候停止發(fā)送,故采用死循環(huán)接收。
09_TCP發(fā)送數(shù)據(jù)
3.1、TCP通信原理
Java中的TCP通信
TCP通信協(xié)議是一種可靠的網(wǎng)絡協(xié)議,它在通信的兩端各建立一個Socket對象,從而在通信的兩端形成網(wǎng)絡虛擬鏈路,一旦建立了虛擬的網(wǎng)絡鏈路,兩端的程序就可以通過虛擬鏈路進行通信。
Java對基于TCP協(xié)議的的網(wǎng)絡提供了良好的封裝,使用Socket對象來代表兩端的通信端口,并通過Socket產(chǎn)生IO流來進行網(wǎng)絡通信。
Java為客戶端提供了Socket類,為服務器端提供了ServerSocket類。
? ?通過“網(wǎng)絡虛擬鏈路”進行通信。通過IO流進行通信。
3.2、TCP發(fā)送數(shù)據(jù)
發(fā)送數(shù)據(jù)的步驟:
- ①創(chuàng)建客戶端的Socket對象(Socket)? ?// TCP協(xié)議:傳輸控制協(xié)議,通過IO流傳輸數(shù)據(jù)
Socket(String host, int port)? ?// 指定主機、端口
- ②獲取輸出流,寫數(shù)據(jù)? ?// IO流寫數(shù)據(jù)
OutputStream getOutputStream()? ?// 得到字節(jié)輸出流
- ③釋放資源
void close()
10_TCP接收數(shù)據(jù)
3.3、TCP接收數(shù)據(jù)
接收數(shù)據(jù)的步驟:
- ①創(chuàng)建服務器端的Socket對象(ServerSocket)
ServerSocket(int port)
- ②監(jiān)聽客戶端連接,返回一個Socket對象
Socket accept()
- ③獲取輸入流,讀數(shù)據(jù),并把數(shù)據(jù)顯示在控制臺
InputStream getInputStream()
- ④釋放資源
void close()
package src.com.itheima_04;import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; /*TCP接收數(shù)據(jù)的步驟1:創(chuàng)建服務器端的Socket對象(ServerSocket)2:獲取輸入流,讀數(shù)據(jù),并把數(shù)據(jù)顯示在控制臺3:釋放資源*/ public class ServerDemo {public static void main(String[] args) throws IOException {//1:創(chuàng)建服務器端的Socket對象(ServerSocket)//ServerSocket?(int port) 創(chuàng)建綁定到指定端口的服務器套接字ServerSocket ss = new ServerSocket(10000);//Socket accept?() 偵聽要連接到此套接字并接受它Socket s = ss.accept();//2:獲取輸入流,讀數(shù)據(jù),并把數(shù)據(jù)顯示在控制臺InputStream is = s.getInputStream();byte[] bys = new byte[1024];int len = is.read(bys);String data = new String(bys,0,len);System.out.println("數(shù)據(jù)是:" + data);//3:釋放資源s.close();ss.close();} }11_TCP通信程序練習1(服務器給出反饋)
3.4、TCP通信程序練習
練習1
- 客戶端:發(fā)送數(shù)據(jù),接收服務器反饋。
- 服務器:接收數(shù)據(jù),給出反饋。
案例分析
12_TCP通信程序練習2(客戶端數(shù)據(jù)來自于鍵盤錄入)
3.4、TCP通信程序練習
練習2
- 客戶端:數(shù)據(jù)來自于鍵盤錄入,直到輸入的數(shù)據(jù)是886,發(fā)送數(shù)據(jù)結束。
- 服務器:接收到的數(shù)據(jù)在控制臺輸出。
案例分析
13_TCP通信程序練習3(服務器數(shù)據(jù)寫入文本文件)
3.4、TCP通信程序練習
練習3
- 客戶端:數(shù)據(jù)來自于鍵盤錄入,直到輸入的數(shù)據(jù)是886,發(fā)送數(shù)據(jù)結束。
- 服務器:接收到的數(shù)據(jù)寫入文本文件。
案例分析
14_TCP通信程序練習4(客戶端數(shù)據(jù)來自于文本文件)
3.4、TCP通信程序練習
練習4
- 客戶端:數(shù)據(jù)來自于文本文件。
- 服務器:接收到的數(shù)據(jù)寫入文本文件。
案例分析
15_TCP通信程序練習5(上傳文件服務器給出反饋)
3.4、TCP通信程序練習
練習5
- 客戶端:數(shù)據(jù)來自于文本文件,接收服務器反饋。
- 服務器:接收到的數(shù)據(jù)寫入文本文件,給出反饋。
- 出現(xiàn)問題:程序一直等待。
- 原因:讀數(shù)據(jù)的方法是阻塞式的。
- 解決辦法:自定義結束標記;使用shutdownOutput()方法(推薦)。
案例分析
1、ServerDemo.java
package src.com.itheima_09;import java.io.*; import java.net.ServerSocket; import java.net.Socket;/*服務器:接收到的數(shù)據(jù)寫入文本文件,給出反饋*/ public class ServerDemo {public static void main(String[] args) throws IOException {//創(chuàng)建服務器Socket對象ServerSocket ss = new ServerSocket(10000);//監(jiān)聽客戶端連接,返回一個對應的Socket對象Socket s = ss.accept();//接收數(shù)據(jù)BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));//把數(shù)據(jù)寫入文本文件BufferedWriter bw = new BufferedWriter(new FileWriter("Copy.java"));String line;while ((line = br.readLine()) != null) { //等待讀取數(shù)據(jù) // if("886".equals(line)) { // break; // }bw.write(line);bw.newLine();bw.flush();}// System.out.println(11111);//給出反饋BufferedWriter bwServer = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));bwServer.write("文件上傳成功");bwServer.newLine();bwServer.flush();//釋放資源bw.close();ss.close();} }2、ClientDemo.java
package src.com.itheima_09;import java.io.*; import java.net.Socket;/*客戶端:數(shù)據(jù)來自于文本文件,接收服務器反饋*/ public class ClientDemo {public static void main(String[] args) throws IOException {//創(chuàng)建客戶端Socket對象Socket s = new Socket("192.168.1.66", 10000);//封裝文本文件的數(shù)據(jù)BufferedReader br = new BufferedReader(new FileReader("InetAddressDemo.java"));//封裝輸出流寫數(shù)據(jù)BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));String line;while ((line = br.readLine()) != null) {bw.write(line);bw.newLine();bw.flush();}// System.out.println(22222);//自定義結束標記 // bw.write("886"); // bw.newLine(); // bw.flush();//public void shutdownOutput?()s.shutdownOutput();//接收反饋BufferedReader brClient = new BufferedReader(new InputStreamReader(s.getInputStream()));String data = brClient.readLine(); //等待讀取數(shù)據(jù)System.out.println("服務器的反饋:" + data);//釋放資源br.close();s.close();} }16_TCP通信程序練習6(多線程實現(xiàn)文件上傳)
3.4、TCP通信程序練習
練習6
- 客戶端:數(shù)據(jù)來自于文本文件,接收服務器反饋。
- 服務器:接收到的數(shù)據(jù)寫入文本文件,給出反饋,代碼用線程進行封裝,為每一個客戶端開啟一個線程。
案例分析
1、ServerDemo.java
package src.com.itheima_10;import java.io.IOException; import java.net.ServerSocket; import java.net.Socket;/*服務器:接收到的數(shù)據(jù)寫入文本文件,給出反饋,代碼用線程進行封裝,為每一個客戶端開啟一個線程*/ public class ServerDemo {public static void main(String[] args) throws IOException {//創(chuàng)建服務器Socket對象ServerSocket ss = new ServerSocket(10000);while (true) {//監(jiān)聽客戶端連接,返回一個對應的Socket對象Socket s = ss.accept();//為每一個客戶端開啟一個線程new Thread(new ServerThread(s)).start();}// ss.close();} }2、ClientDemo.java
package src.com.itheima_10;import java.io.*; import java.net.Socket;/*客戶端:數(shù)據(jù)來自于文本文件,接收服務器反饋*/ public class ClientDemo {public static void main(String[] args) throws IOException {//創(chuàng)建客戶端Socket對象Socket s = new Socket("127.0.0.1", 10000);//封裝文本文件的數(shù)據(jù)BufferedReader br = new BufferedReader(new FileReader("s.txt"));//封裝輸出流寫數(shù)據(jù)BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));String line;while ((line = br.readLine()) != null) {bw.write(line);bw.newLine();bw.flush();}s.shutdownOutput();//接收反饋BufferedReader brClient = new BufferedReader(new InputStreamReader(s.getInputStream()));String data = brClient.readLine(); //等待讀取數(shù)據(jù)System.out.println("服務器的反饋:" + data);//釋放資源br.close();s.close();} }3、ServerThread.java
package src.com.itheima_10;import java.io.*; import java.net.Socket;public class ServerThread implements Runnable {private Socket s;public ServerThread(Socket s) {this.s = s;}@Overridepublic void run() {try {//接收數(shù)據(jù)寫到文本文件BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); // BufferedWriter bw = new BufferedWriter(new FileWriter("myNet\\Copy.java"));//解決名稱沖突問題int count = 0;File file = new File("Copy[" + count + "].txt");while (file.exists()) {count++;file = new File("Copy[" + count + "].txt");}BufferedWriter bw = new BufferedWriter(new FileWriter(file));String line;while ((line = br.readLine()) != null) {bw.write(line);bw.newLine();bw.flush();}//給出反饋BufferedWriter bwServer = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));bwServer.write("文件上傳成功");bwServer.newLine();bwServer.flush();//釋放資源s.close();} catch (IOException e) {e.printStackTrace();}} }🙌? ?🤞? ??? ?😘? ?奧里給~
總結
以上是生活随笔為你收集整理的Java21-day12【网络编程(网络编程入门(ip地址、端口、协议、InetAddress)、UDP通信程序、TCP通信程序)】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java20-day11【实现多线程(进
- 下一篇: java美元兑换,(Java实现) 美元