个人完成部分
总功能描述
QQ聊天室使用图形界面,实现用户注册、登录、私聊、公聊、文化传输,服务推送消息,拉取在线用户列表。
客户端功能描述
用户注册、登录、私聊、公聊、文件传输。
部分代码展示
//文件传输
package Service;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Date;
import qqCommon.Message;
import qqCommon.MessageType;
import qqServer.Utils.MyObjectOutputStream;
import view.ChatFrame;
/**
*
* @author sky
* @version 1.0
*
* 客户端 -- 文件传输类
*
* 该类用于文件传输
*/
public class FileClinetService {
private ChatFrame chatFrame = null;
/** 群发文件方法
*
* @param senderId 发送方
* @param srcPath 本地文件路径
* @param fileName 文件名
* @param chatFrame 聊天界面
*/
public void sendFileToAll(String senderId, String srcPath, String fileName, ChatFrame chatFrame) {
this.chatFrame = chatFrame;
// 若文件名为空, 说明没有选择文件
if(fileName == null) {
return;
}
// 创建message
Message message = new Message();
message.setMessType(MessageType.MESSAGE_File_MES_TOALL); // 设置类型
message.setSender(senderId);
message.setFileName(fileName);
message.setSendTime(new Date().toString()); // 发送时间
// 读取 源文件 路径srcPath
FileInputStream fis = null;
// 获取文件长度 转为int型
byte []fileBytes = new byte[(int)new File(srcPath).length()];
try {
fis = new FileInputStream(srcPath);
fis.read(fileBytes); // 将src源文件 读取到程序数组
// 将字节数组 存入message
message.setFileBytes(fileBytes);
// 发送message 给服务端
ClientConnectThread thread = ClientConnectThreadManage.getThread(senderId, "群聊");
MyObjectOutputStream oos =
new MyObjectOutputStream(thread.getSocket().getOutputStream());
oos.writeObject(message);
// 提示信息
println(senderId + "(我) 发送文件:\t\t " + new Date().toString());
println(" 路径为: " + srcPath + "\n");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 关闭流
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/** 单发文件方法
*
* @param senderId 发送者id
* @param getterId 接收者id
* @param srcPath 源文件路径
* @param destPath 接收文件存入路径
*/
public void sendFileToOne(String senderId, String getterId, String srcPath, String fileName, ChatFrame chatFrame) {
this.chatFrame = chatFrame;
// 若文件名为空, 说明没有选择文件
if(fileName == null) {
return;
}
// 创建message
Message message = new Message();
message.setMessType(MessageType.MESSAGE_File_MES); // 设置类型
message.setSender(senderId);
message.setGetter(getterId);
message.setFileName(fileName);
message.setSendTime(new Date().toString()); // 发送时间
// 读取 源文件 路径srcPath
FileInputStream fis = null;
// 获取文件长度 转为int型
byte []fileBytes = new byte[(int)new File(srcPath).length()];
try {
fis = new FileInputStream(srcPath);
fis.read(fileBytes); // 将src源文件 读取到程序数组
// 将字节数组 存入message
message.setFileBytes(fileBytes);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 关闭流
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
// 发送message 给服务端
ClientConnectThread thread = ClientConnectThreadManage.getThread(senderId, getterId);
MyObjectOutputStream oos =
new MyObjectOutputStream(thread.getSocket().getOutputStream());
oos.writeObject(message);
// 发送成功 打印
println(senderId + "(我) 发送文件:\t\t " + new Date().toString());
println(" 路径为: " + srcPath + "\n");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 将内容输出到 chatFrame窗口面板
public void println(String s) {
if (s != null) {
chatFrame.getTxt_Chat().setText(chatFrame.getTxt_Chat().getText() + s + "\n");
System.out.println(s + "\n");
}
}
}
//多线程
public class ClientConnectThreadManage {
// 4.0 线程管理更新
// 将多个线程 放入 HashMap集合, key为用户id value 为线程
private static HashMap<String, HashMap<String, ClientConnectThread>> map = new HashMap<>();
// 一个用户的线程集合 状态 对应线程
private static HashMap<String, ClientConnectThread> stateMap = new HashMap<>();
public static HashMap<String, HashMap<String, ClientConnectThread>> getMap() {
return map;
}
public static HashMap<String, ClientConnectThread> getStateMap() {
return stateMap;
}
// 存放线程 进入集合的方法
public static void addThread(String userId, String state, ClientConnectThread thread) {
stateMap.put(state, thread);
map.put(userId, stateMap);
}
// 根据userId 返回线程
public static ClientConnectThread getThread(String userId, String state) {
return map.get(userId).get(state);
}
// 从集合中删除 某个线程对象
public static void removeThread(String userId) {
map.remove(userId);
}
}
个人总结
通过此次课程设计,使课堂上的理论知识与实践结合起来,有一定的满足感,使我受益匪浅。尽管其中有许多难以克服的困难,但通过不懈的努力,最终还是克服困难,与团队成员共同协作完成了此次课程设计。