• java网络编程(7)——利用tcp实现文件上传


    其实客户端与服务端通讯的道理都是一样的,都是通过输入与输出这两个流,那么实现文件上传也就是同样的,客户端把文件读到文件流,服务端用文件流来接受,然后写到一个文件中,这样子就实现了文件上传,文件拷贝也是同样的道理~,具体看代码实现:

    客户端:

    package com.seven.tcp;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    
    public class TcpFileUploadClient {
        
        public static void main(String[] args) throws Exception {
            
            Socket socket = new Socket("127.0.0.1",10001);
            
            FileInputStream fis = new FileInputStream(new File("e:\test.txt"));
            
            OutputStream out = socket.getOutputStream();
            
            byte[] buf = new byte[1024];
            
            int len = 0;
            
            while((len=fis.read(buf))!=-1){
                out.write(buf);
            }
            
            socket.shutdownOutput();
            
            InputStream in = socket.getInputStream();
            
            len = in.read(buf);
            
            System.out.println("return:"+new String(buf,0,len));
            
            fis.close();
            
            socket.close();
            
            
        }
        
    }

    服务端:

    package com.seven.tcp;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     * 服务端要用多线程来实现,这样才能实现多个用户同时上传
     * 
     * @author Seven
     *
     */
    public class TcpFileUploadServer {
    
        public static void main(String[] args) throws Exception {
            
            ServerSocket serverSocket = new ServerSocket(10001);
            
            //循环,每次有新的连接就开启一个新的线程
            while(true){
                
                Socket socket = serverSocket.accept();
                
                new Thread(new FileUploadThread(socket)).start();
                
            }
    
        }
    
    }
    
    class FileUploadThread implements Runnable {
    
        private Socket socket;
    
        public FileUploadThread(Socket s) {
            this.socket = s;
        }
    
        // 在run方法中实现文件上传
        public void run() {
    
            try {
    
                System.out.println(socket.getInetAddress().getHostAddress()+"....connected");
                
                String filename = socket.getInetAddress().getHostAddress();
    
                int count = 1;
    
                File file = new File("e:\" + filename + count);
    
                while (file.exists()) {
                    file = new File("e:\" + filename + count++);
                }
    
                FileOutputStream fileOutputStream = new FileOutputStream(file);
    
                InputStream in = socket.getInputStream();
                
                byte[] b = new byte[1024];
    
                int len = 0;
                
                while ((len = in.read(b)) != -1) {
                    fileOutputStream.write(b,0,len);
                }
                //返回成功
                OutputStream out = socket.getOutputStream();
                out.write("success!".getBytes());
                
                socket.close();
    
            }catch (Exception e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
    
        }
    
    }
  • 相关阅读:
    推销
    5132. 颜色交替的最短路径
    5130. 等价多米诺骨牌对的数量
    @babel/plugin-transform-runtime和@babel/preset-env的区别
    5128. 最深叶节点的最近公共祖先(二叉树)
    1094. 拼车
    1109. 航班预订统计(数组)
    5129. 表现良好的最长时间段(数组)
    path.resove 和 path.join
    【原生】 call、apply、bind 的基本使用方法,已经解析了某些源码
  • 原文地址:https://www.cnblogs.com/sevenlin/p/sevenlin_tcpfileupload20150802.html
Copyright © 2020-2023  润新知