网络编程多线程(TCP 线程的创建) 文件上传案例

文件上传分析图解
1. 【客户端】输入流,从硬盘读取文件数据到程序中。
2. 【客户端】输出流,写出文件数据到服务端。
3. 【服务端】输入流,读取文件数据到服务端程序。
4. 【服务端】输出流,写出文件数据到服务器硬盘中。
5. 【服务端】获取输出流,回写数据。
6. 【客户端】获取输入流,解析回写数据。
 

文件上传客户端实现
public static void main(String[] args) throws IOException { 
    // 1.创建流对象 
    // 1.1 创建输入流,读取本地文件 
    BufferedInputStream bis = new BufferedInputStream(new FileInputStream("test.jpg")); 
    // 1.2 创建输出流,写到服务端 
    Socket socket = new Socket("localhost", 6666); 
    BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream()); 
    //2.写出数据. 
    byte[] b = new byte[1024 * 8 ]; 
    int len ; 
    while (( len = bis.read(b))!=-1) { 
        bos.write(b, 0, len); 
    }
    // 关闭输出流,通知服务端,写出数据完毕 
    socket.shutdownOutput(); 
    System.out.println("文件发送完毕"); 
    // 3. =====解析回写============ 
    InputStream in = socket.getInputStream(); 
    byte[] back = new byte[20]; 
    in.read(back); 
    System.out.println(new String(back)); 
    in.close(); 
    // 4.释放资源 
    socket.close(); 
    bis.close(); 
}

文件上传单线程服务器实现

public static void main(String[] args) throww IOException {             
    System.out.println("服务器 启动..... "); 
    // 1. 创建服务端
    ServerSocket ServerSocket serverSocket = new ServerSocket(6666); 
    // 2. 循环接收,建立连接 
    Socket accept = serverSocket.accept(); 
    /*
    *3. socket对象进行读写操作 
    */ 
    try { 
        //3.1 获取输入流对象 
        BufferedInputStream bis = new BufferedInputStream(accept.getInputStream()); 
        //3.2 创建输出流对象, 保存到本地 . 
        FileOutputStream fis = new FileOutputStream(System.currentTimeMillis() + ".jpg"); 
        BufferedOutputStream bos = new BufferedOutputStream(fis); 
        // 3.3 读写数据 
        byte[] b = new byte[1024 * 8]; 
        int len; 
        while ((len = bis.read(b)) != -1) { 
            bos.write(b, 0, len); 
        }
        // 4.=======信息回写===========================
        System.out.println("back ........"); 
        OutputStream out = accept.getOutputStream(); 
        out.write("上传成功".getBytes()); 
        out.close(); 
        //================================ 
        //5. 关闭 资源 
        bos.close(); 
        bis.close(); 
        accept.close(); 
        System.out.println("文件上传已保存"); 
    } catch (IOException e) { 
        e.printStackTrace(); 
    } 
}

文件上传单线程服务器实现优化

文件上传的案例中,服务器只能为客户端服务器一次,之后服务器端程序就会结束。而我们必须做到让服务器程序不能结束,时时刻刻都要为客户端服务。而且同时可以为多个客户端提供服务器,做到一个客户端就要开启一个新的线程。
public static void main(String[] args) throws IOException{     
    System.out.println("服务器 启动..... "); 
    // 1. 创建服务端
    ServerSocket ServerSocket serverSocket = new ServerSocket(6666); 
    // 2. 循环接收,建立连接 
    while (true) { 
        Socket accept = serverSocket.accept(); 
        /*
        *3. socket对象交给子线程处理,进行读写操作 Runnable接口中,只有一个run方法,
        *使用lambda表达式简化格式 
        */
        new Thread(new Runnable(){ 
            public void run(){ 
                try{
                    //3.1 获取输入流对象 
                    BufferedInputStream bis = new BufferedInputStream(accept.getInputStream()); 
                    //3.2 创建输出流对象, 保存到本地 . 
                    FileOutputStream fis = new FileOutputStream(System.currentTimeMillis() + ".jpg"); 
                    BufferedOutputStream bos = new BufferedOutputStream(fis); 
                    // 3.3 读写数据 
                    byte[] b = new byte[1024 * 8]; 
                    int len; 
                    while ((len = bis.read(b)) != -1) { 
                        bos.write(b, 0, len); 
                    }
                    // 4.=======信息回写===========================     
                    System.out.println("back ........"); 
                    OutputStream out = accept.getOutputStream(); 
                    out.write("上传成功".getBytes()); 
                    out.close(); 
                    //================================ 
                    //5. 关闭 资源 
                    bos.close(); 
                    bis.close(); 
                    accept.close(); 
                    System.out.println("文件上传已保存"); 
                } catch (IOException e) { 
                    e.printStackTrace(); 
                } 
            } 
        }).start(); 
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_40959890/article/details/107453529