本文目錄一覽:
- 1、如何實現Java udp超時重傳機制(類似tcp那樣)
- 2、java中UDP文件傳輸怎麼實現?
- 3、java 中怎麼使用UDP?
- 4、java中如何判斷udp報文的完整性
- 5、javaudp一直傳輸怎麼回事
如何實現Java udp超時重傳機制(類似tcp那樣)
對一個連接而言,若能夠了解端點間的傳輸往返時間(RTT,Round Trip Time),則可根據RTT來設置一合適的RTO。顯然,在任何時刻連接的RTT都是隨機的,無法事先預知。TCP通過測量來獲得連接當前RTT的一個估計值,並以該RTT估計值為基準來設置當前的RTO。自適應重傳算法的關鍵就在於對當前RTT的準確估計,以便適時調整RTO。
為了搜集足夠的數據來精確地估算當前的RTT,TCP對每個報文都記錄下發送出的時間和收到的確認時間。每一個(發送時間,確認時間)對就可以計算出一個RTT測量值的樣本(Sample RTT)。TCP為每一個活動的連接都維護一個當前的RTT估計值。該值是對已經過去的一個時間段內該連接的RTT了兩隻的加權平均,並作為TCP對連接當前實際的RTT值的一種估計。RTT估計值將在發送報文段時被用於確定報文段的RTO。為了保證它能夠比較準確地反應當前的網絡狀態,每當TCP通過測量獲得了個新的RTT樣本時,都將對RTT的估計值進行更新。不同的更新算法或參數可能獲得不同的特性。
最早的TCP曾經用了一個非常簡單的公式來估計當前網絡的狀況,如下
R-aR+(1-a)MRTP=Rb其中a是一個經驗係數為0.1,b通常為2。注意,這是經驗,沒有推導過程,這個數值是可以被修改的。這個公式是說用舊的RTT(R)和新的RTT (M)綜合到一起來考慮新的RTT(R)的大小。但又可以看到,這種估計在網絡變化很大的情況下完全不能做出「靈敏的反應」,於是就有下面的修正公式:
Err=M-AA-A+gErrD-D+h(|Err|-D)RTO=A+4D,這個遞推公式甚至把方差這種統計概念也使用了進來,使得偏差更加的小。而且,必須要指出的是,這兩組公式更新,都是在 數據成功傳輸的情況下才進行,在發生數據重新傳輸的情況下,並不使用上面的公式進行網絡估計,理由很簡單,因為程序已經不在正常狀態下了,估計出來的數據 也是沒有意義的。
java中UDP文件傳輸怎麼實現?
java UDP連接,如果要發送文件的話,你只能自己定義一系列的協議
因為TCP UDP 雙方發送都是二進制數據
那麼這個實現非常複雜
得不停的發送數據,寫數據,建議使用http協議
java 中怎麼使用UDP?
發送步驟:
使用 DatagramSocket(int port) 建立socket(套間字)服務。
將數據打包到DatagramPacket中去
通過socket服務發送 (send()方法)
關閉資源
import java.io.IOException;
import java.net.*;
public class Send {
public static void main(String[] args) {
DatagramSocket ds = null; //建立套間字udpsocket服務
try {
ds = new DatagramSocket(8999); //實例化套間字,指定自己的port
} catch (SocketException e) {
System.out.println(“Cannot open port!”);
System.exit(1);
}
byte[] buf= “Hello, I am sender!”.getBytes(); //數據
InetAddress destination = null ;
try {
destination = InetAddress.getByName(“192.168.1.5”); //需要發送的地址
} catch (UnknownHostException e) {
System.out.println(“Cannot open findhost!”);
System.exit(1);
}
DatagramPacket dp =
new DatagramPacket(buf, buf.length, destination , 10000);
//打包到DatagramPacket類型中(DatagramSocket的send()方法接受此類,注意10000是接受地址的端口,不同於自己的端口!)
try {
ds.send(dp); //發送數據
} catch (IOException e) {
}
ds.close();
}
}
接收步驟:
使用 DatagramSocket(int port) 建立socket(套間字)服務。(我們注意到此服務即可以接收,又可以發送),port指定監視接受端口。
定義一個數據包(DatagramPacket),儲存接收到的數據,使用其中的方法提取傳送的內容
通過DatagramSocket 的receive方法將接受到的數據存入上面定義的包中
使用DatagramPacket的方法,提取數據。
關閉資源。
import java.net.*;
public class Rec {
public static void main(String[] args) throws Exception {
DatagramSocket ds = new DatagramSocket(10000); //定義服務,監視端口上面的發送端口,注意不是send本身端口
byte[] buf = new byte[1024];//接受內容的大小,注意不要溢出
DatagramPacket dp = new DatagramPacket(buf,0,buf.length);//定義一個接收的包
ds.receive(dp);//將接受內容封裝到包中
String data = new String(dp.getData(), 0, dp.getLength());//利用getData()方法取出內容
System.out.println(data);//打印內容
ds.close();//關閉資源
}
}
java中如何判斷udp報文的完整性
UDP報文的完整性,不是JAVA語言本身能夠保證的,主要還是靠網絡通信協議。一般來說1500個位元組應該不會出現在網絡中只傳輸一部分過來的情況,因為1500個位元組還在一個UDP包的範圍內,因此會一次性發送的。但是,根據經驗,超過1K的udp報文,丟包率通常是比較高的。當然,局域網環境下這個丟包率會小很多。
另外還有一個問題,你的消息接收的緩衝區要足夠大,如果你的緩衝區只有1000個位元組的話,那麼100%你收不到一個完整的包。所以,設置合理的緩衝區也是必要的。
javaudp一直傳輸怎麼回事
網絡卡頓。javaudp一直傳輸是因為網絡卡頓導致的,更換網絡重新傳輸即可解決此問題。該協議是一種用戶數據傳世協議。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/254319.html