IO流--文件上传实现

文件上传
思路:需要一个服务器和一个客户端,两者进行通信,通过一个TCP连接让两者通信,两者通信的要素是服务器的IP地址和对应的端口号才能建立起连接,然后创建TCP连接,通过IO流让文件实现输入和输出.文件输入和输出通过文件字节输入流实现FileInputStreamFileOutputStream
这里需要注意的是FileInputStream(URL),这里的URL默认是定位在项目路径下的相对路径,同时,下面的并没有考虑到真正的实现其实是需要客户端和服务器端在关闭之前的确认,需要客户端先发送消息,表示数据已经发送完毕,然后服务器端接受到客户端的传输完毕消息并回传给客户端一个接受完毕的消息,这样才是一个完整的数据传输的过程
1.首先服务器应该开启,并开启一个端口号供客户端进行连接通信,实现这个是通过

 serverSocket = new ServerSocket(port);

2.服务器通过监听这个端口号的通信来确定是否有客户端进行访问,实现这个是通过

socket = serverSocket.accept();

3.服务器做好了准备工作,那客户端可以与客户端进行通信了,首先创建连接,这里的IP和port都是服务器的

 socket = new Socket(InetAddress.getByName(IP), port);

4.TCP连接了,然后通过IO流来让文件传输,客户端要想传输文件,必须先将文件读取然后转为IO流再进行输出,那么在客户端就需要进行两步操作,先读取,后输出,读取是在本地读取,而输出给服务器端,那么输出流就需要通过已经建立起TCP连接的socket来创建

 //2.然后向服务器发送消息,需要一个输出流
            os = socket.getOutputStream();
 //3.读取本地的文件并输出,需要一个输入流
            is = new FileInputStream("123.txt");

5.客户端需要通过一个缓冲区来让文件实现完整的上传和输出,通过一个字节数组,保证整个文件不会因为字符数量的大小导致文件上传失败

   //4.读取文件中的内容并输出,读取文件的内容需要一个字节流,用字节数组来接收
            byte[] buffer = new byte[1024];//这个字节数组是属于IO流中的缓冲区,
            int length ;
            while ((length=is.read(buffer) )!= -1){
                os.write(buffer,0,length);
            }

6.到这一步,客户端的任务完成了大半,然后就是服务器端的接受操作,与客户端也是大同小异,通过文件字节输入流和文件字节输出流对连接中的数据进行读取和输出

      //1.先创建一个端口号供客户端去连接,其实应该先有一个服务器端口号,那客户端才能连上(怎么创建一个端口号?)
             serverSocket = new ServerSocket(8099);
             //2.服务器监听端口号,看端口号是否有客户端连接
             socket = serverSocket.accept();
             //3.创建一个输入流和一个输出流,输入流用于接收客户端传来的数据,输出流用于输出
             is = socket.getInputStream();//在建立起的连接中获取信息
             os = new FileOutputStream("receive.txt");//这里输出的用的是文件流
             int len ;
            byte[] bytes = new byte[1024];
            while ((len = is.read(bytes)) != -1){
                os.write(bytes,0,len);
            }

完整的代码实现
客户端

/**客户端*/
public class TcpClient {
    public static void main(String[] args) {
        Socket socket = null;
        OutputStream os = null;
        FileInputStream is = null;
        try {
            //1.客户端要连接服务器,需要创建一个连接,创建连接需要服务器的IP号和对应的端口号
             socket = new Socket(InetAddress.getByName("127.0.0.1"), 8099);
            //2.然后向服务器发送消息,需要一个输出流
            os = socket.getOutputStream();
            //3.读取本地的文件并输出,需要一个输入流
            is = new FileInputStream("123.txt");
            //4.读取文件中的内容并输出,读取文件的内容需要一个字节流,用字节数组来接收
            byte[] buffer = new byte[1024];//这个字节数组是属于IO流中的缓冲区,
            int length ;
            while ((length=is.read(buffer) )!= -1){
                os.write(buffer,0,length);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //5.关闭连接
            if (is != null){
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (os != null){
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (socket != null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }



    }
}

服务器端

/**服务器*/
public class TcpServer {
    public static void main(String[] args) {

        ServerSocket serverSocket = null;
        Socket socket = null;
        InputStream is = null;
        FileOutputStream os =null;
        try {
            //1.先创建一个端口号供客户端去连接,其实应该先有一个服务器端口号,那客户端才能连上(怎么创建一个端口号?)
             serverSocket = new ServerSocket(8099);
             //2.服务器监听端口号,看端口号是否有客户端连接
             socket = serverSocket.accept();
             //3.创建一个输入流和一个输出流,输入流用于接收客户端传来的数据,输出流用于输出
             is = socket.getInputStream();//在建立起的连接中获取信息
             os = new FileOutputStream("receive.txt");//这里输出的用的是文件流
             int len ;
            byte[] bytes = new byte[1024];
            while ((len = is.read(bytes)) != -1){
                os.write(bytes,0,len);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }finally {

            if (os != null){
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (is != null){
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (socket != null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (serverSocket != null){
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值