今天完成了项目中的收发文件业务。
客户端收发文件类:
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);
}
}
现在项目还需完成:远程操纵、表情收发。
加油!