使用C/S结构实现客户端上传本地文件到服务器

客户端:

package cn.kgc.cs01;

import java.io.*;
import java.net.Socket;

public class Demo01_Client {
    public static void main(String[] args) {
        try {
            //创建客户端socket对象
            Socket socket = new Socket("localhost",8888);
            //获得网络字节输出流,用来把本地文件写到服务器端内存
            OutputStream os = socket.getOutputStream();
            //创建本地字节输入流,用来把本地文件读到客户端内存
            FileInputStream fis = new FileInputStream("h:\a.jpg");
            //采用数组使读写效率更高
            byte[]bytes=new byte[1024];
            int len=0;
            //当本地字节流在读取完数组中的最后一个元素时,会返回-1
            while((len=fis.read(bytes))!=-1){
                //网络字节流把读到的文件写到服务器端内存
                os.write(bytes,0,len);
            }
            //关闭服务器端的读写循环
            socket.shutdownOutput();
            //创建网络字节输入流,来获得服务器端的反馈
            InputStream is = socket.getInputStream();
            int read = is.read(bytes);
            //将读到的字节数组转成字符串输出
            System.out.println(new String(bytes,0,read));
            //释放资源
            is.close();
            os.close();
            fis.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }
}

  服务器端:

package cn.kgc.cs01;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;

public class Demo01_Server {
    public static void main(String[] args) {
        try {
            //创建服务端的serverSocket对象,提供端口号
            ServerSocket server = new ServerSocket(8888);
            //创建文件对象,判断本地是否存在该文件,如果没有则创建
            File file = new File("h:\up");
            if(!file.exists()){
                file.mkdir();
            }
            //开启线程,提高上传效率
            new Thread(new Runnable() {
                @Override
                public void run() {
                    while(true){
                        try{
                            //通过accept()方法获得客户端socket对象,并监听
                            Socket socket = server.accept();
                            //获得网络字节输入流,来读取客户端上传的文件
                            InputStream is = socket.getInputStream();
                            /**
                             * 创建本地字节输出流,把服务器读到的文件写到硬盘里面
                             * 注意:文件名应该用随机数和当前时间的组合,
                             * 这样才能保证每次都能把文件写到硬盘里面
                             */
                            FileOutputStream fos = new FileOutputStream("h:\up\" + (new Random().nextInt() + System.currentTimeMillis()) + ".jpg");
                            byte[]bytes=new byte[1024];
                            int len=0;
                            while((len=is.read(bytes))!=-1){
                                //把服务器读到的文件写到内存中
                                fos.write(bytes,0,len);
                            }
                            //获得网络字节输出流,给客户端反馈信息
                            OutputStream os = socket.getOutputStream();
                            //把字符串转成字节数组传给客户端
                            os.write("文件上传成功!".getBytes());
                            //释放资源
                            os.close();
                            fos.close();
                            is.close();
                            socket.close();
                            /**
                             * 注意:
                             * 服务器Server的流一定不能关
                             */
                        }catch(IOException e){
                            e.printStackTrace();
                        }

                    }
                }
            }).start();//千万别忘了调用线程的开始方法


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

    }
}