java网络文件传输的实现

welss

贡献于2013-02-26

字数:5205 关键词: Java开发

java网络文件传输的实现 (http://www.zhengzhousem.com/) 本程序分为服务器和客户端两个小程序。 主要实现的功能是: 客户端向服务器端请求一个文件的传输连接, 服务器接收到请求命令后,要求客户端发送用户名和密码, 如果正确,就执行传输文件的过程,客户端接收完后, 保存到一个文件中并在屏幕上显示出来。 设计原理: 服务器端建立一个SocketServer等待客户端的连接, 每来一个客户端的请求连接,就创建一个新的线程对其进行单独服务, 然后继续等待其他的客户端的连接。 客户端向服务器发送文件传输请求,在服务器端要求鉴权时, 输入用户名和密码发送给服务器验证,如果验证通过就开始文件传输。   使用方法,如果需要重新编译的话输入以下两条命令: javac SendFileSocket.java javac SendFileClient.java 在命令行下的运行方式: 服务器端: java SendFileSocket 客户端: java SendFileClient serverIPAddress 例如:java SendFileClient 192.168.0.153   服务器程序: //package zieckey.socket; import java.net.*; import java.io.*; /**  * 一个简单的多线程服务器程序,用于传输文件  *  * @author zieckey  */ public class SendFileSocket extends Thread {     /**      * @param args      */     public static void main( String[] args )     {         /*if ( args.length > 0 ) // 如果有参数输入就启动服务器程序         {             server( );         } else         {             // 否则启动客户端进程             client( );         }*/         server( );//启动服务器程序     }     private static final int    PORT        = 6000;     private Socket                s;     private static final String    name        = "zieckey";     private static final String    password    = "123456";     public SendFileSocket( Socket s )     {         this.s = s;     }     public void run()     {         try         {             OutputStream os = s.getOutputStream( );             InputStream is = s.getInputStream( );             os.write( "Hello,welcome you!".getBytes( ) );             byte[] buf = new byte[100];             while ( true )             {                 int len = is.read( buf );                 String revStr = new String( buf, 0, len );                 System.out.println( "This client wants to "+revStr );                 String fileName;                 if ( revStr.startsWith( "get " ) )//表明客户端请求传输一个文件                 {                     os.write( "Please input your name and password! Using the format:name@password"                                     .getBytes( ) );                     fileName = getFileName( revStr );                     len = is.read( buf );                     revStr = new String( buf, 0, len );                     System.out.println( "The received user name and password:"+revStr);                     if ( revStr.startsWith( "zieckey@123456" ) )                     {                         FileInputStream fins = new FileInputStream( fileName );                         //byte[] fielBuf = new byte[100];                         int data;                         while ( -1 != ( data = fins.read( ) ) )//从文件中读取数据,每次读取1字节                         {                             os.write( data ); //将读取到的数据写到网络数据流中发送给客户段                         }                         break;                     }                 } else                 {                     os.write( "geting file's usage is:get filename".getBytes( ) );                 }             }             os.close( );             is.close( );             s.close( );         } catch ( Exception e )         {             e.printStackTrace( );         }     }     /*      * 作用:从客户端发来了文件请求命令中提取出所请求的文件名      * 参数:客户端发来了文件请求命令字符串,应该以“get ”开头      * 返回值:提取出所请求的文件名      */     private String getFileName( String revStr )     {         String fileName;         fileName = revStr.substring( 3 );         while ( fileName.startsWith( " " ) )         {             fileName = fileName.substring( 1 );         }         return fileName;     }     public static void server()     {         System.out.println( "This is server" );         try         {             ServerSocket ss = new ServerSocket( PORT );             int count = 0;             while ( true )             {                 // 创建一个Socket等待客户端连接                 Socket s = ss.accept( );                 count++ ;                 System.out.println( "This is the " + count + "'st client connetion!" );                 new SendFileSocket( s ).start( );// 启动一个线程为这个客户端服务             }         } catch ( Exception ex )         {             ex.printStackTrace( );         }     }     /*public static void client()     {         System.out.println( "This is client" );         try         {             // 创建一个Socket             Socket s = new Socket( InetAddress.getByName( null ), PORT );             OutputStream os = s.getOutputStream( );// 输出流             InputStream is = s.getInputStream( );// 输入流             byte[] buf = new byte[100];             int len = is.read( buf );// 从输入流中读取数据到buf             System.out.println( new String( buf, 0, len ) );             // 向输出流中写入数据,请求传输一个文件             os.write( "get server.txt".getBytes( ) );             len = is.read( buf );// 从输入流中读取数据到buf             String tempStr = new String(buf,0,len);             if ( tempStr.startsWith( "Please input your name and password" ) )             {                 System.out.print("Please input your name and password, ");                 System.out.print("Using the format:name@password:");                 System.in.read( buf );                 os.write( buf );             }                          //开始读取文件数据并把它写到一个名为"clientread.txt"的文件中             FileOutputStream fos = new FileOutputStream( "clientread.txt" );             int data;             while ( -1 != ( data = is.read( ) ) )             {                 fos.write( data );             }                          System.out.println("\nFile has been recerved successfully.");             os.close( );             is.close( );             s.close( );         } catch ( Exception ex )         {             ex.printStackTrace( );         }     }*/ } 客户端程序: import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Socket; public class SendFileClient {     private static final int    Server_PORT    = 6000;     private static final int    Client_PORT    = 6001;          /**      * 使用方法:运行这个程序需要带上参数,参数类型为点分十进制的ip地址,例如:192.168.0.153      * @param args      * @throws IOException      */     public static void main( String[] args ) throws IOException     {         // TODO Auto-generated method stub         System.out.println( "This is client" );         /*System.out.print("Please input your name and password, ");         System.out.print("Using the format:name@password:");         byte[] buf = new byte[100];         System.in.read( buf );*/         byte[] buf = new byte[100];         byte[] name = new byte[100];         //InetAddress inetAddr;                  if ( !isIPAddress(args[0]) )         {             System.out.println("The usage is : java SendFileClient ipaddress");             System.out.println("For example : java SendFileClient 192.168.0.153");                          return;         }                  String ipStr = args[0];         try         {             // 创建一个Socket             Socket s = new Socket();             s.connect ( new InetSocketAddress (ipStr , Server_PORT ), Client_PORT );             OutputStream os = s.getOutputStream( );// 输出流             InputStream is = s.getInputStream( );// 输入流             int len = is.read( buf );// 从输入流中读取数据到buf             System.out.println( new String( buf, 0, len ) );             // 向输出流中写入数据,请求传输一个文件             os.write( "get server.txt".getBytes( ) );             len = is.read( buf );// 从输入流中读取数据到buf             String tempStr = new String(buf,0,len);             if ( tempStr.startsWith( "Please input your name and password" ) )             {                 System.out.println("Please input your name and password, ");                 System.out.println("Using the format:name@password:");                 do                 {                     System.in.read( name );                 } while ( name.length<5 );                 os.write( name );             }                          //开始读取文件数据并把它写到一个名为"clientread.txt"的文件中             FileOutputStream fos = new FileOutputStream( "clientread.txt" );             int data;             while ( -1 != ( data = is.read( ) ) )             {                 fos.write( data );             }                          System.out.println("\nFile has been recerved successfully.");             os.close( );             is.close( );             s.close( );         } catch ( Exception ex )         {             ex.printStackTrace( );         }     }          //简单的判断字符串是否为一个ip地址     //后期再完善该判断方法     private static boolean isIPAddress( String ip )     {         if(ip.length( )<5)         {             return false;                     }else         {             return true;         }     } }

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 4 金币 [ 分享文档获得金币 ]
2 人已下载

下载文档

相关文档