java网络文件传输的实现——Socket编程
 All Rights Reserved!
本程序分为服务器和客户端两个小程序。
主要实现的功能是:
客户端向服务器端请求一个文件的传输连接,
服务器接收到请求命令后,要求客户端发送用户名和密码,
如果正确,就执行传输文件的过程,客户端接收完后,
保存到一个文件中并在屏幕上显示出来。
设计原理:
服务器端建立一个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( ByName( 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( "".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:");
                ad( buf );
                os.write( buf );
            }
           
            //开始读取文件数据并把它写到一个名为""的文件中
            FileOutputStream fos = new FileOutputStream( "" );
            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];
        ad( 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(java创建文件 "".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 );
            }
           
            //开始读取文件数据并把它写到一个名为""的文件中

            FileOutputStream fos = new FileOutputStream( "" );
            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;
        }
    }
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。