Java实现文件上传服务器和客户端
本文实例为大家分享了Java实现文件上传服务器和客户端的具体代码,供大家参考,具体内容如下
文件上传服务器端:
/** *使用TCP协议实现上传功能的服务器端 *思路: *新建ServerSocket *等待客户端连接 *连接上后开启子线程,把连接获取的Socket传给子线程 *循环进行 *@authoryajun * */ publicclassUploadServer{ publicstaticvoidmain(String[]args){ UploadServerserver=newUploadServer(); UploadThreadcommand=newUploadThread(); server.start(command); } /** *功能:接受连接,开启子线程,循环 *@paramcommand用于下载的子线程对象,该对象实现了Runnable接口 */ privatevoidstart(UploadThreadcommand){ //局部变量 ServerSocketserverSocket=null; SockettransSocket; //业务逻辑 try{ serverSocket=newServerSocket(55555); while(true){ System.out.println("等待连接……"); transSocket=serverSocket.accept(); inti=0; i++; System.out.println("第"+i+"个连接"); //用不用在下载完后关闭线程呢??? command.setSocket(transSocket); Executors.newFixedThreadPool(5).execute(command); } //异常捕获 }catch(IOExceptione){ e.printStackTrace(); //关闭资源 }finally{ try{ serverSocket.close(); }catch(IOExceptione){ e.printStackTrace(); } }//Endoftry }//Endofconnect @Test publicvoidtestConnect(){ //测试任务:先运行服务器端,然后多次运行客户端,服务器段可以不断创建子线程,则测试成功 //测试准备:构造一个线程,用于模拟下载线程 UploadThreadcommand=newUploadThread(); start(command); } @Test publicvoidtestDown()throwsIOException{ byte[]buf; ByteArrayInputStreambis; Stringstr="canglaoshi.avi\ncontent,content,content"; buf=str.getBytes(); bis=newByteArrayInputStream(buf); UploadThreadut=newUploadThread(); ut.down(bis); } } //完成各个传输任务的子线程 classUploadThreadimplementsRunnable{ Socketsocket; publicUploadThread(){} publicUploadThread(Socketsocket){ this.socket=socket; } @Override publicvoidrun(){ InputStreamin; try{ in=socket.getInputStream(); down(in); //异常处理 }catch(IOExceptione){ e.printStackTrace(); }finally{ try{ socket.close(); }catch(IOExceptione){ e.printStackTrace(); } } //测试代码 /*try{ Thread.sleep(5000); System.out.println(Thread.currentThread().getName()+",复制完毕"); }catch(InterruptedExceptione){ e.printStackTrace(); }*/ }//Endofrun publicvoidsetSocket(Socketsocket){ this.socket=socket; } //下载方法 /** *目标:把InputStream中的数据写入到本地 *思路: *1.获取输入流,最好传入输入流,而不是直接从Socket获取,传入有利用单元测试 *2.从输入流中读到文件名 *3.新建文件和文件输出流 *4.从输入流中读到文件内容到文件输出流 *5. *@throwsIOException */ publicvoiddown(InputStreamin)throwsIOException{ //局部变量 charch; char[]nameArr=newchar[256]; byte[]buf=newbyte[1024]; Stringname=""; OutputStreamout=null; //业务逻辑 try{ //第一步:获取文件名,构造文件输出流 inti=0; while((ch=(char)in.read())!='\n'){ nameArr[i++]=ch; } //name=nameArr.toString();//这句话无法将字符数组转换为字符串,需用下面的语句 name=newString(nameArr); System.out.println("要下载的文件为:"+name); out=newFileOutputStream("src\\down\\"+name); //第二步:将输入流中的其他内容写入到文件 intlen; while((len=in.read(buf))!=-1){ out.write(buf,0,len); } out.flush(); //异常捕获 }catch(IOExceptione){ e.printStackTrace(); //关闭资源 }finally{ //疑问:两个捕获可不可以放到一块呢,怎样处理关闭流时的异常最好呢? in.close(); out.close(); } //调试 System.out.println(name); } }//EndofUploadThread
文件上传客户端:
/** *使用TCP协议实现上传功能的客户端 *@authoryajun */ publicclassUploadClient{ publicstaticvoidmain(String[]args){ UploadClientclient=newUploadClient(); client.upload("src\\thursday\\AsListTest.java"); } /** *作用:上传文件到服务器 *1.建立到服务器的连接 *2.获取输出流 *3.将文件内容写入到输出流 *4.获取服务器的响应 */ privatevoidupload(Stringname){ Socketsocket=null; OutputStreamout; try{ socket=newSocket("127.0.0.1",55555); out=socket.getOutputStream(); write2OutputStream(name,out); //异常捕获 }catch(UnknownHostExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); } } @Test publicvoidtestUpload(){ upload("src\\status.xml"); } /** *作用:传入文件名和输出流,将文件写入到输出流 *@parampath *@throwsIOException */ privatevoidwrite2OutputStream(Stringpath,OutputStreamout)throwsIOException{ FileInputStreamfis=null; byte[]buf=newbyte[1024]; StringfileName=""; //业务逻辑 try{ //1.写入文件名 fileName=path.substring(path.lastIndexOf('\\')+1); System.out.println("您要上传的文件名为:"+fileName); out.write(fileName.getBytes()); out.write('\n'); //2.写入文件内容 fis=newFileInputStream(path); intlen; while((len=fis.read(buf))!=-1){ out.write(buf,0,len); } out.flush(); //异常处理 }catch(IOExceptione){ e.printStackTrace(); //关闭资源 }finally{ fis.close(); out.close(); } }//Endofupload @Test publicvoidtestWrite2OutputStream()throwsIOException{ ByteArrayOutputStreamout=null; try{ out=newByteArrayOutputStream(); write2OutputStream("src\\status.xml",out); System.out.println(out.toString("utf-8")); }catch(IOExceptione){ e.printStackTrace(); }finally{ out.close(); } } }
本文已被整理到了《Java上传操作技巧汇总》,欢迎大家学习阅读。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。