Java TCP網(wǎng)絡(luò)通信協(xié)議詳細(xì)講解
TCP與UDP都屬于TCP/IP協(xié)議
TCP(Transmission Control Protocol,傳輸控制協(xié)議)是面向連接的協(xié)議,也就是說,在收發(fā)數(shù)據(jù)前,必須和對方建立可靠的連接。 一個TCP連接必須要經(jīng)過三次“對話”才能建立起來,其中的過程非常復(fù)雜, 只簡單的描述下這三次對話的簡單過程:
1)主機A向主機B發(fā)出連接請求數(shù)據(jù)包:“我想給你發(fā)數(shù)據(jù),可以嗎?”,這是第一次對話;
2)主機B向主機A發(fā)送同意連接和要求同步 (同步就是兩臺主機一個在發(fā)送,一個在接收,協(xié)調(diào)工作)的數(shù)據(jù)包 :“可以,你什么時候發(fā)?”,這是第二次對話;
3)主機A再發(fā)出一個數(shù)據(jù)包確認(rèn)主機B的要求同步:“我現(xiàn)在就發(fā),你接著吧!”, 這是第三次對話。
三次“對話”的目的是使數(shù)據(jù)包的發(fā)送和接收同步, 經(jīng)過三次“對話”之后,主機A才向主機B正式發(fā)送數(shù)據(jù)。
TCP的三次握手過程保證了傳輸?shù)陌踩?,同時會確認(rèn)對方是否接受到信息
斷開的時候進(jìn)行四次
UDP(User Data Protocol,用戶數(shù)據(jù)報協(xié)議)是一個非連接的協(xié)議,傳輸數(shù)據(jù)之前源端和終端不建立連接, 當(dāng)它想傳送時就簡單地去抓取來自應(yīng)用程序的數(shù)據(jù),并盡可能快地把它扔到網(wǎng)絡(luò)上。 在發(fā)送端,UDP傳送數(shù)據(jù)的速度僅僅是受應(yīng)用程序生成數(shù)據(jù)的速度、 計算機的能力和傳輸帶寬的限制; 在接收端,UDP把每個消息段放在隊列中,應(yīng)用程序每次從隊列中讀一個消息段。
由于不需要像TCP那樣的握手過程,使得UDP的傳輸速度非??旖荩槐WC傳輸?shù)陌踩?,也不確認(rèn)對方是否接收到信息
實現(xiàn)代碼:
//向指定ip發(fā)送信息
public static void main(String[] args) throws Exception{
Socket s=new Socket(InetAddress.getByName(InetAddress.getLocalHost().getHostAddress()),10000);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//封裝輸出流對象
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String line;
while (true) {
if ((line=br.readLine())!=null){
if("1024".equals(line)) {
bw.write(line);
bw.newLine();
break;
}
bw.write(line);
bw.newLine();
}
bw.flush();
//獲取輸出流對象
}
//釋放資源
s.close();
}//接收發(fā)送到本機的信息
ServerSocket socket=new ServerSocket(10000);
Socket accept = socket.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(accept.getInputStream()));
String line;
while ((line=br.readLine())!=null){
System.out.println(line);
}
要讓倆臺進(jìn)行互通就可以實現(xiàn)了,讓他們運行到一起可以使用線程進(jìn)行封裝。
UDP使用的是
//創(chuàng)建發(fā)送端的Socket對象(DatagramSocket) //創(chuàng)建數(shù)據(jù),并把數(shù)據(jù)打包 //DatagramPacket(byte[] buf, int length, InetAddress address, int port) //構(gòu)造一個數(shù)據(jù)包,發(fā)送長度為 length的數(shù)據(jù)包到指定主機上的指定端口號。
使用UDP需要將ip地址固定成ipconfig所顯示的ip網(wǎng)關(guān)等內(nèi)容

DatagramSocket ds = new DatagramSocket();
byte[] bys = "hello,udp,我來了".getBytes();
DatagramPacket dp = new DatagramPacket(bys,bys.length, InetAddress.getByName("10.102.13.18"),10086);
//調(diào)用DatagramSocket對象的方法發(fā)送數(shù)據(jù)
//void send(DatagramPacket p) 從此套接字發(fā)送數(shù)據(jù)報包
ds.send(dp);
System.out.println("已發(fā)送:"+new String(dp.getData(),0,dp.getLength()));
//關(guān)閉發(fā)送端
//void close() 關(guān)閉此數(shù)據(jù)報套接字
ds.close();DatagramSocket ds = new DatagramSocket(10086);
while (true) {
//創(chuàng)建一個數(shù)據(jù)包,用于接收數(shù)據(jù)
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys, bys.length);
//調(diào)用DatagramSocket對象的方法接收數(shù)據(jù)
ds.receive(dp);
System.out.println("-----");
//解析數(shù)據(jù)包,并把數(shù)據(jù)在控制臺顯示
System.out.println("數(shù)據(jù)是:" + new String(dp.getData(), 0, dp.getLength()));
}
我們同樣使用DatagramSocket 方法進(jìn)行接收數(shù)據(jù)
到此這篇關(guān)于Java TCP網(wǎng)絡(luò)通信協(xié)議詳細(xì)講解的文章就介紹到這了,更多相關(guān)Java TCP內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java concurrency集合之LinkedBlockingDeque_動力節(jié)點Java學(xué)院整理
LinkedBlockingDeque是雙向鏈表實現(xiàn)的雙向并發(fā)阻塞隊列。該阻塞隊列同時支持FIFO和FILO兩種操作方式,即可以從隊列的頭和尾同時操作(插入/刪除);并且,該阻塞隊列是支持線程安全。2017-06-06
JAVA復(fù)制數(shù)組和重置數(shù)組大小操作
這篇文章主要介紹了JAVA復(fù)制數(shù)組和重置數(shù)組大小操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
AsyncHttpClient exception異常源碼流程解析
這篇文章主要為大家介紹了AsyncHttpClient的exception源碼流程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
java利用JAXB實現(xiàn)對象和xml互相轉(zhuǎn)換方法與實例詳解
這篇文章主要介紹了java利用JAXB實現(xiàn)對象和xml互相轉(zhuǎn)換方法與實例詳解,需要的朋友可以參考下2020-02-02

