『壹』 5 java 如何使用udp協議傳送文件
//發送端SocketSendFile.java
import java.io.*;
import java.net.*;
public class SocketSendFile {
public static final int SER_PORT=666;
public static final int CLI_PORT=8484;
public static final String SER_IP="192.168.0.35";
public static int bufSize = 1024;
public static byte] mess = new bytebufSize];
//建立Socket引用
public static DatagramSocket dp;
public static void main(String] args) throws Exception {
dp = new DatagramSocket(SER_PORT);
//調用構造函數SocketSendFile,並傳遞參數args0](所要傳輸的文件名)
SocketSendFile(args0]);
}
public static void SocketSendFile(String file2) throws Exception {
//定義一個計數器
int pos =0;
//設置寫入流
FileInputStream fis = new FileInputStream(file2);
BufferedInputStream bis = new BufferedInputStream(fis);
DataInputStream dis = new DataInputStream(bis);
int i;
do {
i = dis.read();
int j=0;
while (j<1024 & i != -1) {
messpos++] = (byte) i;
i=dis.read();
j++;
}
dp.send(new DatagramPacket(mess,pos,InetAddress.getByName(SER_IP),CLI_PORT));
}
while (i != -1);
fis.close();
}
}
//接收端SocketReceiveFile.java
import java.net.*;
import java.io.*;
public class SocketReceiveFile {
public static int bufSize=1024;
public static byte] mess=new bytebufSize];
public static DatagramSocket dp;
public static final int SER_PORT=8484;
public static void main(String] args) throws Exception {
dp = new DatagramSocket(SER_PORT);
SocketReceiveFile(args0]);
}
public static void SocketReceiveFile(String file1) throws Exception {
FileOutputStream fos = new FileOutputStream(file1);
BufferedOutputStream bos = new BufferedOutputStream(fos);
DataOutputStream dos = new DataOutputStream(bos);
int i;
DatagramPacket p = new DatagramPacket(mess,mess.length);
while(true) {
boolean j=false;
while (p.getData().length != 0) {
dos.write(p.getData());
dp.receive(p);
j=true;
}
// System.out.println(new String(p.getData(),0,p.getLength()));
if (j)
System.out.println("文件傳送完畢.");
}
// fos.close();
}
}
『貳』 java UDP 傳輸文件
//Send
DatagramSocket ds = new DatagramSocket(5555, InetAddress
.getByName("10.0.0.1"));
InputStream in = new FileInputStream(new File("a.txt"));
byte[] b = new byte[10240];
int c = in.read(b);
in.close();
DatagramPacket dp = new DatagramPacket(b, c);
ds.send(dp);
//Receive
DatagramSocket ds2 = new DatagramSocket(5555);
DatagramPacket dp2 = new DatagramPacket(b,b.length);
ds2.receive(dp2);
OutputStream out=new FileOutputStream(new File("out.txt"));
out.write(dp2.getData());
out.close();
『叄』 pos機和通訊軟體之間的報文怎麼使用UDP進行傳送(使用java)
UDP協議
用戶數據報協議UDP(User Datagram Protocol)是無連接傳輸層協議,提供應用程序之間傳送數據報的基本機制。
1.UDP報文的格式
每個UDP報文稱為一個用戶數據報:它分為兩部分:頭部和數據區。如圖6-14是一個UDP報文的格式,報文頭中包含有源埠和目的埠、報文長度以及UDP檢驗和。
源埠(Source Port)和目的埠(Destination Port)欄位包含了16比特的UDP協議埠號,它使得多個應用程序可以多路復用同一個傳輸層協議 – UDP協議,僅通過不同的埠號來區分不同的應用程序。
長度(Length)欄位記錄了該UDP數據包的總長度(以位元組為單位),包括8位元組的UDP頭和其後的數據部分。最小值是8(即報文頭的長度),最大值為65,535位元組。
UDP檢驗和(Checksum)的內容超出了UDP數據報文本身的范圍,實際上,它的值是通過計算UDP數據報及一個偽包頭而得到的。但校驗和的計算方法與通用的一樣,都是累加求和。
不危險,可以打開
『肆』 如何用java實現UDP的可靠傳輸
我記憶中可靠的傳輸應該類似TCP的三次握手:
1.發送方向接收方發送一個隨機數。
2.接收方收到隨機數後將其+1,再回傳給發送方。
3.發送方收到隨機數判斷其是否被+1,如果是代表雙方的傳遞線路是通暢的,可以正式開始傳送數據。
『伍』 java UDP 文件傳輸
java UDP連接,如果要發送文件的話,你只能自己定義一系列的協議
因為TCP UDP 雙方發送都是二進制數據
那麼這個實現非常復雜
得不停的發送數據,寫數據,建議使用http協議
『陸』 Java語言中如何使用UDP協議進行數據傳輸的
java里UDP協議傳送的方式細節已經封裝了到類DatagramSocket里了,只要用DatagramSocket的對象進行傳輸數據就可以了.
底層實現是應該依靠本地C語言程序來完成的
『柒』 關於java UDP文件傳輸的問題
使用UDP協議進行文件傳輸不能保證正確性,很容易發生丟包的情況。建議在進行較大文件傳輸的時候使用TCP的Socket和ServerSocket類進行傳輸。在數據量小於65600位元組的時候使用UDP是安全的
如果一定要使用UDP方式進行傳輸的話,為了提高傳輸的准確性,可以限制一下傳輸速度,方法是在發送端每次發送後sleep一下,即在發送端程序的dataSocket.send(dataPacket);一句後加上:
TimeUnit.MICROSECONDS.sleep(1);
不過這種方法也不能保證傳輸絕對准確,所以還是建議用TCP的方式
程序本身應該是能夠達到效果的,不知道錯誤提示是什麼。測試之前要看下發送端的filePath文件是否存在,貌似防火牆也有影響,測試之間最好關閉防火牆。下面是我的測試程序,接收端是類A1,接收端是類A2,發送端的文件filePath是D盤根目錄下的a1.mkv:
接收端:
import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class A1 {
public static DatagramSocket dataSocket;
public static final int PORT=7;
public static byte[] receiveByte;
public static DatagramPacket dataPacket;
public static void main(String[] args) throws IOException{
dataSocket = new DatagramSocket(PORT);
DataOutputStream fileOut = new DataOutputStream(new BufferedOutputStream(new BufferedOutputStream(new FileOutputStream("D:\\a.mkv"))));
int i = 0;
while (i == 0)// 無數據,則循環
{
receiveByte = new byte[1024];
dataPacket = new DatagramPacket(receiveByte, receiveByte.length);
dataSocket.receive(dataPacket);
i = dataPacket.getLength();
// 接收數據
if (i > 0) {
// 指定接收到數據的長度,可使接收數據正常顯示,開始時很容易忽略這一點
fileOut.write(receiveByte,0,i);
fileOut.flush();
i = 0;// 循環接收
}
}
}
}
發送端:
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.Inet4Address;
import java.util.Date;
public class A2 {
public static DatagramSocket dataSocket;
public static final int PORT=7;
public static byte[] sendDataByte;
public static DatagramPacket dataPacket;
public static void main(String[] args) throws IOException, InterruptedException{
String filePath="D:\\a1.mkv";
DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)));
dataSocket = new DatagramSocket(PORT+1);
sendDataByte = new byte[1024];
int read=0;
long a=new Date().getTime();
while(true){
if (fis != null) {
read = fis.read(sendDataByte);
}
if (read == -1) {
System.out.println(new Date().getTime()-a);
break;
}
dataPacket = new DatagramPacket(sendDataByte, sendDataByte.length,(Inet4Address) Inet4Address.getByName("localhost"), PORT);
dataSocket.send(dataPacket);
TimeUnit.MICROSECONDS.sleep(1);//限制傳輸速度
}
}
}
『捌』 關於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文件傳輸怎麼實現
java UDP連接,如果要發送文件的話,你只能自己定義一系列的協議
因為TCP UDP 雙方發送都是二進制數據
那麼這個實現非常復雜
得不停的發送數據,寫數據,建議使用http協議
『拾』 使用java語言實現tcp和udp文件傳輸,不使用socket類。
你這種說法本身就有待商榷。Java是一種商用開發語言,封裝了很多上層的類完成企業開發需要。目的就是在企業開發中可以快速精準的完成企業開發要求。例如,ServerSocket/Socket幫助你完成tcp協議,DatagramPacket幫助你完成UDP協議。你卻需要自己實現協議。而Java語言本身對於這些底層操作系統相關的調用都比較麻煩。所以,如果你真要了解通信本身的底層協議,建議你用C語言來完成,而不是Java。
建議你的老師也好好了解一下各種語言的使用范圍。在國外Java是不建議在大學的計算機課程中講的,因為這會讓你很難了解操作系統及其整個計算機系統,只能快速完成某些具體開發任務。建議對於計算機科學和計算機體系機構方面的科研教學,使用比較底層的語言,例如C語言。