关于采用udp文件传输的C/S框架,支持断点续传,报错求分析

问题描述

客户端packagecstrans;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.io.BufferedInputStream;importjava.io.DataInputStream;importjava.io.File;importjava.io.FileInputStream;importjava.io.IOException;importjava.io.RandomAccessFile;importjava.net.DatagramPacket;importjava.net.DatagramSocket;importjava.net.InetAddress;importjava.util.Date;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JTextField;publicclassClientextendsJFrameimplementsActionListener{/****/privatestaticfinallongserialVersionUID=1L;privateJTextFieldtext;//信息接收文本域privateJTextFieldcomplete;//信息接收文本域privateJTextFieldipText;//IP文本框privateJButtonbutton;//发送按钮privateDatagramSocketds=null;privateDatagramPacketdp=null;privatebyte[]data=null;privatebyte[]fileinfor=null;privatebyte[]filecurrent=null;privateStringfilename,filePath;longfilelength,filecurrentlength;privateFilefile=null;privateRandomAccessFileraFile=null;booleanflag=false;publicClient(){setTitle("UDP传输");//设置窗体标题setBounds(200,200,500,300);//窗体定位与大小setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//默认关闭操作为退出程序setLayout(null);//窗体使用边界布局管理器text=newJTextField("输入文件路径");//实例化信息接收文本域text.setBounds(10,20,150,30);add(text);complete=newJTextField("");//实例化信息接收文本域complete.setBounds(200,20,150,30);add(complete);ipText=newJTextField("115.200.4.95");//实例化IP文本框(请输入你自己IP地址)ipText.setBounds(10,70,150,30);add(ipText);button=newJButton("发送");//实例化发送按钮button.setBounds(50,130,80,30);add(button);setVisible(true);//显示窗体button.addActionListener(this);//添加按钮事件监听器}publicvoidactionPerformed(ActionEventev){try{filePath=text.getText();StringIP=ipText.getText();//获取IP文本框内容,这里为本机ipInetAddressip=InetAddress.getByName(IP);file=newFile(filePath);filename=file.getName();//文件名filelength=file.length();//文件大小fileinfor=newbyte[1024];//文件信息fileinfor=(filename+"::"+filelength).getBytes();sendfile(fileinfor,5555,3666,ip);//发送文件信息给服务器filecurrent=newbyte[1024];receivefile(filecurrent,4466);//接收服务器发来的已传输文件大小filecurrentlength=Long.parseLong(newString(dp.getData(),0,dp.getLength()));;//转化为长整型if(0<filecurrentlength&&filecurrentlength<filelength){//如果文件只传了一部分,则定位到文件位置raFile=newRandomAccessFile(filePath,"rw");raFile.seek(filecurrentlength);flag=true;}DataInputStreamfis=newDataInputStream(newBufferedInputStream(newFileInputStream(file)));intread=0;longa=newDate().getTime();data=newbyte[1024*10];while(true){if(flag)//如果文件只传了一部分就通过下面内容传输{if(read!=-1){read=raFile.read(data);}}else{//如果文件没传过,就按下面内容传输if(fis!=null){read=fis.read(data);}}if(read==-1){System.out.print("用时:");System.out.println(newDate().getTime()-a);break;}sendfile(data,6633,3355,ip);}complete.setText("传输完成");}catch(Exceptione){e.printStackTrace();}finally{if(null!=ds)ds.close();}}publicvoidreceivefile(byte[]bytes,intport)throwsIOException//数据包接收类{ds=newDatagramSocket(port);dp=newDatagramPacket(bytes,bytes.length);ds.receive(dp);}publicvoidsendfile(byte[]bytes,intport1,intport2,InetAddressip)throwsIOException//数据包传送类{ds=newDatagramSocket(port1);dp=newDatagramPacket(bytes,bytes.length,ip,port2);ds.send(dp);}publicstaticvoidmain(String[]args){Clientclient=newClient();client.setVisible(true);}}

————————————————————————————————————————————————————服务器packagecstrans;importjava.io.BufferedOutputStream;importjava.io.DataOutputStream;importjava.io.File;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.RandomAccessFile;importjava.net.DatagramPacket;importjava.net.DatagramSocket;importjava.net.InetAddress;importjava.net.SocketException;importjava.util.StringTokenizer;importjavax.swing.JFrame;importjavax.swing.JProgressBar;importjavax.swing.JTextField;publicclassServer{privateJProgressBarprogressBar;privateJTextFieldtext;//信息接收文本域privateDatagramSocketds=null;privateDatagramPacketdp=null;privateFilefile=null;privateStringfilecurrentlength;publicServer(){JFrameframe=newJFrame();frame.setBounds(200,200,500,300);frame.setLayout(null);frame.setTitle("UDP传输");//设置窗体标题frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//默认关闭操作为退出程序frame.setLayout(null);//窗体使用边界布局管理器text=newJTextField("D:\");//实例化信息接收文本域text.setBounds(10,20,150,30);frame.add(text);progressBar=newJProgressBar();progressBar.setBounds(10,150,300,30);progressBar.setStringPainted(true);progressBar.setMaximum(100);//设置最大值progressBar.setMinimum(0);//设置最小值progressBar.setValue(0);//设置初始值frame.add(progressBar);frame.setVisible(true);//显示窗体serverstar();}privatevoidserverstar(){Runnablerunnable=newRunnable(){//创建线程接收publicvoidrun(){try{InetAddressip=InetAddress.getLocalHost();//本地ipbyte[]bytename=newbyte[1024];receivefile(bytename,3666);//接收客户端发来的文件名称和文件大小Stringfileinfor=newString(dp.getData(),0,dp.getLength());//文件名称和文件大小信息StringTokenizert=newStringTokenizer(fileinfor,"::");Stringfilename=t.nextToken();//文件名file=newFile("D:\"+filename);if(file.exists())//文件是否存在{filecurrentlength=String.valueOf(newFile("D:\"+filename).length());//文件当前大小}else{filecurrentlength="0";}byte[]sendlength=newbyte[1024];sendlength=filecurrentlength.getBytes();sendfile(sendlength,5555,4466,ip);//把文件当前大小发给客户端DataOutputStreamfileOut=newDataOutputStream(newBufferedOutputStream(newFileOutputStream("D:\"+filename)));inti=0;while(i==0){byte[]receiveByte=newbyte[1024*10];receivefile(receiveByte,3355);//接收数据包i=dp.getLength();if(i>0){fileOut.write(receiveByte,0,i);fileOut.flush();i=0;//循环接收}progressBar.setValue((int)((receiveByte.length)/(newFile("D:\"+filename).length())*100));//进度条}}catch(SocketExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(IOExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}finally{if(null!=ds)ds.close();}}};newThread(runnable).start();}publicvoidreceivefile(byte[]bytes,intport)throwsIOException//接收数据包类{ds=newDatagramSocket(port);dp=newDatagramPacket(bytes,bytes.length);ds.receive(dp);}publicvoidsendfile(byte[]bytes,intport1,intport2,InetAddressip)throwsIOException//发送数据包类{ds=newDatagramSocket(port1);dp=newDatagramPacket(bytes,bytes.length,ip,port2);ds.send(dp);}publicstaticvoidmain(String[]args){Serverserver=newServer();}}

报错信息java.net.SocketException:UnrecognizedWindowsSocketserror:0:Cannotbindatjava.net.PlainDatagramSocketImpl.bind0(NativeMethod)atjava.net.PlainDatagramSocketImpl.bind(PlainDatagramSocketImpl.java:82)atjava.net.DatagramSocket.bind(DatagramSocket.java:368)atjava.net.DatagramSocket.<init>(DatagramSocket.java:210)atjava.net.DatagramSocket.<init>(DatagramSocket.java:261)atjava.net.DatagramSocket.<init>(DatagramSocket.java:234)atcstrans.Server.sendfile(Server.java:108)atcstrans.Server$1.run(Server.java:69)atjava.lang.Thread.run(Thread.java:619)

解决方案

解决方案二:
函数被调用了两次,端口已经被占用了。
解决方案三:
好像不是,应该是你bind的端口为0,bind失败了。
解决方案四:
什么意思???
解决方案五:
你是不是第二次接收的抛这个异常?
解决方案六:
两次接收端口不一样啊

时间: 2024-12-25 03:34:18

关于采用udp文件传输的C/S框架,支持断点续传,报错求分析的相关文章

文件传输-java使用SSH方式上传报错:Algorithm negotiation fail

问题描述 java使用SSH方式上传报错:Algorithm negotiation fail java用jsch实现文件传输(SSH形式),但是好像本地和服务器加密方式不一致,一直报错: com.jcraft.jsch.JSchException: Algorithm negotiation fail 解决方案 如果是已form表单中的上传.需要改form的属性enctype( 属性规定在发送到服务器之前应该如何对表单数据进行编码.) 改属性默认值:application/x-www-form

myeclipse10.0安装会自动生成一个带空格的文件夹,汉化和使用会报错

问题描述 myeclipse10.0安装会自动生成一个带空格的文件夹,汉化和使用会报错 汉化要求安装路径不能带有空格,但是安装时会自动生成一个myeclipse 10的文件夹,无法汉化,该怎么办?图片说明 尝试过把空格去掉,但这样就无法启动程序会报错 解决方案 汉化版经常会出问题的,建议用英文版 解决方案二: 用英文的貌似也没啥区别吧,不一定要汉化的

android:我的代码目录里没有 drawable-hdpi-v4这个文件夹,在编译的时候总是报错

问题描述 android:我的代码目录里没有 drawable-hdpi-v4这个文件夹,在编译的时候总是报错 请问这是什么原因呢,根本就没有drawable-hdpi-v4这个文件夹 解决方案 找到错误了,是因为三方jar包导致~ 解决方案二: 检查下你的资源文件,你的资源文件出错了, 解决方案三: 或许是你的编程工具,或者环境,出现了错误,重新装一次. 解决方案四: 你的jar包引用出问题了 解决方案五: 我也遇到了这个问题,请问如何解决的?

java-ofbiz首次导入eclipse文件报错,求大神指导下

问题描述 ofbiz首次导入eclipse文件报错,求大神指导下 都是 .getServletContext().getContextPath()); 这一句报错,是什么原因呢?如何解决? 解决方案 这个是JDK版本问题,不用管. 解决方案二: http://blog.csdn.net/jeff06143132/article/details/18814989 这里有介绍 groovy的问题

java 执行 sql 文件报错 求大神帮忙解决 急急急!!!!

问题描述 java 执行 sql 文件报错 求大神帮忙解决 急急急!!!! sql文件里边的内容 /* Navicat MySQL Data Transfer Source Server : localhost_3306 Source Server Version : 50096 Source Host : localhost:3306 Source Database : cemscenter1 Target Server Type : MYSQL Target Server Version :

环信3.1版本的UI怎么集成到项目里面啊,已经把EaseUI文件导进来了,但是却一直报错,文档上没有写清楚,跟2.0版本不同,之前的很快就弄好了,这次的版本一直出错

问题描述 解决方案 报什么错,贴出来看看解决方案二:3.1版本的集成有视频吗,已经按文档上的步骤走了,集成环信UI一大堆错,老报文件找不到.解决方案三: 解决方案四:报错的这两句头文件代码注释解决方案五:你先用CocoaPods导入最新的 EaseMobSDKFull,再下载最新的Demo,之后还不会可以联系我!

Flex读取txt文件中的内容报错原因分析及解决_Flex

Flex读取txt文件中的内容 1.具体错误如下  2.错误原因 读取文件不存在 复制代码 代码如下: var file:File = new File(File.applicationDirectory.nativePath+"/phone.txt"); 3.解决办法 将文件导入进去

python实现udp数据报传输的方法_python

本文实例讲述了Python实现UDP数据报传输的方法,非常具有实用价值.分享给大家供大家参考.具体方法分析如下: 服务端代码: import socket port = 8081 s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #从给定的端口,从任何发送者,接收UDP数据报 s.bind(("",port)) print 'waiting on port:',port while True: data,addr = s.recvf

IIS FTP部分文件上传报错451的解决方法

  最近部署一个基于IIS7的ftp服务器,添加一个组的用户具有上传及读取权限,使用Flashfxp软件测试了不同文件的上传下载,均可以正常使用.由于之前建FTP出现过使用浏览器访问不能验证用户的问题,于是也用浏览器进行测试,访问正常...正高兴呢..结果测试传几个文件遇到问题了..部分文件可以正常上传,但部分报错,具体错误提示如下: 找了下资料,发现原来是万国码问题,具体解决方法如下: 在FTP管理器的右边点击"高级设置"--将"允许UTF8"改为[False],