Java通过Socket同时发送文本和文件
2021/11/15 17:10:36
本文主要是介绍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同时发送文本和文件的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-07-02springboot项目无法注册到nacos-icode9专业技术文章分享
- 2024-06-26结对编程到底难不难?答案在这里
- 2024-06-19《2023版Java工程师》课程升级公告
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现
- 2024-06-03为什么以及如何要进行架构设计权衡?
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)