您的位置:首页 > 其它

6.面向对象程序设计(1)

2015-06-14 22:38 99 查看


com.langsin.LZChat.client 项目的代码



首先是client包的

1.ClientConServer.java

package client;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;

import model.ToolsCreateMsg;
import model.ToolsParseMsg;
import msg.MsgHead;
import msg.MsgLogin;
import msg.MsgLoginResp;
import msg.MsgReg;
import msg.MsgRegResp;
import msg.MsgType;
import tools.LogTools;

/***
* 客户端与服务器的即时通信模块
*
* @author Administrator
* 1.登陆,注册接口调用;
* 2.在独立线程中接收服务器消息
* 3.将接受到的信息交给ManageUI管理
*/
public class ClientConServer extends Thread {

private static ClientConServer ccs; // 本类单实例对象
private Socket client; // 与服务器连接对象
private DataOutputStream dous; // 输出流对象
private DataInputStream dis; // 输入流对象

private ArrayList<ClientMsgListener> listeners = new ArrayList<ClientMsgListener>();

/** 不需要创建对象,所以构造器私有 */
private ClientConServer() {
}

public static ClientConServer getCcs() {
if (null == ccs)
ccs = new ClientConServer();
return ccs;
}

/** 连结上服务器, 返回是否连结成功 */
public boolean ConServer() {
try {
client = new Socket(MsgType.serverIP, MsgType.serverPort);
this.dous = new DataOutputStream(client.getOutputStream());
this.dis = new DataInputStream(client.getInputStream());
return true;
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;

}

/**
* 注册服务器
*
* @param pwd
* @param nickname
* @param sex
* @param icon
* @return 注册结果 -1 失败 其他事注册到的qq号
*/
public int regServer(String pwd, String nickname, String sex, byte icon) {
try {
MsgReg mr = new MsgReg();
mr.setTotalLen(4 + 1 + 4 + 4 + 10 + 10 + 10 + 1);
mr.setType(MsgType.command_reg);
mr.setDest(MsgType.SERVER_QQ_NUMBER);
mr.setSrc(0);
mr.setNickname(nickname);
mr.setPwd(pwd);
mr.setSex(sex);
mr.setIcon(icon);
this.sendMsg(mr);

MsgRegResp mrr = (MsgRegResp) readFromServer();
LogTools.INFO(this.getClass(), mrr.toString());
if (mrr.getState() == 0)
return mrr.getDest();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return -1;

}

/**
* 登陆到服务器
*
* @param qq
* @param pwd
* @return 是否登陆成功
*/
public boolean loginServer(int qq, String pwd) {
try {
MsgLogin ml = new MsgLogin();
ml.setTotalLen(4 + 1 + 4 + 4 + 10);
ml.setType(MsgType.command_login);
ml.setDest(MsgType.SERVER_QQ_NUMBER);
ml.setSrc(qq);
ml.setPwd(pwd);
ml.setQq(qq);
this.sendMsg(ml);

MsgLoginResp mlr = (MsgLoginResp) readFromServer();
LogTools.INFO(this.getClass(), mlr.toString());
if (mlr.getState() == 0) {
return true;
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return false;
}

@Override
public void run() {

while (true) {
try {
MsgHead msg = readFromServer();
for (ClientMsgListener listener : listeners) {
System.out.println("run"+msg.getType());
listener.dealMsg(msg);
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
break;
}
}

}

/**
* 加入到监听列表中
* @param lisetener
*/
public void addMsgListener(ClientMsgListener lisetener){
this.listeners.add(lisetener);
}

/**
* 从监控列表中删除
* @param lisetener
*/
public void removwMsgListenner(ClientMsgListener lisetener){
this.listeners.remove(lisetener);
}
/*
* 下面是各个界面中写入类属性的代码 (不应在此处)
*
*/

//	public static void Find(){
//
//		//command_find
//		MsgHead msg = new MsgHead();
//		msg.setTotalLen(4+1+4+4);
//		msg.setSrc(ClientConServer.ownerQQ);
//		msg.setDest(MsgType.SERVER_QQ_NUMBER);
//		msg.setType(MsgType.command_find);
//
//		//command_addFriend
//		MsgAddFriend  maf = new MsgAddFriend();
//		maf.setTotalLen(4+1+4+4+30+4);
//		maf.setSrc(ClientConServer.ownerQQ);
//		maf.setDest(要加的人的qq);
//		maf.setType(MsgType.command_addFriend);
//		maf.setNote("备注");
//		maf.setFriendQq(要加的人的qq);
//
//		//command_addYouResp
//		MsgAddYouResp mayr = new MsgAddYouResp();
//		mayr.setTotalLen(4+1+4+4+1);
//		mayr.setSrc(ClientConServer.ownerQQ);
//		mayr.setDest(要加你的人的qq);
//		mayr.setType(MsgType.command_addYouResp);
//		mayr.setState((byte)0同意  1不同意);
//
//		//command_chatText  command_chatFile(最后再说)
//		MsgChatText mct = new MsgChatText();
//		int changdu = content.getBytes().size(); //计算String的字节长度
//		mct.setTotalLen(4+1+4+4+20+changdu);
//		mct.setSrc(ClientConServer.ownerQQ);
//		mct.setDest(要加你的人的qq);
//		mct.setType(MsgType.command_chatText);
//		mct.setContent(content);  //content是要发送的字符串
//		mct.setTime("时间  字符串类型  最长20字节");
//
//
//		//最后都调用 ClientConServer的发送方法(sendMse)将类发给服务器
//
//	}

/**
* 从输入流上读取一条服务器端发来的消息 这个方法会阻塞,必须在独立线程中
*
* @return:读取到的消息对象
*/
public MsgHead readFromServer() throws Exception {
int totalLen = dis.readInt();
LogTools.INFO(this.getClass(), "客户端读到消息总长为:" + totalLen);
byte[] data = new byte[totalLen - 4];
dis.readFully(data); // 读取数据块
MsgHead msg = ToolsParseMsg.parseMsg(data);// 解包为消息对象
LogTools.INFO(this.getClass(), "客户端收到消息:" + msg);
return msg;
}

/** 发送一条消息到服务器的方法 */
public void sendMsg(MsgHead msg) throws Exception {
LogTools.INFO(this.getClass(), "客户端发出消息:" + msg);
byte[] data = ToolsCreateMsg.packMsg(msg);// 打包对象为数据块
this.dous.write(data);// 发送
this.dous.flush();
}

// 关闭与一个客户机的连结
public void closeMe() {
try {
this.client.close();
} catch (Exception ef) {
}
}

}


2.ClientMsgListener.java

package client;

import msg.MsgHead;

/***
* 接受消息的接口
* @author Administrator
*
*/
public interface ClientMsgListener {

/**
* 从服务器接收到的一条信息
*/
public void dealMsg(MsgHead msg);
}


3.ManageUI

package client;

import java.util.HashMap;

import javax.swing.JFrame;

import msg.MsgAddFriendResp;
import msg.MsgAddYou;
import msg.MsgChatFile;
import msg.MsgChatText;
import msg.MsgFindResp;
import msg.MsgHead;
import msg.MsgTeamList;
import msg.MsgType;

public class ManageUI {

// 聊天界面  String是  “本人qq 他人qq”
private static HashMap<String, JFrame> chats = new HashMap<String, JFrame>();

//得到服务器的数据
public static void getMsg(MsgHead msg){
switch (msg.getType()) {
case MsgType.command_teamList:
MsgTeamList mtl = (MsgTeamList) msg;

break;
case MsgType.command_chatText:
MsgChatText mct = (MsgChatText) msg;
// 在此处新建聊天窗口 并加入到chats里

break;
case MsgType.command_chatFile:
MsgChatFile mcf = (MsgChatFile) msg;
// 同上 暂时未做 最后再说
break;
case MsgType.command_find_resp:
MsgFindResp mfr = (MsgFindResp) msg;
// 此处新建 查询好友列表

break;
case MsgType.command_addFriend_Resp:
MsgAddFriendResp mafr = (MsgAddFriendResp) msg;
// 新建添加成功界面

break;
case MsgType.command_addYou:
MsgAddYou may = (MsgAddYou) msg;
// 新建 有人添加你的界面

break;
case MsgType.command_onLine:
// 提示好友上线
// 此处调用一个 QqClientFriendsList类里的方法 该方法改变界面的显示
break;
case MsgType.command_offLine:
// 提示好友下线 同上
break;
default:
break;
}
}
}


model包的

1.TeamInfo.java

package model;

import java.io.Serializable;
import java.util.ArrayList;

/***
* 好友分组
* @author Administrator
*
*/
@SuppressWarnings("serial")
public class TeamInfo implements Serializable{

private int id;                    //分组id
private String name;            //分组名字
private int ownerUser;            //所有者
//在此分组内的好友列表
private ArrayList<UserInfo> friendList = new ArrayList<UserInfo>();

public TeamInfo(int id, String name, int ownerUser) {
this.id = id;
this.name = name;
this.ownerUser = ownerUser;
}
/**
* 为此分组加入一个成员
* @param info
*/
public void addFriend(UserInfo info){
this.friendList.add(info);
}

public TeamInfo(String name) {
this.name = name;
}

//get set 方法
public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getOwnerUser() {
return ownerUser;
}

public void setOwnerUser(int ownerUser) {
this.ownerUser = ownerUser;
}

public ArrayList<UserInfo> getFriendList() {
return friendList;
}

public void setFriendList(ArrayList<UserInfo> friendList) {
this.friendList = friendList;
}

}


2.ToolsCreateMsg.java

package model;

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.ArrayList;

import msg.MsgAddFriend;
import msg.MsgAddFriendResp;
import msg.MsgAddYou;
import msg.MsgAddYouResp;
import msg.MsgChatFile;
import msg.MsgChatText;
import msg.MsgFindResp;
import msg.MsgHead;
import msg.MsgLogin;
import msg.MsgLoginResp;
import msg.MsgPerData;
import msg.MsgReg;
import msg.MsgRegResp;
import msg.MsgTeamList;
import msg.MsgType;
import tools.LogTools;

/***
* 打包消息
* @author Administrator
*
*/
public class ToolsCreateMsg {

/**
* 将消息对象打包成字节数组返回
* @param msg   要打包的消息对象
* @return      返回的字节数组
* @throws IOException
*/
public static byte[] packMsg(MsgHead msg) throws IOException{
ByteArrayOutputStream bous = new ByteArrayOutputStream();
DataOutputStream dous = new DataOutputStream(bous);
writeHead(dous, msg);
int msgType = msg.getType();

switch (msgType) {
//注册
case MsgType.command_reg:
MsgReg mr = (MsgReg)msg;
writeString(dous, 10, mr.getNickname());
writeString(dous, 10, mr.getPwd());
writeString(dous, 10, mr.getSex());
dous.writeByte((byte)mr.getIcon());
break;
//注册应答
case MsgType.command_reg_resp:
MsgRegResp mrr = (MsgRegResp)msg;
dous.writeByte(mrr.getState());
break;
//登陆
case MsgType.command_login:
MsgLogin ml = (MsgLogin) msg;
writeString(dous, 10, ml.getPwd());
break;
//登陆应答
case MsgType.command_login_resp:
MsgLoginResp mlr = (MsgLoginResp) msg;
dous.writeByte(mlr.getState());
break;
//好友列表
case MsgType.command_teamList:
MsgTeamList mtl = (MsgTeamList)msg;
ArrayList<TeamInfo> teams = mtl.getTeamList();
int listCount = teams.size();
dous.writeInt(listCount);         //写入分组个数
for (TeamInfo teamInfo : teams) {
writeString(dous, 10, teamInfo.getName());  //写入分组名字
ArrayList<UserInfo> users = teamInfo.getFriendList();
dous.writeByte(users.size());                //写入一个分组的成员个数
for (UserInfo userInfo : users) {
dous.writeInt(userInfo.getQq());                //写入qq号
writeString(dous, 10, userInfo.getNickname());  //写入昵称
writeString(dous, 10, userInfo.getSex());        //写入性别
dous.writeByte(userInfo.getIcon());             //写入头像

dous.writeByte(userInfo.getOnLine());           //写入是否在线
}
}
break;
//返回在线qq号码
case MsgType.command_find_resp:
MsgFindResp mfr = (MsgFindResp)msg;
ArrayList<UserInfo> users = mfr.getUsers();
dous.writeInt(users.size());                         //写入在线qq的数量
for (UserInfo userInfo : users) {
dous.writeInt(userInfo.getQq());                 //写入qq 昵称  性别  头像
writeString(dous, 10, userInfo.getNickname());
writeString(dous, 10, userInfo.getSex());
dous.writeByte(userInfo.getIcon());
}
//            for (int i = 0; i < count; i++) {
//                UserInfo userInfo = users.get(i);
//                dous.writeInt(userInfo.getQq());
//                writeString(dous, 10, userInfo.getNickname());
//                writeString(dous, 10, userInfo.getSex());
//            }
break;
//添加好友
case MsgType.command_addFriend:
MsgAddFriend maf = (MsgAddFriend) msg;
dous.writeInt(maf.getFriendQq());
writeString(dous, 30, maf.getNote());      //!!!!!!30字节长度!!!!!!
break;
//添加好友应答
case MsgType.command_addFriend_Resp:
MsgAddFriendResp magr = (MsgAddFriendResp) msg;
dous.writeByte(magr.getState());             //对方是否同意
dous.writeInt(magr.getQq());                 //对方qq
writeString(dous, 10, magr.getNickName());   //对方昵称
writeString(dous, 10, magr.getSex());        //对方的性别
dous.writeByte(magr.getIcon());
break;
//有人添加你为好友
case MsgType.command_addYou:
MsgAddYou may = (MsgAddYou) msg;
writeString(dous, 10, may.getNickname());       //昵称
writeString(dous, 10, may.getSex());           //性别
writeString(dous, 30, may.getNote());          //备注信息
break;
//有人添加你为好友  的  回复
case MsgType.command_addYouResp:
MsgAddYouResp mayr = (MsgAddYouResp) msg;
dous.writeByte(mayr.getState());
break;
//聊天信息
case MsgType.command_chatText:
MsgChatText mct = (MsgChatText) msg;
writeString(dous, 20, mct.getTime());
dous.write(mct.getContent().getBytes());
break;
//文件传输
case MsgType.command_chatFile:
MsgChatFile mcf = (MsgChatFile) msg;
writeString(dous, 20, mcf.getTime());
writeString(dous, 256, mcf.getFileName());
dous.write(mcf.getFileData());
break;
case MsgType.command_perdata:
MsgPerData mpd = (MsgPerData) msg;
writeString(dous, 10, mpd.getNickname());
writeString(dous, 10, mpd.getSex());
dous.writeByte(mpd.getIcon());
break;
//返回在线qq号码请求
case MsgType.command_find:
case MsgType.command_onLine:
case MsgType.command_offLine:
case MsgType.command_vibration:
break;
default:
String logMsg="创建未知消息类型,无法打包:type:"+msgType;
LogTools.ERROR(ToolsCreateMsg.class, logMsg);    //记录日志
break;
}
dous.flush();
byte[] data = bous.toByteArray();
return data;
}

/**
* 向流中写入消息头信息
* @param dous   要写入的流对象
* @param msg    消息头对象
* @throws IOException
*/
public static void writeHead(DataOutputStream dous,MsgHead msg) throws IOException{
dous.writeInt(msg.getTotalLen());
dous.writeByte(msg.getType());
dous.writeInt(msg.getSrc());
dous.writeInt(msg.getDest());
}

/**
* 向流中写入len长的字符串
* @param dous    要写入的输出流
* @param len        要写入字符串的长度
* @param s            要写入的字符串
* @throws IOException
*/
public static void writeString(DataOutputStream dous,int len,String s) throws IOException{
byte[] data = s.getBytes();
if(data.length>len)
throw new IOException("写入长度为:"+len+",文本过长!");
dous.write(data);
while(len>data.length){//如果短,需要补0
dous.writeByte('\0');  //补二进制的0
len--;
}
}
}


3.ToolsParseMsg.java

package model;

import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.util.ArrayList;

import msg.MsgAddFriend;
import msg.MsgAddFriendResp;
import msg.MsgAddYou;
import msg.MsgAddYouResp;
import msg.MsgChatFile;
import msg.MsgChatText;
import msg.MsgFindResp;
import msg.MsgHead;
import msg.MsgLogin;
import msg.MsgLoginResp;
import msg.MsgPerData;
import msg.MsgReg;
import msg.MsgRegResp;
import msg.MsgTeamList;
import msg.MsgType;
import tools.LogTools;

/***
* 解包消息
*
* @author Administrator
*
*/
public class ToolsParseMsg {

public static MsgHead parseMsg(byte[] data) throws IOException {
int totalLen = data.length + 4; // 算出消息总长
ByteArrayInputStream bis = new ByteArrayInputStream(data);
DataInputStream dis = new DataInputStream(bis);
byte msgType = dis.readByte();
int src = dis.readInt();
int dest = dis.readInt();
MsgHead msgHead = new MsgHead();
msgHead.setTotalLen(totalLen);
msgHead.setType(msgType);
msgHead.setSrc(src);
msgHead.setDest(dest);
//根据类型进行判断
switch (msgType) {
//注册
case MsgType.command_reg:
MsgReg mr = new MsgReg();
copyHead(msgHead, mr);
String nickname = readString(dis, 10);
mr.setNickname(nickname);
String pwd = readString(dis, 10);
mr.setPwd(pwd);
String sex = readString(dis, 10);
mr.setSex(sex);
byte icon = dis.readByte();
mr.setIcon(icon);
return mr;
//注册应答
case MsgType.command_reg_resp:
MsgRegResp mrr = new MsgRegResp();
copyHead(msgHead, mrr);
mrr.setState(dis.readByte());
return mrr;
//登陆
case MsgType.command_login:
MsgLogin ml = new MsgLogin();
copyHead(msgHead, ml);
ml.setPwd(readString(dis, 10));
return ml;
//登陆应答
case MsgType.command_login_resp:
MsgLoginResp mlr = new MsgLoginResp();
copyHead(msgHead, mlr);
mlr.setState(dis.readByte());
return mlr;
//好友列表
case MsgType.command_teamList:
MsgTeamList mtl  =new MsgTeamList();
copyHead(msgHead, mtl);
int listCount = dis.readInt();  //得到分组个数
ArrayList<TeamInfo> teamList = new ArrayList<TeamInfo>();
for (int i = 0; i < listCount; i++) {
String groupName = readString(dis, 10);   //得到某一分组名字
TeamInfo teamInfo = new TeamInfo(groupName);
byte usersCount = dis.readByte();  //得到某一分组的成员个数
for (int j = 0; j < usersCount; j++) {
int qq  = dis.readInt();                            //得到qq号码
String nickname2 = readString(dis, 10);             //得到昵称
String sex2 = readString(dis, 10);                 //得到性别
byte teamList_icon = dis.readByte();             //得到头像

byte onLine = dis.readByte();                    //得到是否在线
UserInfo userInfo = new UserInfo(qq, nickname2, sex2);
userInfo.setOnLine(onLine);
userInfo.setIcon(teamList_icon);
teamInfo.addFriend(userInfo);
}
teamList.add(teamInfo);
}
mtl.setTeamList(teamList);
return mtl;
//在线qq列表  返回
case MsgType.command_find_resp:
MsgFindResp mfr = new MsgFindResp();
copyHead(msgHead, mfr);
int count = dis.readInt();
for (int i = 0; i < count; i++) {
int qq = dis.readInt();
String nickName = readString(dis, 10);
String mfr_sex = readString(dis, 10);
byte find_resp_icon = dis.readByte();
UserInfo userInfo = new UserInfo(qq, nickName, mfr_sex);
userInfo.setIcon(find_resp_icon);
mfr.addQq(userInfo);
}
return mfr;
//添加好友  请求
case MsgType.command_addFriend:
MsgAddFriend maf = new MsgAddFriend();
copyHead(msgHead, maf);
maf.setFriendQq(dis.readInt());
String note = readString(dis, 30);    //!!!!!!30字节长度!!!!!!
maf.setNote(note);
return maf;
//添加好友 回复
case MsgType.command_addFriend_Resp:
MsgAddFriendResp mafr = new MsgAddFriendResp();
copyHead(msgHead, mafr);
mafr.setState(dis.readByte());
mafr.setQq(dis.readInt());
String nickName = readString(dis, 10);
mafr.setNickName(nickName);
String addFriend_Resp_sex = readString(dis, 10);    //性别
mafr.setSex(addFriend_Resp_sex);
mafr.setIcon(dis.readByte());
return mafr;
//有人添加你为好友
case MsgType.command_addYou:
MsgAddYou may = new MsgAddYou();
copyHead(msgHead, may);
String addYou_nickname = readString(dis, 10);
may.setNickname(addYou_nickname);
String addYou_sex = readString(dis, 10);                 //性别
may.setSex(addYou_sex);
String addYou_note = readString(dis, 30);                  //备注
may.setNote(addYou_note);
return may;
//有人添加你为好友  的  回复
case MsgType.command_addYouResp:
MsgAddYouResp mayr = new MsgAddYouResp();
copyHead(msgHead, mayr);
mayr.setState(dis.readByte());
return mayr;
//聊天信息
case MsgType.command_chatText:
MsgChatText mct = new MsgChatText();
copyHead(msgHead, mct);
String time = readString(dis, 20);
mct.setTime(time);
int len = totalLen-4-1-4-4-20;
String chat = readString(dis, len);
mct.setContent(chat);
return mct;
//文件传输
case MsgType.command_chatFile:
MsgChatFile mcf = new MsgChatFile();
copyHead(msgHead, mcf);
String chatFile_time = readString(dis, 20);
mcf.setTime(chatFile_time);
String fileName = readString(dis, 256);
mcf.setFileName(fileName);
int filelen = totalLen-4-1-4-4-256-20;
byte[] fileData = new byte[filelen];
dis.readFully(fileData);
mcf.setFileData(fileData);
return mcf;
case MsgType.command_perdata:
MsgPerData mpd = new MsgPerData();
copyHead(msgHead, mpd);
String perdata_nickname = readString(dis, 10);
mpd.setNickname(perdata_nickname);
String perdata_sex = readString(dis, 10);
mpd.setSex(perdata_sex);
mpd.setIcon(dis.readByte());
return mpd;
//返回在线qq号码请求
case MsgType.command_find:
case MsgType.command_onLine:
case MsgType.command_offLine:
case MsgType.command_vibration:
return msgHead;
default:
String logMsg = "解包未知消息类型,无法解包:type:" + msgType;
LogTools.ERROR(ToolsParseMsg.class, logMsg);   //记录日志信息
break;
}

return null;

}

/**
* 复制消息头的数据
* @param head   消息头
* @param dest   要复制到的对象
*/
public static void copyHead(MsgHead head,MsgHead dest){
dest.setTotalLen(head.getTotalLen());
dest.setType(head.getType());
dest.setSrc(head.getSrc());
dest.setDest(head.getDest());
}

/**
* 从流中读取len长度的字节
* @param dous    流数据
* @param len     长度
* @throws IOException
*/
public static String readString(DataInputStream dis,int len) throws IOException{
byte[] data = new byte[len];
dis.readFully(data);
return new String(data);
}
}


4.UserDao.java

package model;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

import tools.LogTools;

/***
* 数据存储
* @author Administrator
*
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public class UserDao {

private static int maxQQNumber = 1000;
private static final String dbFileName = "qq.dat";
private static Map<Integer, UserInfo> userDB = new HashMap<Integer,UserInfo>();

static{
try {
File file = new File(dbFileName);
if(file.exists()&&!file.isDirectory()){
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
userDB = (Map)ois.readObject();
LogTools.INFO(UserDao.class, "从数据文件读取数据成功!");
}else{
LogTools.ERROR(UserDao.class, "不存在数据文件,创建空表");
}

} catch (Exception e) {
// TODO: handle exception
}
}

//用户登录
public static UserInfo checkLogin(int qq,String pwd){
UserInfo user = userDB.get(qq);
if(null!=user && pwd.equals(user.getPwd())){
LogTools.INFO(UserDao.class, "登录成功!");
return user;
}
LogTools.ERROR(UserDao.class, "登录失败!");
return null;
}

//注册用户
public static int regUser(String pwd,String nickname,String sex){
if(userDB.size()>0){
maxQQNumber = Collections.max(userDB.keySet());
}
maxQQNumber++;
UserInfo user = new UserInfo(maxQQNumber);
user.setPwd(pwd);
user.setNickname(nickname);
user.setSex(sex);
userDB.put(maxQQNumber, user);
saveDB();
return maxQQNumber;
}

//将内存中的数据保存到文件中
private static void saveDB(){
try {
ObjectOutputStream ois = new ObjectOutputStream(new FileOutputStream(dbFileName));
ois.writeObject(userDB);
ois.close();
LogTools.INFO(UserDao.class, "刷新数据文件成功!");
} catch (Exception e) {
LogTools.ERROR(UserDao.class, "刷新数据文件失败:"+e);
}
}

/**
* 根据qq号码  得到用户的信息
* @param qq           qq号码
* @return              用户的信息
*/
public static UserInfo getUserInfo(int qq){
return userDB.get(qq);
}

/**
* 添加好友的数据库操作
* @param qq1
* @param qq2             相互添加好友的号码
* @param groupName1
* @param groupName2    分别加入的群组
*/
public static void addFriend(int qq1,int qq2,String groupName1,String groupName2){
UserInfo user1 = getUserInfo(qq1);
UserInfo user2 = getUserInfo(qq2);
//暂时默认添加到好友队列
user1.getTeams().get(0).addFriend(user2);
user2.getTeams().get(0).addFriend(user1);
//保存
saveDB();
}
}


5.UserInfo.java

package model;

import java.io.Serializable;
import java.util.ArrayList;

/***
* 用户类
* @author Administrator
*
*/
@SuppressWarnings("serial")
public class UserInfo implements Serializable{

private int qq;                                //qq号码
private String pwd;                               //密码
private String nickname;                       //用户昵称
private String sex;                            //用户性别
private byte icon;                               //头像

private byte onLine = 1;                       //用户是否在线                 默认为1  即不在线

private ArrayList<TeamInfo> teams = new ArrayList<TeamInfo>();        //好友列表

public UserInfo(int qq){
this.qq = qq;
init();
}

public UserInfo(int qq,String nickname,String sex){
this.qq = qq;
this.nickname = nickname;
this.sex = sex;
init();
}

//初始化用户
public void init(){
TeamInfo team1,team2,team3;
team1= new TeamInfo(0, "我的好友", this.qq);
team2= new TeamInfo(1, "陌生人", this.qq);
team3= new TeamInfo(2, "黑名单", this.qq);
this.teams.add(team1);
this.teams.add(team2);
this.teams.add(team3);
}

public void addTeam(TeamInfo team){
this.teams.add(team);
}

//get set 方法

public int getQq() {
return qq;
}

public byte getIcon() {
return icon;
}

public void setIcon(byte icon) {
this.icon = icon;
}

public byte getOnLine() {
return onLine;
}

public void setOnLine(byte onLine) {
this.onLine = onLine;
}

public String getSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}

public void setQq(int qq) {
this.qq = qq;
}

public String getPwd() {
return pwd;
}

public void setPwd(String pwd) {
this.pwd = pwd;
}

public String getNickname() {
return nickname;
}

public void setNickname(String nickname) {
this.nickname = nickname;
}

public ArrayList<TeamInfo> getTeams() {
return teams;
}

public void setTeams(ArrayList<TeamInfo> teams) {
this.teams = teams;
}

@Override
public String toString() {
return "UserInfo [qq=" + qq + ", nickname=" + nickname + ", sex=" + sex
+ ", icon=" + icon + "]";
}

}


msg包代码

package msg;
/***
* 消息:添加好友
*       friendQq  此属性暂时没有作用
* @author Administrator
*
*/
public class MsgAddFriend extends MsgHead{

private int friendQq;   //好友qq号码
private String note;    //备注                     30字节长度!!!!!!!!!!!!

public String getNote() {
return note;
}

public void setNote(String note) {
this.note = note;
}

public int getFriendQq() {
return friendQq;
}

public void setFriendQq(int friendQq) {
this.friendQq = friendQq;
}

@Override
public String toString() {
String head = super.toString();
return head+"MsgAddFriend [friendQq=" + friendQq + ", note=" + note
+ "]";
}

}


package msg;
/***
* 消息:好友添加    应答
* @author Administrator
*
*/
public class MsgAddFriendResp extends MsgHead{

private byte state;     //是否同意
private int qq;            //好友qq号
private String nickName;   //好友昵称
private String sex;        //好友性别
private byte icon;

public byte getIcon() {
return icon;
}
public void setIcon(byte icon) {
this.icon = icon;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public byte getState() {
return state;
}
public void setState(byte state) {
this.state = state;
}
public int getQq() {
return qq;
}
public void setQq(int qq) {
this.qq = qq;
}

public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
@Override
public String toString() {
String head = super.toString();
return head+"MsgAddFriendResp [state=" + state + ", qq=" + qq
+ ", nickName=" + nickName + ", sex=" + sex + ", icon=" + icon
+ "]";
}

}


package msg;
/**
* 消息: 有人添加你
* @author Administrator
*
*/
public class MsgAddYou extends MsgHead{

private String nickname;           //要添加你的人的昵称
private String sex;                //要添加你的人的性别
private String note;               //验证信息

public String getSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}

public String getNickname() {
return nickname;
}

public void setNickname(String nickname) {
this.nickname = nickname;
}

public String getNote() {
return note;
}

public void setNote(String note) {
this.note = note;
}

@Override
public String toString() {
String head = super.toString();
return head+"MsgAddYou [nickname=" + nickname + ", sex=" + sex + ", note="
+ note + "]";
}

}


package msg;
/***
* 消息:发送聊天文本
* @author Administrator
*
*/
public class MsgChatText extends MsgHead{

private String time;                 //发送时间                   20
private String content;              //聊天信息

public String getTime() {
return time;
}

public void setTime(String time) {
this.time = time;
}

public String getContent() {
return content;
}

public void setContent(String content) {
this.content = content;
}

@Override
public String toString() {
String head = super.toString();
return head+"MsgChatText [time=" + time + ", content=" + content + "]";
}

}


package msg;

import java.util.Arrays;

/***
* 消息:文件传输
* @author Administrator
*
*/
public class MsgChatFile extends MsgHead{

private String time;            //发送时间                                 20
private String fileName;        //文件名字
private byte[] fileData;        //文件内容

public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public byte[] getFileData() {
return fileData;
}
public void setFileData(byte[] fileData) {
this.fileData = fileData;
}

@Override
public String toString() {
String head = super.toString();
return head+"MsgChatFile [fileName=" + fileName + ", fileData="
+ Arrays.toString(fileData) + "]";
}

}


package msg;
/**
* 消息:有人添加你    回复
* @author Administrator
*
*/
public class MsgAddYouResp extends MsgHead{

private byte state;         //是否同意添加你为好友

public byte getState() {
return state;
}

public void setState(byte state) {
this.state = state;
}

@Override
public String toString() {
String head = super.toString();
return head+"MsgAddYouResp [state=" + state + "]";
}

}


package msg;
/***
* 定义通讯用到的常量
* @author Administrator
*
*/
public interface MsgType {

String serverIP = "localhost";
int serverPort = 9999;
int SERVER_QQ_NUMBER = 10000;

//客户端请求操作的 成功与否
int state_success = 0;
int state_false = 1;

//消息类型的定义
byte command_reg = 0X01;             //注册账号
byte command_reg_resp = 0X02;        //注册账号应答

byte command_login=0x03;			//登陆请求消息
byte command_login_resp=0x4;		//登陆应答消息
byte command_teamList=0x05;			//服务器发送在线好友列表
byte command_perdata=0x16;          //个人信息

byte command_onLine=0x06;			//服务器发送好友上线消息*无消息体
byte command_offLine=0x07;			//服务器发送好友下线消息*无消息体

byte command_chatText=0x08;			//聊天消息发送
byte command_chatFile=0x09;			//文件传送发送

byte command_find=0x10;				//查找用户请求 *无消息体
byte command_find_resp=0x11;		//查找好友请求应答

byte command_addFriend=0x12;		//添加好友请求
byte command_addFriend_Resp=0x13;	//添加好友应答

byte command_addYou=0x14;           //添加你为好友
byte command_addYouResp=0x15;       //添加你为好友  的  回复

byte command_vibration=0x17;        //发送震动窗口
}


package msg;

import java.util.ArrayList;

import model.TeamInfo;

/**
* 好友分组信息
* @author Administrator
*
*/
public class MsgTeamList extends MsgHead{
//存放好友的队列
private ArrayList<TeamInfo> teamList = new ArrayList<TeamInfo>();

public ArrayList<TeamInfo> getTeamList() {
return teamList;
}

public void setTeamList(ArrayList<TeamInfo> teamList) {
this.teamList = teamList;
}

@Override
public String toString() {
@SuppressWarnings("unused")
String head = super.toString();
return "MsgTeamList [teamList=" + teamList + "]";
}

}


package msg;
/***
* 消息:用户注册	应答
* @author Administrator
*
*/
public class MsgRegResp extends MsgHead{
private byte state;     ////注册状态

@Override
public String toString() {
String head = super.toString();
return head+"MsgRegResp [state=" + state + "]";
}

public byte getState() {
return state;
}

public void setState(byte state) {
this.state = state;
}

}


package msg;
/***
* 消息:用户注册
* @author Administrator
*
*/
public class MsgReg extends MsgHead{

private String pwd;         //用户密码
private String nickname;    //用户昵称
private String sex;			//用户性别
private byte icon;			//头像

@Override
public String toString() {
String head = super.toString();
return head+"MsgReg [pwd=" + pwd + ", nickname=" + nickname + ", sex=" + sex
+ ", icon=" + icon + "]";
}

public byte getIcon() {
return icon;
}

public void setIcon(byte icon) {
this.icon = icon;
}

public String getSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}

public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}

}


package msg;
/***
* 登陆成功后   返回个人信息
* @author Administrator
*
*/
public class MsgPerData extends MsgHead{

private String nickname;
private String sex;
private byte icon;

public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public byte getIcon() {
return icon;
}
public void setIcon(byte icon) {
this.icon = icon;
}

@Override
public String toString() {
String head = super.toString();
return head+"MsgPerData [nickname=" + nickname + ", sex=" + sex + ", icon="
+ icon + "]";
}

}


package msg;
/***
* 消息:登录  应答
* @author Administrator
*
*/
public class MsgLoginResp extends MsgHead{

private byte state;        ///登陆状态 0:成功 其它:失败代码

@Override
public String toString() {
String head = super.toString();
return head+"MsgLoginResp [state=" + state + "]";
}

public byte getState() {
return state;
}

public void setState(byte state) {
this.state = state;
}

}


package msg;
/***
* 消息:用户登录
* @author Administrator
*
*/
public class MsgLogin extends MsgHead{
private int qq;          //账号
private String pwd;			//密码

public int getQq() {
return qq;
}
public void setQq(int qq) {
this.qq = qq;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public String toString() {
String head = super.toString();
return head+"MsgLogin [qq=" + qq + ", pwd=" + pwd + "]";
}

}


package msg;
/***
* 所有消息的头部
* @author Administrator
*
*/
public class MsgHead {

private int totalLen;//消息总长度
private byte type;   //消息类型
private int src;     //发送用户的号码
private int dest;	 //目标用户的号码

@Override
public String toString() {
return "MsgHead [totalLen=" + totalLen + ", type=" + type + ", src="
+ src + ", dest=" + dest + "]";
}

//get set 方法

public int getTotalLen() {
return totalLen;
}
public void setTotalLen(int totalLen) {
this.totalLen = totalLen;
}
public byte getType() {
return type;
}
public void setType(byte type) {
this.type = type;
}
public int getSrc() {
return src;
}
public void setSrc(int src) {
this.src = src;
}
public int getDest() {
return dest;
}
public void setDest(int dest) {
this.dest = dest;
}

}


package msg;

import java.util.ArrayList;

import model.UserInfo;

/***
* 消息:放回在线的所有qq号码
* @author Administrator
*
*/
public class MsgFindResp extends MsgHead{

//在线列表
private ArrayList<UserInfo> users = new ArrayList<UserInfo>();

//向在线列表中添加
public void addQq(UserInfo user){
this.users.add(user);
}

public ArrayList<UserInfo> getUsers() {
return users;
}

@Override
public String toString() {
String head = super.toString();
return head+"MsgFindResp [users=" + users + "]";
}

}


tools包

package tools;

import java.awt.*;
import javax.swing.*;

@SuppressWarnings("serial")
public class RoundButton extends JButton {
public RoundButton(String label) {
super(label); // 调用父类构造函数
setContentAreaFilled(false); // 不自行绘制按钮背景
} // 绘制圆和标签

protected void paintComponent(Graphics g) {
if (getModel().isArmed()) { // 鼠标点击时
g.setColor(Color.lightGray); // 颜色为灰色
} else {
g.setColor(getBackground()); // 置按钮颜色
}
g.fillOval(0, 0, getSize().width, getSize().height); // 绘制圆
super.paintComponent(g); // 调用父类函数,绘制其余部分
}

// 绘制边框
protected void paintBorder(Graphics g) {
g.setColor(getForeground()); // 设置边框颜色
g.drawOval(0, 0, getSize().width - 1, getSize().height - 1); // 在边界上绘制一个椭圆
}
}


package tools;

import java.util.Random;

public class RandomGetYanzheng {
Random ran;
String str;
String yanzhengma;
public String randomGetFiveBitYanzheng() {
ran = new Random();
str = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ";
yanzhengma = "";
for (int i = 0; i < 5; i++) {
//			System.out.println("随机出来的下标是:" + ran.nextInt(36));
//			System.out.println("对应下标的数是:" + str.charAt(ran.nextInt(36)));
yanzhengma = yanzhengma + str.charAt(ran.nextInt(36));
}
System.out.println(yanzhengma);
return yanzhengma;

}
public void changeGetFiveBitYanzheng() {
ran = new Random();
str = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ";
yanzhengma = "";
for (int i = 0; i < 5; i++) {
yanzhengma = yanzhengma + str.charAt(ran.nextInt(36));
}

}

public static void main(String[] args) {
new RandomGetYanzheng().randomGetFiveBitYanzheng();
}
}


package tools;

public class MyMouseEvent {
/**
*
* @Title: getMouseEvent
* @Description: TODO(传入鼠标X,Y坐标以及图片的X,Y坐标 以确定鼠标事件的范围)
* @param @param mouseX 鼠标的X坐标
* @param @param mouseY 鼠标的Y坐标
* @param @param imageX 图片的X坐标
* @param @param imageY 图片的Y坐标
* @param @return flag 鼠标是否存在此区?
* @return boolean 返回类型
* @throws
*/
public static boolean getMouseEvent(int mouseX, int mouseY, int imageX,
int imageY) {
boolean flag;

if (mouseX >= imageX && mouseX <= imageX + 78 && mouseY >= imageY
&& mouseY <= imageY + 44) {
flag = true;
} else {
flag = false;
}
return flag;
}

}


package tools;

import java.text.SimpleDateFormat;
import java.util.Date;

/***
* 系统日志记录工具类
*
* @author Administrator
*
*/
public class LogTools {

private static boolean isDebug = true; // 是否打印标志

// 禁止输出日志信息
public static void disDebug() {
isDebug = false;
}

/**
* 记录一般日志信息
*
* @param c
*            消息所在类
* @param msg
*            消息对象
*/
public static void INFO(@SuppressWarnings("rawtypes") Class c, Object msg) {
if (!isDebug)
return;
SimpleDateFormat sdf = new SimpleDateFormat("HH-mm-ss");
String t = sdf.format(new Date());
System.out.println("INFO:" + t + "	" + c.getSimpleName() + "	" + msg);
}

/**
* 记录出错日志信息
*
* @param c
*            消息所在类
* @param msg
*            消息对象
*/
public static void ERROR(@SuppressWarnings("rawtypes") Class c, Object msg) {
if (!isDebug)
return;
SimpleDateFormat sdf = new SimpleDateFormat("hh-FF-ss");
String t = sdf.format(new Date());
System.out.println("INFO:" + t + "	" + c.getSimpleName() + "	" + msg);
}
}


package tools;

import java.util.Random;

import javax.swing.JFrame;

public class Dancing implements Runnable {
JFrame wind = null;
Random rd = new Random();

public JFrame getWind() {
return wind;
}

public void setWind(JFrame wind) {
this.wind = wind;
}

public Dancing(JFrame wind) {
this.wind = wind;
}

@SuppressWarnings("static-access")
public void run() {

for (int i = 0; i < 8; i++) {
wind.setLocation(450 + rd.nextInt(15), 130 + rd.nextInt(15));
try {
Thread.currentThread().sleep(100);

} catch (Exception e) {
e.printStackTrace();
}

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: