ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-11-15 16:01:32  阅读:128  来源: 互联网

标签:Java String file Student close new 文本 public 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,String,file,Student,close,new,文本,public,Socket
来源: https://blog.csdn.net/qq_44804223/article/details/121335838

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有