这几天在自学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+"目录下");
}
}
结果