HuaXinIM聊项目阶段总结七(收发文件实现)

本文是HuaXinIM项目阶段总结的第七部分,主要介绍了客户端收发文件功能的实现。目前,项目还剩下远程操纵和表情收发的功能待完成。开发者鼓励自己继续加油。

今天完成了项目中的收发文件业务。





客户端收发文件类:

public class ClientSendReceiveFile {
	//客户端接收文件时调用的方法
	public static void readFile(ObjectInputStream Pois, String path) {
		System.out.println("客户端进入了readFile方法...");
		try {
			FileOutputStream fos = new FileOutputStream(path);// 创建文件输出流输出文件内容
			ObjectInputStream ois = new ObjectInputStream(IMClientSingleton.socket.getInputStream());
			long number = ois.readLong();//读文件需要接收的次数
			int last = ois.readInt();//读文件需要写的最后字节
			System.out.println("文件需要接收的次数为:	"+number+"文件最后的字节为:	"+last);
			// 读文件内容
			byte[] bytes = new byte[2048];
			while (number > 0) {
				ois.readFully(bytes);
				fos.write(bytes);
				fos.flush();
				number--;
			}
			if (last > 0) {
				bytes = new byte[last];
				ois.readFully(bytes);
				fos.write(bytes);
				fos.flush();
			}
			fos.close();
			System.out.println("文件接收完成!");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	//客户端发送文件时调用的方法
	public static void sendFile(ObjectOutputStream Poos, String path,String username,String destname) {
		System.out.println(username+"客户端进入了sendFile方法...");
		try {
			File file = new File(path);
			String Msg = "<type>"+"sendFile"+"</type>"
					+ "<username>"+username+"</username>"
					+ "<destname>"+destname+"</destname>"
					+ "<fileName>"+file.getName()+"</fileName>";
			IMClientSingleton.getInstance().getOos().writeUTF(Msg);
			IMClientSingleton.getInstance().getOos().flush();
			FileInputStream fis = new FileInputStream(path);//创建文件输入流,把文件内容读入程序
			ObjectOutputStream oos = new ObjectOutputStream(IMClientSingleton.socket.getOutputStream());
			long number = file.length() / 2048;//记录文件长度并且
			int last = (int) file.length() % 2048;
			System.out.println("number的长度为:   "+number+"   last的长度为:   "+last);
			oos.writeLong(number);
			oos.flush();
			oos.writeInt(last);
			oos.flush();
			byte[] bytes = new byte[2048];
			while (number > 0) {
				fis.read(bytes);
				oos.write(bytes);
				oos.flush();
				number--;
			}
			if (last > 0) {
				bytes = new byte[last];
				fis.read(bytes);
				oos.write(bytes);
				oos.flush();
			}
			fis.close();
			System.out.println("文件发送完成!");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

服务器收发文件类:

public class ServerSendReceiveFile {
	public void SendAndReadFile(String socketMsg,Socket sendSocket,SocketThread receiveSocket,String destname){
		System.out.println("进入了SendAndReadFile方法...");
		try {
			String fileName = getType(socketMsg,"fileName");
			File file = new File("C:\\Users\\asus\\Desktop\\javaData\\HuaXinIM聊\\服务器文件\\"+fileName);
			FileOutputStream fos = new FileOutputStream(file);//文件输出流
			ObjectInputStream ois = new ObjectInputStream(sendSocket.getInputStream());
			System.out.println("服务器对象输入流已经创建完成...");
			long number1 = ois.readLong();
			long numbel2 = number1;
			int last1 = ois.readInt();
			System.out.println("number1的长度为:   "+number1+"   last1的长度为:   "+last1);
			byte[] bytes = new byte[2048];
			while( number1 > 0 ){
				ois.readFully(bytes);
				fos.write(bytes);
				fos.flush();
				number1 -- ;
			}
			if( last1 > 0 ){
				bytes = new byte[last1];
				ois.readFully(bytes);
				fos.write(bytes);
				fos.flush();
			}
			System.out.println("if判断执行完...");
			fos.close();
			System.out.println("文件上传成功...");
			//发送给接收的客户端
			String Msg = "<type>"+"receive"+"</type>"
					+ "<username>"+destname+"</username>"
					+ "<fileName>"+fileName+"</fileName>";
			System.out.println("输出流已经创建成功...");
			receiveSocket.oos.writeUTF(Msg);
			receiveSocket.oos.flush();
			ObjectOutputStream oos = new ObjectOutputStream(receiveSocket.socket.getOutputStream());
			System.out.println("服务器再次创建输出流...");
			FileInputStream fis = new FileInputStream(file);//文件输入流
			oos.writeLong(numbel2);
			oos.flush();
			oos.writeInt(last1);
			oos.flush();
			System.out.println("numbel2的长度为:   "+numbel2+"   last1的长度为:   "+last1);
			bytes = new byte[2048];
			while( numbel2 > 0 ){
				fis.read(bytes);
				oos.write(bytes);
				oos.flush();
				numbel2 -- ;
			}
			if( last1 > 0 ){
				bytes = new byte[last1];
				fis.read(bytes);
				oos.write(bytes);
				oos.flush();
			}
			fis.close();
			System.out.println("文件下载成功...");
			System.out.println("服务器转发完成...");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public String getType(String str,String type){
		int beginIndex = str.indexOf("<"+type+">");
		int endIndex = str.indexOf("</"+type+">");
		return str.substring(beginIndex+2+type.length(), endIndex);
	}
}



现在项目还需完成:远程操纵、表情收发。

加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值