導航:首頁 > 編程語言 > javaudp傳輸文件

javaudp傳輸文件

發布時間:2023-07-11 13:53:15

java UDP文件傳輸,傳輸後文件損壞......

UDP是並不是可靠的傳輸方式,位元組序列並沒有得到校驗,所頌襪局以傳輸文件時出現錯誤也是難免的.因為,txt,doc和jpg本身即使出錯也不會影響打開,頂多出現個別字元或是個別像素錯誤不會影響整野讓體,而exe則是cpu的指令執行序列你錯一個就將會導致程序無法執行,如果好核你懂hash的話可以將文件hash一下看看傳輸前後的hash碼是否相同若不相同說明了傳輸過程出現了錯誤需要重傳.
UDP一般應用在海量的並對准確性要求不高的傳輸上,並一般伴隨有重傳機制

㈡ 關於java用udp發送文件的問題...

我試了一下可以運行,錯誤見注釋
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

import javax.swing.JFileChooser;

public class UServer {
private DatagramPacket dp; //數據報包
private DatagramSocket ds; //數據報socket
private String filename; //保存選擇的文件的名字
private FileInputStream fis; //輸入流,用來讀取磁碟文件
private FileOutputStream fos;
private byte[] buf=new byte[10240]; //位元組數組,存放讀取的文件
public UServer(){
try {
ds = new DatagramSocket(4567);
fos=new FileOutputStream("tmp/temp.dat");
dp =new DatagramPacket(buf,buf.length);
while(true){
//這個地方改成我這樣
if (dp.getData().length != 0) {
ds.receive(dp);
System.out.print(dp.getData().length);
fos.write(dp.getData());
fos.flush();
//你的while(true)是個死循環,雖然已經接收到了但是沒法循環出去,需要一個break或者把true換成你收的文件長度不等於0
break;
}

}
} catch (Exception e) {
e.printStackTrace();
}
JFileChooser jfc=new JFileChooser();
jfc.showSaveDialog(null);
filename=jfc.getSelectedFile().getPath();
try{
fos.close();
fos=new FileOutputStream(filename);
fis=new FileInputStream("tmp/temp.dat");
int c;
while((c=fis.read(buf))!= -1){
fos.write(buf);
fos.flush();
}
fos.close();
fis.close();
}catch (IOException e1){
e1.printStackTrace();
}
}

public static void main(String args[]){
new UServer();
}
}

㈢ 關於java UDP socket傳較大文件的問題,我寫了個小程序 但就是報錯 不知道錯哪裡了 求大神指出來代碼如下

數組下標越界
do while循環的常見問題,do while循環是這樣的,先執行do循環內函數,再做while判斷。數組下標越界是當buf內的數據滿了之後又執行了一次do內的函數體,所行橋行以會越界,修改do-while中的判斷,或者改成for循環,或者while循環
而且,樓主,這個buf.length != -1你是想表明一個什麼意消信思檔嘩,標示不太理解,也就是說這段代碼出現問題的部分是在do-while循環的判斷上,建議修改do-while循環,修改buf.length != -1

㈣ 如何用java實現UDP的可靠傳輸

我記憶中可靠的傳輸應該類似TCP的三次握手:
1.發送方向接收方發送一個隨機數。
2.接收方收到隨機數後將其+1,再回傳給發送方。
3.發送方收到隨機數判斷其是否被+1,如果是代表雙方的傳遞線路是通暢的,可以正式開始傳送數據。

㈤ java中UDP文件傳輸怎麼實現

java UDP連接,如果要發送文件的話,你只能自己定義一系列的協議
因為TCP UDP 雙方發送都是二進制數據
那麼這個實現非常復雜
得不停的發送數據,寫數據,建議使用http協議

㈥ Java udp如何通過一個對象完成接收和發送數據

//注意,本地ip以及埠,廣播Ip以及埠,可根據自己的電腦實際情況定.我的三段是2
//思路:我用的udp啟動服務端,進行偵聽,如果有消息,就該頻段廣播一次..
//客戶端使用多線程,一個發送服務端,一個接受廣播..就當我復習了一次...!
importjava.io.IOException;
importjava.net.DatagramPacket;
importjava.net.DatagramSocket;
importjava.net.InetAddress;
importjava.net.InetSocketAddress;
importjava.net.SocketAddress;
importjava.util.Scanner;
publicclassUdpTest{
classSendTest{
privateintcount=1;
privateScannersc;
privatebyte[]by,by2;
privateInetAddressip;
privateSocketAddresssd1,sd2;
privateDatagramSocketds,ds2;
privateDatagramPacketdp,dp2;
SendTest(StringipName,intport)throwsException{
sc=newScanner(System.in);
ip=InetAddress.getByName(ipName);
sd1=newInetSocketAddress(ip,port);//發送的目標:ip+埠
sd2=newInetSocketAddress(19823);//己方,省略ip,默認自己本地地址
ds=newDatagramSocket();//參數為自己的標識
//接受
by2=newbyte[1024];
ds2=newDatagramSocket(sd2);
send();
}
privatevoidsend()throwsIOException{
newThread(){
publicvoidrun(){
while(true){
by=sc.nextLine().getBytes();
dp=newDatagramPacket(by,by.length,sd1);//數組,數組長度,目標ip+埠
try{
ds.send(dp);
}catch(IOExceptione){
e.printStackTrace();
}//推送服務;
System.out.println("老馬第:"+count+++"條信息發送完成!");
}
}
}.start();
newThread(){
publicvoidrun(){
while(true){
dp2=newDatagramPacket(by2,by2.length);
try{
ds2.receive(dp2);
System.out.println("老馬接受到一條廣播可能來自老宋:"+newString(by2,0,dp2.getLength()));
}catch(IOExceptione){
e.printStackTrace();
}
}
}
}.start();
}
}
classAccepTest{
privatebyte[]by;
privateSocketAddresssd1,sd2;
privateDatagramSocketds;
privateDatagramPacketdp;
privateintcount=0;
AccepTest()throwsException{
by=newbyte[1024];
sd1=newInetSocketAddress("192.168.2.255",19823);//廣播
sd2=newInetSocketAddress(19822);//己方,省略ip,默認自己本地地址
ds=newDatagramSocket(sd2);//參數為自己的標識,這是用來接受的.....
accepts();
}
privatevoidaccepts()throwsIOException{
while(true){
count++;
System.out.println("老宋的伺服器接受第:"+count+"次數據:...");
dp=newDatagramPacket(by,by.length);//數組,數組長度,僅僅用來接收;
ds.receive(dp);//接受服務;
Stringstr=newString(by,0,dp.getLength());
System.out.println("老宋接受到數據--------->"+str);
System.out.println();
//廣播..
by=("插個廣播:"+str+"....誰發的??").getBytes();
dp=newDatagramPacket(by,by.length,sd1);
ds.send(dp);
}
}
}
publicstaticvoidmain(String[]args)throwsException{
newThread(){
publicvoidrun(){
try{
newUdpTest().newAccepTest();
}catch(Exceptione){
e.printStackTrace();
}
}
}.start();
newThread(){
publicvoidrun(){
try{
newUdpTest().newSendTest("127.0.0.1",19822);
}catch(Exceptione){
e.printStackTrace();
}
}
}.start();
}
}

㈦ Java寫的一個udp的demo用來計算探針傳送過來的數據,怎麼實現一個介面來調用這個數據

Java UDP通信簡單實現
1、Java實現方式
1)server端



/**
*UDPserver端
**/
publicclassUdpServer{
//定義一些常量
privatefinalintMAX_LENGTH=1024;//最大接收位元組長度
privatefinalintPORT_NUM=5066;//port號
//用以存放接收數據的位元組數組
privatebyte[]receMsgs=newbyte[MAX_LENGTH];
//數據報套接字
;
//用以接收數據報
;

publicUdpServer(){
try{
/*******接收數據流程**/
//創建一個數據報套接字,並將其綁定到指定port上
datagramSocket=newDatagramSocket(PORT_NUM);
//DatagramPacket(bytebuf[],intlength),建立一個位元組數組來接收UDP包
datagramPacket=newDatagramPacket(receMsgs,receMsgs.length);
//receive()來等待接收UDP數據報
datagramSocket.receive(datagramPacket);

/******解析數據報****/
StringreceStr=newString(datagramPacket.getData(),0,datagramPacket.getLength());
System.out.println("ServerRece:"+receStr);
System.out.println("ServerPort:"+datagramPacket.getPort());

/*****返回ACK消息數據報*/
//組裝數據報
byte[]buf="Ireceivethemessage".getBytes();
DatagramPacketsendPacket=newDatagramPacket(buf,buf.length,datagramPacket.getAddress(),datagramPacket.getPort());
//發送消息
datagramSocket.send(sendPacket);
}catch(SocketExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}finally{
//關閉socket
if(datagramSocket!=null){
datagramSocket.close();
}
}
}
}

2)client


/***
*UDPclientClient端
***/
publicclassUdpClient{

privateStringsendStr="SendString";
privateStringnetAddress="127.0.0.1";
privatefinalintPORT_NUM=5066;

;
;

publicUdpClient(){
try{

/***發送數據***/
//初始化datagramSocket,注意與前面Server端實現的差別
datagramSocket=newDatagramSocket();
//使用DatagramPacket(bytebuf[],intlength,InetAddressaddress,intport)函數組裝發送UDP數據報
byte[]buf=sendStr.getBytes();
InetAddressaddress=InetAddress.getByName(netAddress);
datagramPacket=newDatagramPacket(buf,buf.length,address,PORT_NUM);
//發送數據
datagramSocket.send(datagramPacket);

/***接收數據***/
byte[]receBuf=newbyte[1024];
DatagramPacketrecePacket=newDatagramPacket(receBuf,receBuf.length);
datagramSocket.receive(recePacket);

StringreceStr=newString(recePacket.getData(),0,recePacket.getLength());
System.out.println("ClientReceAck:"+receStr);
System.out.println(recePacket.getPort());


}catch(SocketExceptione){
e.printStackTrace();
}catch(UnknownHostExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}finally{
//關閉socket
if(datagramSocket!=null){
datagramSocket.close();
}
}
}
}
閱讀全文

與javaudp傳輸文件相關的資料

熱點內容
pdf圖檔 瀏覽:775
華為平板app如何移入隱私空間 瀏覽:127
python怎麼列表去重 瀏覽:735
linux命令文件路徑 瀏覽:58
程序員的憤怒完整視頻 瀏覽:871
如何把iphoneapp變小 瀏覽:130
一個後端程序員的日常 瀏覽:416
51單片機歷史 瀏覽:890
怎樣減小pdf文件大小 瀏覽:31
和彩雲zip解壓 瀏覽:725
linux查看線程狀態 瀏覽:459
怎麼起文件夾名稱 瀏覽:49
北京交大編譯原理 瀏覽:982
linux執行java腳本 瀏覽:589
全能掃描加密文檔忘記密碼怎麼辦 瀏覽:75
極品飛車ol安卓版為什麼要關服 瀏覽:275
學生伺服器怎麼選 瀏覽:464
mac系統本身編譯器 瀏覽:151
頭條app如何設置橫屏模式 瀏覽:359
clion怎麼使用終端編譯 瀏覽:768