文章目錄
- 1.網絡程式設計入門
-
- 1.1 網絡程式設計概述
- 1.2 網絡程式設計的三要素
- 1.3 IP位址
- 1.4 InetAddress類的使用
- 1.5 端口
- 1.6 協定(UDP/TCP)
- 2. UDP通信程式
-
- 2.1 UDP通信原理
- 2.2 UDP發送資料
- 2.3 UDP接收資料
- 2.4 UDP通信程式練習
- 3. TCP通信程式
-
- 3.1 TCP通信原理
- 3.2 TCP發送資料
- 3.3 TCP接收資料
- 3.4 TCP通信程式練習
1.網絡程式設計入門
1.1 網絡程式設計概述
計算機網絡:
- 是指将地理位置不同的句有獨立功能的多态計算機及其外部裝置,通過通信線路連接配接起來,在網絡作業系統網絡管理軟體及網絡通信協定的管理和協調下,實作資源共享和資訊傳遞的計算機系統
網絡程式設計:
- 在網絡通信協定下,實作網絡互聯的不同計算機上運作的程式可以進行資料交換
1.2 網絡程式設計的三要素
IP位址:
- 要想讓網絡中的計算機能夠互相通信,必須為每台計算機指定一個辨別号,通過這個辨別号。也就是裝置的辨別
端口:
- 網絡的通信,本質上是兩個應用程式的通信。每台計算機都有很多的應用程式,那麼在網絡通信時,如何區分這些應用程式呢?如果說IP位址可以唯一辨別網絡中的裝置,那麼端口号就可以唯一辨別裝置中的應用程式了。也就是應用程式的辨別
協定:
- 通過計算機網絡可以使多台計算機實作連結,位于同一個網絡中的計算機在進行連接配接和通信時需要遵守一定的規則,這就好比在道路中行駛的汽車一定要遵守交通規則一樣。在計算機網絡中,這些連接配接和通信的規則被稱為網絡通信協定,它對資料的傳輸格式、傳輸速率、傳輸步驟等做了統一規定,通信雙方必須同時遵守才能完成資料交換,常見的協定有UDP協定和TCP協定
1.3 IP位址
常用指令:
- ipconfig :檢視本機IP位址
- ping IP位址:檢查網絡是否聯通
特殊IP位址:
- 127.0.0.1 : 是回送位址,可以代表本機位址,一般用來測試使用。
1.4 InetAddress類的使用
導包: java.net.InetAddress
為了友善我們對IP位址的擷取和操作,Java提供了一個類InetAddress供我們使用
InetAddress:此類表示Internet協定(IP)位址
方法名 | 說明 |
---|---|
static InetAddress getByName(String host) | 确定主機名稱的IP位址。主機名稱可以是及其名稱。也可以是IP位址 |
String getHostName() | 擷取此IP位址的主機名 |
String getHostAddress() | 傳回文本顯示中的IP位址字元串 |
InetAddress address = InetAddress.getByName("192.168.1.66");//192.168.1.66可以換成主機名
System.out.ptintln("主機名:"+address.getHostName());
System.out.println("IP位址:"+address.getHostAddress());
1.5 端口
1.6 協定(UDP/TCP)
2. UDP通信程式
2.1 UDP通信原理
UDP協定是一種不可靠的網絡協定,它在通信的兩端各建立一個Socket對象,但是這兩個Socket隻是發送,接受資料的對象
是以對于基于UDP協定的通信雙方而言,沒有所謂的用戶端和伺服器的概念
Java提供了DatagramSocket類作為基于UDP協定的Socket
2.2 UDP發送資料
發送資料的步驟:
① 建立發送端的Socket對象(DatagramSocket)
- DatagramSocket() 構造一個資料報套接字并将其綁定到本地主機上的任何可用端口。
② 建立資料,并把資料打包
- DatagramPacket(byte[] buf, int length, InetAddress address, int port) //構造一個資料報包,用于将長度為 length的資料包發送到指定主機上的指定端口号。
③調用DatagramSocket對象的方法發送資料
- void send(DatagramPacket p) 從此套接字發送資料報包。
④關閉發送端
- void close() 關閉此資料報套接字。
import java.io.IOException;
import java.net.*;
import java.nio.charset.StandardCharsets;
public class Demo {
public static void main(String[] args) throws IOException {
//① 建立發送端的Socket對象(DatagramSocket)
//DatagramSocket() 構造一個資料報套接字并将其綁定到本地主機上的任何可用端口。
DatagramSocket ds = new DatagramSocket();
//② 建立資料,并把資料打包并把資料打包
//DatagramPacket(byte[] buf, int length, InetAddress address, int port)
// 構造一個資料報包,用于将長度為 length的資料包發送到指定主機上的指定端口号。
byte[] bys = "helllo,udp,我來了".getBytes(StandardCharsets.UTF_8);
int length = bys.length;
InetAddress address = InetAddress.getByName("192.168.0.103");
int port = 10086;
DatagramPacket dp = new DatagramPacket(bys,length,address,port);
//③調用DatagramSocket對象的方法發送資料
//void send(DatagramPacket p) 從此套接字發送資料報包。
ds.send(dp);
//④關閉發送端
//void close() 關閉此資料報套接字。
ds.close();
}
}
2.3 UDP接收資料
接受資料的步驟
①建立接收端的Socket對象(DatagramSocket)
- DatagramSocket(int port) 構造一個資料報套接字并将其綁定到本地主機上的指定端口。
②建立一個資料包,用于接受資料
-DatagramPacket(byte[] buf, int length) 構造 DatagramPacket用于接收長度為 length資料包。
③調用DatagramSocket對象的方法接受資料
- void receive(DatagramPacket p) 從此套接字接受資料報包。
④解析資料包,并把資料在控制台顯示
- byte[] getData() 傳回資料緩沖區。
- int getLength() 傳回要發送的資料的長度或接收的資料的長度。
⑤關閉接收端
- void close() 關閉此資料報套接字。
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class DemoR {
public static void main(String[] args) throws IOException {
//①建立接收端的Socket對象(DatagramSocket)
//DatagramSocket(int port) 構造一個資料報套接字并将其綁定到本地主機上的指定端口。
DatagramSocket ds = new DatagramSocket(10086);
//②建立一個資料包,用于接受資料
//DatagramPacket(byte[] buf, int length) 構造 DatagramPacket用于接收長度為 length資料包。
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys,bys.length);
//③調用DatagramSocket對象的方法接受資料
ds.receive(dp);
//④解析資料包,并把資料在控制台顯示
System.out.println("資料是:"+new String(dp.getData(),0, dp.getLength()));//輸出接收到的資料
//⑤關閉接收端
ds.close();
}
}
2.4 UDP通信程式練習
按照下面的要求實作程式
- UDP發送資料: 資料來自于鍵盤錄入,知道輸入的資料是886,發送資料結束
- UDP接收資料: 因為接收端不知道發送什麼時候停止發送,故采用死循環接收
發送端
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class Send {
public static void main(String[] args) throws IOException {
//建立發送端的Socket對象(DatagramSocket)
DatagramSocket ds = new DatagramSocket();
//自己封裝鍵盤錄入資料
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line;
while((line=br.readLine())!=null) {
if("886".equals(line)) {
break;
}
//建立資料,并把資料打包
byte[] bys = line.getBytes();
DatagramPacket dp =new DatagramPacket(bys, bys.length, InetAddress.getByName("192.168.0.103"),12345);
//調用發送資料
ds.send(dp);
}
//關閉發送端
ds.close();
}
}
接收端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class Receive {
public static void main(String[] args) throws IOException {
//建立接收端的Socket對象
DatagramSocket ds = new DatagramSocket(12345);
while(true) {
//建立一個資料包,用于接收資料
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys, bys.length);
//接收資料
ds.receive(dp);
//解析資料包,并把資料在控制台顯示
System.out.println("資料是:" + new String(dp.getData(), 0, dp.getLength()));
}
//關閉接收端
//ds.close(); //因為一直接收資料,是以不用關了
}
}
我們可以打開多個發送端給同一個接收端發送消息。
3. TCP通信程式
3.1 TCP通信原理
TCP通信協定是一種可靠的網絡協定,它在通信的兩端各建立一個Socket對象,進而在通信的兩端形成網絡虛拟鍊路,一旦建立了虛拟的網絡鍊路,兩端的程式就可以通過虛拟鍊路進行通信
Java對基于TCP協定的網絡提供了良好的封裝,使用Socket對象來代表兩端的通信端口,并通過Socket産生IO流來進行網絡通信
Java為用戶端提供了Socket類,為伺服器端提供了ServerSocket類
3.2 TCP發送資料
發送資料的步驟
①建立用戶端的Socket對象(Socket)
- Socket(String host, int port)
②擷取輸出流,寫資料
- OutputStream getOutputStream()
③釋放資源
- void close()
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
public class Kehuduan {
public static void main(String[] args) throws IOException {
//①建立用戶端的Socket對象(Socket)
//Socket s = new Socket(InetAddress.getByName("192.168.0.103"),10000);
Socket s = new Socket("192.168.0.103",10001);
//②擷取輸出流,寫資料
OutputStream os = s.getOutputStream();
os.write("hello,tcp,我來了".getBytes());
//③釋放資源
s.close();
}
}
3.3 TCP接收資料
接受資料的步驟
①建立伺服器端的Socket對象(Socket)
- ServerSocket(int port)
②監聽用戶端連接配接,傳回一個Socket對象
- Socket accept()
③擷取輸出流,讀資料,并把資料顯示在控制台
- InputStream getInputStream()
④釋放資源
- void close()
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
//①建立伺服器端的Socket對象(Socket)
ServerSocket ss = new ServerSocket(10001);
//②監聽用戶端連接配接,傳回一個Socket對象
Socket s = ss.accept();
//③擷取輸出流,讀資料,并把資料顯示在控制台
InputStream is = s.getInputStream();
byte[] bys = new byte[1024];
int len = is.read(bys);
String data = new String(bys,0,len);
System.out.println("資料是:"+data);
//④釋放資源
s.close();
ss.close();
}
}
3.4 TCP通信程式練習
Java中的TCP通信程式練習(六個)