QQ聊天室

个人完成部分

总功能描述

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);
	}
}

个人总结

通过此次课程设计,使课堂上的理论知识与实践结合起来,有一定的满足感,使我受益匪浅。尽管其中有许多难以克服的困难,但通过不懈的努力,最终还是克服困难,与团队成员共同协作完成了此次课程设计。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值