TCP-C/S结构,客户端向服务器端发送文件,并以指定路径与文件名保存

客户端向服务端发送一个文件,并且在发送的时候指定这个路径和要保存的名字,
服务端收到后根据客户端发送过来的信息,用该名字保存数据到指定的路径
比如说客户端发送的结构为 :dir , filename , data 服务端收到后根据对应的来保存
客户端:

public class TCPClient {
     
    public static void main(String[] args) {
     
        //创建一个Fiel对象。构造方法中绑定要上传的数据路径
        File file = new File("X:\\XX\\XXX\\java.txt");
        //定义一个客户端
        Socket socket = null;
        //定义一个本地字节输入流
        FileInputStream fis = null;
        //定义一个对象序列化流
        ObjectOutputStream oos = null;
        try {
     
            //获取客户端对象,构造方法中传递,服务器IP地址,和端口号
            socket = new Socket("192.168.0.0", 8080);
            //获取要读取的文件,构造方法中传递file对象
            fis = new FileInputStream(file);
            //定义一个数组,存放读取到的数据
            byte[] bytes = new byte[1024];
            //读取数据
            fis.read(bytes);
            //创建一个对象,构造方法中传递指定的目录,文件名以及读取到的文件数据
            Path path = new Path("X:\\XX\\XX", "java.txt", bytes);
            //获取到序列化流对象,构造方法中传递,客户端socket对象的网络字节输出流
            oos = new ObjectOutputStream(socket.getOutputStream());
            //将创建的对象,序列化,将对象以流的形式写入
            oos.writeObject(path);
        } catch (IOException e) {
     
            e.printStackTrace();
        } finally {
     
            try {
     
                //关闭资源
                oos.close();
                fis.close();
                socket.close();
            } catch (IOException e) {
     
                e.printStackTrace();
            }
        }
    }
}
//创建一个对象,实现了SeriaLiable接口,用于序列化
class Path implements Serializable {
      
    //对象中定义三个属性
    String dir;//指定的文件目录
    String filename;//文件名
    byte[] data;//文件数据

    //无参构造
    public Path() {
     
    }

    //全参构造
    public Path(String dir, String filename, byte[] data) {
     
        this.dir = dir;
        this.filename = filename;
        this.data = data;
    }
}

服务器端:

public class TCPServer {
     
    public static void main(String[] args) {
     
        //定义一个服务器
        ServerSocket server = null;
        //定义一个本地字节输出流
        FileOutputStream fos = null;
        //定义一个对象的反序列化流
        ObjectInputStream ois = null;
        try {
     
            //获取服务器对象,构造方法中绑定特定端口
            server = new ServerSocket(8080);
            //使用服务器对象的方法,获取到访问服务器的客户端对象socket
            Socket socket = server.accept();
            //获取反序列化流对象,构造方法中传递客户端对象的网络字节输入流
            ois = new ObjectInputStream(socket.getInputStream());
            //使用反序列化流对象,读取到传递过来的对象
            Object readObject = ois.readObject();
            //将对象强转
            Path path = (Path) readObject;
            //创建一个File对象,构造方法中传递客户端指定的路径
            File file = new File(path.dir);
            //file对象使用创建多级目录方法,如果有,则不创建,没有则创建
            file.mkdirs();
            //获取本地输出流对象,构造方法中传递要输出的路径以及指定的文件名
            fos = new FileOutputStream(file + File.separator + path.filename);
            //直接写入数据
            fos.write(path.data);
        } catch (ClassNotFoundException e){
     
            e.printStackTrace();
        }catch (IOException e) {
     
            e.printStackTrace();
        } finally {
     
            try {
     
                //关闭资源
                fos.close();
                ois.close();
                server.close();
            } catch (IOException e) {
     
                e.printStackTrace();
            }
        }
    }
}

以上方法还可以继续完善,如服务器回写等

你可能感兴趣的:(java)