Java通过Socket同时发送文本和文件

这几天在自学Socket网络编程时突然要用到文件和文本同时传输到服务器,但是在网上找了半天页找不到具体的结局办法,最后在不断琢磨之下终于解决了这个问题,在传输数据时使用的是Java中的ObjectInputStream 和 ObjectOutputStream对象流,这个流可以封装复杂的数据在网络中进行传输,发送涉及到的类需要实现Serializable接口,是一个标志接口,用于序列化的,没有任何的方法需要实现。废话不多说,直接上代码
Student类,用于封装数据进行传输和解析

public class Student implements Serializable {
    private String username;
    private String sex;
    private byte[] file;
    private String filename;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public byte[] getFile() {
        return file;
    }

    public void setFile(byte[] file) {
        this.file = file;
    }

    public String getFilename() {
        return filename;
    }

    public void setFilename(String filename) {
        this.filename = filename;
    }

    @Override
    public String toString() {
        return "Student{" +
                "username='" + username + '\'' +
                ", sex='" + sex + '\'' +
                ", filename='" + filename + '\'' +
                '}';
    }
}

客户端:

public class ClientSocket {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1",9999);
//        获得Socket输出字节流
        OutputStream os = socket.getOutputStream();
        Student student = new Student();
        student.setUsername("765652244");
        student.setSex("男");
//        获取文件地址
        File file = new File("C:\\Users\\网络杀手\\Desktop\\image\\soft\\bg.png");
//        将文件名保存到Student中
        student.setFilename(file.getName());
//        获得文件字节输入流
        FileInputStream fis = new FileInputStream(file);
//        将文件字节流保存至字节输出缓冲流
        ByteArrayOutputStream bos = new ByteArrayOutputStream(fis.available());
        byte[] b = new byte[1024];
        int len = -1;
        while((len = fis.read(b)) != -1) {
            bos.write(b, 0, len);
        }
//        将得到的文件字节转换为字节数组
        student.setFile(bos.toByteArray());
//        将socket输出流进行转换
        ObjectOutputStream oos =new ObjectOutputStream(os);
//        将对象输出流发送到服务器
        oos.writeObject(student);
        fis.close();
        bos.close();
        oos.flush();
        oos.close();
        System.out.println("发送成功");
    }
}

服务器:

public class ServerSocketDome {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        ServerSocket serverSocket = new ServerSocket(9999);
//        监听9999端口,等待客户端连接,如果没有连接,将会一直阻塞
        Socket accept = serverSocket.accept();
//        获得数据输入流,
        InputStream is = accept.getInputStream();
//        对数据输入流进行转换
        ObjectInputStream ois = new ObjectInputStream(is);
//        将获得的数据转换为Studen类
        Student o = (Student)ois.readObject();
        System.out.println("用户名:"+o.getUsername()+"\n"+"性别:"+o.getSex());
        System.out.println("文件名:"+o.getFilename());
//        将获得的文件保存至磁盘中
        File file = new File("D:\\"+o.getFilename());
//        获得输出流,准备将内存中的数据写到磁盘
        FileOutputStream fos = new FileOutputStream(file);
//        将Student类中或的文件字节写入磁盘
        fos.write(o.getFile());
        fos.close();
        serverSocket.close();
        accept.close();
        is.close();
        ois.close();
        System.out.println("保存成功,文件名是:"+o.getFilename()+"\n存在在:"+file+"目录下");
    }
}

结果
Java通过Socket同时发送文本和文件

上一篇:三十四、java基于jdbc操作MySQL数据库之查询方法封装


下一篇:7 输入和输出