Android通过SOCKET下载文件的方法
本文实例讲述了Android通过SOCKET下载文件的方法。分享给大家供大家参考,具体如下:
服务端代码
importjava.io.BufferedInputStream; importjava.io.DataInputStream; importjava.io.DataOutputStream; importjava.io.File; importjava.io.FileInputStream; importjava.io.IOException; importjava.io.InputStream; importjava.io.OutputStream; importjava.net.ServerSocket; importjava.net.Socket; importjava.util.Scanner; publicclassFunctionServer{ privatestaticintPORT=2012; privateStringpath="需要下载的文件所在路径"; publicstaticvoidmain(String[]args)throwsIOException{ FunctionServerserver=newFunctionServer(); server.start(); } publicvoidstart()throwsIOException{ ServerSocketss=newServerSocket(PORT); while(true){ Sockets=ss.accept(); newService(s).start();//创建线程 } } classServiceextendsThread{ Sockets; publicService(Sockets){ this.s=s; } publicvoidrun(){ try{ InputStreamin=s.getInputStream();//得到输入流 Scannersc=newScanner(in); OutputStreamout=s.getOutputStream(); while(true){ Stringstr=sc.nextLine();//读取文件名 if(!str.equals(null)){ System.out.println("你的文件名是"+str); //根据路径和文件名获取文件 Filef=newFile(path+str); FileInputStreamfis=newFileInputStream(f); DataInputStreamdis=newDataInputStream(newBufferedInputStream(fis)); byte[]buffer=newbyte[8192]; DataOutputStreamps=newDataOutputStream(out); ps.writeLong((long)f.length());//发送文件大小 ps.flush(); while(true){ intread=0; if(dis!=null){ read=fis.read(buffer); } if(read==-1){ break; } ps.write(buffer,0,read); } ps.flush(); dis.close(); s.close(); out.flush(); break; } } }catch(IOExceptione){ e.printStackTrace(); } } } }
客户端代码,下载线程
classDownloadThreadextendsThread{ Socketsocket; InputStreamin; OutputStreamout; Stringpath="文件保存路径"; StringfunctionName; StringserverIp="服务器IP"; intsocketPort="服务端口号"; intfileSize,downLoadFileSize; publicDownloadThread(StringfunctionName){ this.functionName=functionName; } @Override publicvoidrun(){ Looper.prepare(); while(!Thread.interrupted()){ try{ socket=newSocket(serverIp,socketPort); InputStreamin=socket.getInputStream(); OutputStreamout=socket.getOutputStream(); out.write((functionName+"\n").getBytes("gbk")); out.flush();//清理缓冲,确保发送到服务端 Filef=newFile(path+functionName); OutputStreamsong=newFileOutputStream(f); DataInputStreamdis=newDataInputStream( newBufferedInputStream(in)); DataOutputStreamdos=newDataOutputStream( newBufferedOutputStream(song)); fileSize=(int)dis.readLong()-1; System.out.println("开始下载"); byte[]buffer=newbyte[8192]; while(true){ intread=0; if(dis!=null){ read=dis.read(buffer); downLoadFileSize+=read; } if(read==-1){ break; } dos.write(buffer,0,read); } System.out.println("文件下载完成"); dos.close(); }catch(UnknownHostExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }finally{ this.interrupt(); } } } }
基本可以直接用,根据自己需要稍微改动就OK了
希望本文所述对大家Android程序设计有所帮助。