导航:首页 > 编程语言 > 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传输文件相关的资料

热点内容
ftp命令行查看文件数量 浏览:494
linux查看设备的命令 浏览:827
pythongolang学哪个 浏览:349
金蝶加密锁驱动下载 浏览:300
python编程基于自然语言处理库 浏览:133
javaseruntime 浏览:902
cad如何将命令放在鼠标旁边 浏览:746
程序员对粉色 浏览:125
编译器命令java 浏览:989
云服务器怎么数据同步 浏览:685
c盘文件修复命令语 浏览:966
文件夹中文件怎么上下移动 浏览:831
魅族手机用什么软件解压 浏览:763
加密币糖果 浏览:300
c编译调试是什么 浏览:631
安装mysql服务命令 浏览:734
程序员cpa考试 浏览:200
汕头买房用什么app好 浏览:23
民生原号码掉失如何登录app 浏览:710
如何设置服务器的重生点 浏览:272