學習筆記之網路編程
網路編程入門
網路
- 計算機網路:
- 指將地理位置不同的具有獨立功能的多臺計算機及其外部設備,通過通信線路連接起來,在網路作業系統,網路管理軟體及網路通信協議的管理和協調下,實作資源共享和資訊傳遞的計算機系統,
- 網路編程:
- 在網路通信協議下,實作網路互聯的不同計算機上運行的程式間可以進行資料交換
網路編程三要素
- IP地址:
- 要想讓網路中的計算機能夠互相通信,必須為每臺計算機指定一個標識,通過這個表示好來指定要接收資料的計算機和識別發送到計算機,而IP地址就是標識號,也就是設備的表示
- 埠:
- 網路的通信,本質上是兩個應用程式的通信,每臺計算機都有很多的應用程式,那么就在網路信時,如何區分這些應用程式呢?如果說IP地址可以唯一標識網路中的設備,那么埠號就可以唯一標識設備中的應用程式了,也就是應用程式的標識,
- 協議
- 通過計算機網路可以使多臺計算機實作連接,位于同一個網路中的計算機在進行連接和通信時需要遵守一定的規則,這就像汽車一定要遵守交通規則一樣,在計算機網路中,這些連接和通信的規則被稱為網路通信協議,它對資料的傳輸格式、傳輸速率、傳輸步驟等做了統一規定,通信雙方必須同時遵守才能完成資料交換,常見的協議又UDP協議和TCP協議,
IP地址
- IPv4:是給每個連接在網路上的主機分配一個32bit地址,按照TCP/IP規定,IP地址用二進制來表示,每個IP地址長32bit,也就是4個位元組,例如一個采用二進制形式的IP地址時"11000000 10101000 00000001 01000010",這么長的地址,處理起來太費勁,為了方便實驗,IP地址經常被寫成十進制的形式,中間使用符號“.”分隔不同的位元組,于是,上面的IP地址可以表示為"192.168.1.66",IP地址的這種表示法叫做"點分十進制表示法",這顯然比1和0容易記憶得多,
- IPv6:由于互聯網的蓬勃發展,IP地址的需求量愈來愈大,但是網路地址資源有限,使得IP的分配越發緊張,為了擴大地址空間,通過IPv6重新定義地址空間,采用128位地址長度,每16個位元組一組,分成8組十六進制數,這樣就解決了網路地址資源數量不夠的問題,
InetAddress的使用:
為了方便對IP地址的獲取和操作,JAVA提供了一個類InetAddress供我們使用
InetAddress:此類表示Internet協議(IP)地址
方法:
- static InetAddress getByName(String host) 確定主機名稱的IP地址,主機名稱可以是機器名稱,也可以是IP地址
- String getHostName() 獲取此IP地址的主機名
- String getHostAddress() 回傳文本顯示中的IP地址字串
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Demo {
public static void main(String[] args) throws UnknownHostException {
InetAddress ia = InetAddress.getByName("localHost");
String hostName = ia.getHostName();
String hostAddress = ia.getHostAddress();
System.out.println("主機名"+hostName);
System.out.println("ip地址:"+hostAddress);
}
}
埠
- 埠:設備上應用的唯一標識
- 埠號:兩個位元組表示的整數,它的取值范圍是0-65535,其中,0-1023之間的埠好用于一些知名網路服務和應用,普通的應用程式需要使用1024以上的埠號,如果埠號唄另外一個服務或應用所占用,會導致當前程式啟動失敗,
協議
- 協議:計算機網路,連接和通信的規則唄稱為網路通信協議
- UDP協議
- 用戶資料報協議(User Datagram Protocol)
- UDP是無連接通信協議,即在資料傳輸時,資料的發送端和接收端不建立邏輯連接,簡單來說,當一臺計算機向另外一臺計算機發送資料時,發送端不會確認接收端是否存在,就會發出資料,同樣接收端在收到資料時,也不會翔發送端反饋是否接收到資料
- 由于使用UDP協議消耗資源小,通信效率高,所以通信都會用于音頻,視頻和資料的傳輸,傳輸重要資訊時不建議使用UDP協議,
- TCP協議
- 傳輸控制協議(Transmission Control Protocol)
- TCP協議是面向連接的通信協議,即傳輸資料前,在發送端和連接段建立邏輯連接,然后再傳輸資料他提供了兩臺計算機間可靠無差錯的資料傳輸,在TCP連接中必須要明確客戶端與服務器端,由客戶端向服務端發出連接請求,每次連接的創建都需要經過“三次握手”
- 三次握手:TCP協議中,在發送資料的準備階段,客戶端與服務器端之間的三次互動,以保證連接的可靠
- 第一次握手,客戶端向服務器端發出連接請求,等待服務器確認
- 第二次握手,服務器端向客戶端回送一個相應,通知客戶端收到連接請求
- 第三次握手,客戶端再次向服務器端發送確認資訊,確認連接
- 完成三次握手,連接jianli以后,客戶端和服務器就可以開始進行資料傳輸了,由于這種面向連接的特性,TCP協議可以保證傳輸資料的安全,所以應用十分廣泛,例如上傳檔案、下載檔案、瀏覽網頁等,
UDP通信程式
UDP通信原理
UDP協議是一種不可靠的網路協議,它在通信的兩端各建立一個Socket物件,但是這兩個Socket只發送,接收資料的物件因此對于基于UDP協議的通信雙方而言,沒有所謂的客戶端和服務器的概念,JAVA提供了DatagramSocket類作為基于UDP協議的Socket
UDP發送資料
- 發送資料的步驟
- 創建發送端的Socket物件
- 創建資料,并把資料打包
- 呼叫DatagramSocket物件的方法發送資料
- 關閉發送端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class SendDemo {
public static void main(String[] args) throws IOException {
//1. 創建發送端的Socket物件(DatagramSocket)
//構造資料報套接字并將其系結到本地主機上的任何可用埠,
DatagramSocket ds = new DatagramSocket();
//2. 創建資料,并把資料打包
//DatagramPacket?(byte[] buf, int length, InetAddress address, int port) 構造一個資料包,
// 發送長度為 length的資料包到指定主機上的指定埠號,
byte [] b = "hello,UDP".getBytes();
DatagramPacket dp = new DatagramPacket(b,b.length, InetAddress.getByName("127.0.0.1"),10086);
//. 呼叫DatagramSocket物件的方法發送資料
//void send?(DatagramPacket p) 從此套接字發送資料報包,
ds.send(dp);
//4. 關閉發送端
//void close?() 關閉此資料報套接字,
ds.close();
}
}
UDP接收資料
- 接收資料的步驟
- 創建接收端的Socket物件(DatagramSocket)
- 創建一個資料包,用于接收資料
- 呼叫DatagramSocket物件的方法接收資料
- 決議資料包,并把資料在控制臺顯示
- 關閉接收端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class ReceiveDemo {
public static void main(String[] args) throws IOException {
//1. 創建接收端的Socket物件(DatagramSocket)
//DatagramSocket?(int port) 構造資料報套接字并將其系結到本地主機上的指定埠,
DatagramSocket ds = new DatagramSocket(10086);
//2. 創建一個資料包,用于接收資料
//DatagramPacket?(byte[] buf, int length) 構造一個 DatagramPacket用于接收長度為 length資料包,
byte [] b = new byte[1024];
DatagramPacket dp = new DatagramPacket(b,b.length);
//3. 呼叫DatagramSocket物件的方法接收資料
//void receive?(DatagramPacket p) 從此套接字接收資料報包,
ds.receive(dp);
//4. 決議資料包,并把資料在控制臺顯示
//byte[] getData?() 回傳資料緩沖區,
byte[] data = https://www.cnblogs.com/Hz-z/p/dp.getData();
int len = dp.getLength();
String s = new String(data,0,len);
System.out.println("資料:"+s);
//5. 關閉接收端
ds.close();
}
}
TCP通信程式
TCP通信原理
TCP通信協議是一種可靠的網路協議,它在通信的兩端各建立一個Socket物件,從而在通信的兩端形成網路虛擬鏈路,一旦建立了虛擬的網路鏈路,兩端的程式就可以通過虛擬鏈路進行通信,

JAVA對基于TCP協議的網路提供了良好的封裝,使用Socket物件來代表兩端的通信埠,并通過Socket產生IO流來進行網路通信,
JAVA為客戶端提供了Socket類,為服務器提供了ServerSocket類,
TCP發送資料
步驟
- 創建客戶端的Socket物件(Socket)
- Socket?(String host, int port)
- 獲取輸出流,寫資料
- OutputStream getOutputStream?()
- 釋放資源
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
public class SendDeom {
public static void main(String[] args) throws IOException {
//1. 創建客戶端的Socket物件(Socket)
//Socket?(InetAddress address, int port) 創建流套接字并將其連接到指定IP地址的指定埠號,
// Socket s = new Socket(InetAddress.getByName("172.0.0.1"),12345);
//Socket?(String host, int port) 創建流套接字并將其連接到指定主機上的指定埠號,
Socket s = new Socket("172.0.0.1",12345);
//2. 獲取輸出流,寫資料
//OutputStream getOutputStream?() 回傳此套接字的輸出流,
OutputStream os = s.getOutputStream();
os.write("hello,TCP,你好".getBytes());
//3. 釋放資源
s.close();
}
}
TCP接收資料
步驟
- 創建服務器端的Socket物件(ServerSocket)
- ServerSocket?(int port)
- 監聽客戶端連接,回傳一個Socket物件
- Socket accept?()
- 獲取輸入流,讀資料,并把資料顯示在控制臺
- InputStream getInputStream?()
- 釋放資源
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ReciveDemo {
public static void main(String[] args) throws IOException {
//1. 創建服務器端的Socket物件(ServerSocket)
//ServerSocket?(int port) 創建系結到指定埠的服務器套接字,
ServerSocket ss = new ServerSocket(10010);
//2. 監聽客戶端連接,回傳一個Socket物件
Socket s = ss.accept();
//3. 獲取輸入流,讀資料,并把資料顯示在控制臺
//InputStream getInputStream?() 回傳此套接字的輸入流,
InputStream is = s.getInputStream();
byte [] b = new byte[1024];
int len = is.read(b);
String data = https://www.cnblogs.com/Hz-z/p/new String(b,0,len);
System.out.println("資料是:"+data);
// while ((len = is.read(b))!= -1){
// System.out.println("資料:"+new String(b,0,len));
// }
//4. 釋放資源
ss.close();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/176249.html
標籤:Java
上一篇:深入理解Mybatis(第一講)——手寫ORM框架(簡易版Mybatis)
下一篇:itext7史上最全實戰總結
