計算機網絡可使多臺計算機實現鏈接,位於同一個網絡中的計算機在進行鏈接和通訊時須要遵照必定的規則。在計算機網絡中,這些鏈接和通訊的規則被稱爲網絡通訊協議,它對數據的傳輸格式、傳輸速率、傳輸步驟等作了統一規定,通訊雙方必須同時遵照才能完成數據交換。數組
如今最普遍的是TCP/IP協議(傳輸控制協議/英特網互聯協議)服務器
UDP協議。網絡
TCP/IP協議分爲四層:socket
鏈路層:用於定義物理傳輸,一般是對某些網絡鏈接設備的驅動協議,例如針對光纖、網線提供的驅動。spa
網絡層:網絡層是整個TCP/IP協議的核心,它主要用於將傳輸的數據進行分組,將分組數據發送到目標計算機或者網絡。計算機網絡
傳輸層:主要使網絡程序進行通訊,在進行網絡通訊時,能夠採用TCP協議,也能夠採用UDP協議。server
應用層:主要負責應用程序的協議,例如HTTP協議、FTP協議等。對象
InetAdderss類:用於封裝一個IP地址。ip
public static void main(String[] args) throws UnknownHostException {
InetAddress inet=InetAddress.getByName("192.168.137.1");
InetAddress inet2=InetAddress.getLocalHost();
//從inet對象中獲取ip地址
System.out.println(inet2);
//獲取主機名
System.out.println(inet2.getHostName());
}資源
UDP協議:
UDP是無鏈接通訊協議,即在數據傳輸時,數據的發送端和接收端不創建邏輯鏈接。
在使用UDP協議傳送數據時,因爲UDP的面向無鏈接性,不能保證數據的完整性,所以在傳輸重要數據時不建議使用UDP協議。
TCP協議:
TCP協議是面向鏈接的通訊協議,即在傳輸數據前先在發送端和接收端創建邏輯鏈接,而後再傳輸數據,它提供了兩臺計算機之間可靠無差錯的數據傳輸。
因爲TCP協議的面向鏈接特性,它能夠保證傳輸數據的全性安,因此是一個被普遍採用的協議,例如在下載文件時,若是數據接收不完整,將會致使文件數據丟失而不能被打開,所以,下載文件時必須採用TCP協議。
UDP通訊:
DatagramPacke類:
用於封裝UDP通訊中發送或者接收的數據。
DatagramSocket類:
將發送端或者接收端的數據封裝起來。
public class UDPSend {
public static void main(String[] args) throws IOException {
//封裝數據
byte[] bytes="你好UDP".getBytes();
//封裝ip地址
InetAddress inet=InetAddress.getByName("127.0.0.1");
//1.建立數據打包對象,封裝要發送的數據、長度、接受端ip和端口號
DatagramPacket dp=new DatagramPacket(bytes, bytes.length,inet,6000);
//2.建立DatagramSocke對象(快遞公司)
DatagramSocket ds=new DatagramSocket();
//3.發送數據包
ds.send(dp);
//釋放資源
ds.close();
}
}
public class UDPReceive {
public static void main(String[] args) throws IOException {
//1.建立DatagramSocket對象(快遞公司)明確端口號
DatagramSocket ds=new DatagramSocket(6000);
//2.建立字節數組負責接受發來的數據
byte[] bytes=new byte[1024];
//3.建立數據拆包對象
DatagramPacket dp=new DatagramPacket(bytes, bytes.length);
//4.接收數據包
ds.receive(dp);
//5.拆包
//獲取接收的數據長度
int length=dp.getLength();
//獲取發送端ip地址
String ip=dp.getAddress().getHostAddress();
//獲取發送端的端口號
int port=dp.getPort();
System.out.println("ip地址爲"+ip+"端口號爲"+port+"發送的內容"+new String(bytes,0,length));
}
}
TCP通訊:
Socket類:用於實現客戶端的程序。
public class TCPServer {
public static void main(String[] args) throws IOException {
//1.建立服務器端對象serversocket明確端口號
ServerSocket server=new ServerSocket(6666);
//2.調用accept方法與客戶端建立鏈接,並獲取鏈接的客戶端對象
Socket socket=server.accept();
//3.從客戶端對象中獲取輸入流,接收數據
InputStream in=socket.getInputStream();
byte[] bytes=new byte[1024];
//獲取ip地址
String ip=socket.getInetAddress().getHostAddress();
//獲取客戶端端口號
int port=socket.getPort();
System.out.println("ip地址爲"+ip+"端口號爲"+port+":");
int len=in.read(bytes);
System.out.println(new String(bytes,0,len));
//回覆客戶端
//獲取從客戶端對象中獲取字節輸出流,將數據回覆給客戶端
OutputStream out=socket.getOutputStream();
out.write("收到".getBytes());
//釋放資源
server.close();
}
}
public class TCPClient {
public static void main(String[] args) throws IOException {
//1.建立Socket對象,鏈接服務器
Socket socket=new Socket("127.0.0.1",6666);
//2.從socket對象中獲取輸出流,將數據寫向服務器
OutputStream os=socket.getOutputStream();
//3.寫數據
os.write("你好服務器".getBytes());
//接收服務器端的回覆
//從socket對象中獲取字節輸入流,接收服務器的回覆數據
InputStream in=socket.getInputStream();
//建立字節數組
byte[] bytes=new byte[1024];
//獲取服務器端的ip地址
String ip=socket.getInetAddress().getHostAddress();
//獲取服務器端的端口號
int port=socket.getPort();
System.out.println("ip地址爲"+ip+"端口號爲"+port+":");
int len=in.read(bytes);
System.out.println(new String(bytes,0,len));
//4.釋放資源
socket.close();
}
}