Java網(wǎng)絡編程中的TCP/UDP詳解
Java網(wǎng)絡編程
網(wǎng)絡編程是指編寫運行在多個設備(計算機)的程序,這些設備都通過網(wǎng)絡連接起來。
java.net 包中 J2SE 的 API 包含有類和接口,它們提供低層次的通信細節(jié)。你可以直接使用這些類和接口,來專注于解決問題,而不用關注通信細節(jié)。
java.net 包中提供了兩種常見的網(wǎng)絡協(xié)議的支持:
TCP:TCP(英語:Transmission Control Protocol,傳輸控制協(xié)議) 是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,TCP 層是位于 IP 層之上,應用層之下的中間層。TCP 保障了兩個應用程序之間的可靠通信。通常用于互聯(lián)網(wǎng)協(xié)議,被稱 TCP / IP。
UDP:UDP (英語:User Datagram Protocol,用戶數(shù)據(jù)報協(xié)議),位于 OSI 模型的傳輸層。一個無連接的協(xié)議。提供了應用程序之間要發(fā)送數(shù)據(jù)的數(shù)據(jù)報。由于UDP缺乏可靠性且屬于無連接協(xié)議,所以應用程序通常必須容許一些丟失、錯誤或重復的數(shù)據(jù)包。
網(wǎng)絡分層
(1)物理層 物理層處于OSI的最底層,是整個開放系統(tǒng)的基礎。物理層涉及通信信道上傳輸?shù)脑急忍亓鳎╞its),它的功能主要是為數(shù)據(jù)端設備提供傳送數(shù)據(jù)的通路以及傳輸數(shù)據(jù)。機房,硬件空調什么的。
(2)數(shù)據(jù)鏈路層 數(shù)據(jù)鏈路層的主要任務是實現(xiàn)計算機網(wǎng)絡中相鄰節(jié)點之間的可靠傳輸,把原始的、有差錯的物理傳輸線加上數(shù)據(jù)鏈路協(xié)議以后,構成邏輯上可靠的數(shù)據(jù)鏈路。需要完成的功能有鏈路管理、成幀、差錯控制以及流量控制等。其中成幀是對物理層的原始比特流進行界定,數(shù)據(jù)鏈路層也能夠對幀的丟失進行處理。交換機 雙絞線。
(3)網(wǎng)絡層 網(wǎng)絡層涉及源主機節(jié)點到目的主機節(jié)點之間可靠的網(wǎng)絡傳輸,它需要完成的功能主要包括路由選擇、網(wǎng)絡尋址、流量控制、擁塞控制、網(wǎng)絡互連等。IP,路由器。
(4)傳輸層 傳輸層起著承上啟下的作用,涉及源端節(jié)點到目的端節(jié)點之間可靠的信息傳輸。傳輸層需要解決跨越網(wǎng)絡連接的建立和釋放,對底層不可靠的網(wǎng)絡,建立連接時需要三次握手,釋放連接時需要四次揮手。
(5)應用層 應用層為OSI的最高層,是直接為應用進程提供服務的。其作用是在實現(xiàn)多個系統(tǒng)應用進程相互通信的同時,完成一系列業(yè)務處理所需的服務。約定數(shù)據(jù)內容和格式。
TCP/UDP
TCP(傳輸控制協(xié)議) TCP是面向連接的協(xié)議,因此每個TCP連接都有3個階段:連接建立、數(shù)據(jù)傳送和連接釋放。
連接建立經(jīng)歷三個步驟,通常稱為“三次握手”。
握手過程中傳送的包里不包含數(shù)據(jù),三次握手完畢后,客戶端與服務器才正式開始傳送數(shù)據(jù)。
(TCPServer)
package com.lanou.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class TCPServer {
public static void main(String[] args) {
//JAVA的TCP編程中,BIO模型使用一個工具實現(xiàn)TCP編程,這個工具叫做Socket,服務端叫ServerSocket,
try {
ServerSocket ss = new ServerSocket(65535);//這個端口號 寫死 固定的
//這個是客戶端發(fā)送上來的鏈接,服務器使用這個鏈接做數(shù)據(jù)處理
Socket s = ss.accept();
//分別是兩個指針對當前聯(lián)機的輸入輸出流
OutputStream os = s.getOutputStream();
InputStream is = s.getInputStream();
//改變輸入輸出流的狀態(tài)(套一個其它流)
PrintWriter pw = new PrintWriter(os);
Scanner scanner = new Scanner(System.in);
BufferedReader br = new BufferedReader(new InputStreamReader(is));
while(true) {
String str= scanner.nextLine(); //nextline 阻塞式代碼
pw.println(str);
pw.flush();
if(str.equals("")) {
break;
}
str = br.readLine();
System.out.println("我是服務器,我收到客戶端消息" + str);
if(str.equals("")) {
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}(TCPClient)
package com.lanou.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class TCPClient {
public static void main(String[] args) {
//客戶端,直接使用Sockert工具
try {
Socket s = new Socket("127.0.0.1", 65535);
// host 鏈接到那個主機上 String的參數(shù) port端口
InputStream is = s.getInputStream();
OutputStream os = s.getOutputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
PrintWriter pw = new PrintWriter(os);
Scanner scanner = new Scanner(System.in);
String str;
while(!(str = br.readLine()).equals("")) {
System.out.println("客戶端收到"+str);
str = scanner.nextLine();
pw.println(str);
pw.flush();
if(str.equals("")) {
break;
}
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}(UDPServer)
package com.lanou.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class UDP {
public static void main(String[] args) {
//UDP是面向報文的,所以數(shù)據(jù)傳輸過程中,是不需要建立鏈接的,只要有對應的報文,就可以指揮網(wǎng)卡去發(fā)送這個數(shù)據(jù)包
//但是對于服務器來說,UDP雖然沒有建立鏈接,卻需要在對應的端口上進行監(jiān)聽,否則是有問題的
//DatagramSocket,這個類型是JAVA對于UDP實現(xiàn)的一個網(wǎng)絡套接字,當我們需要使用UDP傳輸內容的時候,只需要創(chuàng)建一個
//DatagramSocket,對象就可以了,不用指定這個對象是否是服務(區(qū)別TCP的ServerSocket)
try {
DatagramSocket socket = new DatagramSocket(10086);
byte[] b = new byte[1024];
DatagramPacket p =new DatagramPacket(b, b.length);
while(true) {
socket.receive(p);
b = p.getData();//拿出數(shù)據(jù) 拆開包裹
System.out.println(new String(b));
System.out.println(p.getAddress() + "說 : " + new String(b));
p.setData("你開心就好".getBytes());
socket.send(p);
}
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}(UDPClient)
package com.lanou.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.net.SocketException;
public class UDPClient {
public static void main(String[] args) {
try {
DatagramSocket socket = new DatagramSocket();
String str = "我是客戶端 ";
DatagramPacket p = new DatagramPacket(str.getBytes(), str.getBytes().length);
p.setSocketAddress(new InetSocketAddress("127.0.0.1", 10086));
socket.send(p);
socket.receive(p);
System.out.println(new String(p.getData()));
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}到此這篇關于Java網(wǎng)絡編程中的TCP/UDP詳解的文章就介紹到這了,更多相關TCP/UDP詳解內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java創(chuàng)建可執(zhí)行的Jar文件的方法實踐
創(chuàng)建的可執(zhí)行Jar文件實際就是在原始Jar的清單文件中添加了Main-Class的配置,本文主要介紹了Java創(chuàng)建可執(zhí)行的Jar文件的方法實踐,感興趣的可以了解一下2023-12-12
SpringDataJpa:JpaRepository增刪改查操作
這篇文章主要介紹了SpringDataJpa:JpaRepository增刪改查操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
Java實現(xiàn)二叉樹的建立、計算高度與遞歸輸出操作示例
這篇文章主要介紹了Java實現(xiàn)二叉樹的建立、計算高度與遞歸輸出操作,結合實例形式分析了Java二叉樹的創(chuàng)建、遍歷、計算等相關算法實現(xiàn)技巧,需要的朋友可以參考下2019-03-03
如何利用Java使用AOP實現(xiàn)數(shù)據(jù)字典轉換
這篇文章主要介紹了如何利用Java使用AOP實現(xiàn)數(shù)據(jù)字典轉換,AOP也是我們常說的面向切面編程,AOP在我們開發(fā)過程中應用也比較多,在這里我們就基于AOP來實現(xiàn)一個數(shù)據(jù)字典轉換的案例2022-06-06
java Socket編程實現(xiàn)I/O多路復用的示例
本文主要介紹了java Socket編程實現(xiàn)I/O多路復用的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-09-09

