servicepane.java
来自「一个简单的程序稳操胜券用拖把有稳操胜券」· Java 代码 · 共 967 行 · 第 1/3 页
JAVA
967 行
break;
case 30:
dealMessage(message);
break;
case 40:
dealFindOnlineUserNum();
break;
case 42:
dealFindOnlineUser();
break;
case 44:
dealAddUser(message);
break;
}
}
}else
writeSysLog("客户端"+getClientIP()+"发送错误的数据信息到服务端");
}
} catch (IOException e) {
//逻辑的慎密~~这里容易忽略
removeClientForException(this);
closeClient();
} catch (ClassNotFoundException e) {
removeClientForException(this);
closeClient();
}
}else{
writeSysLog("注意:系统暂不支持数据库方式!请使用文件方式保存数据!");
letClientQuit();
}
}
/**
* 获取客户端IP
* @return 返回字符串的IP。
*/
private String getClientIP(){
return client==null?"[客户端已关闭,不能获取信息]":"["+client.getInetAddress().toString()+":"+client.getPort()+"]";
}
/**
* 使得客户端下线。
*/
private void letClientQuit(){
JQMessage message = new JQMessage();
message.setType(90);
message.setObj("和服务端断开连接");
writeToClient(message);
closeClient();
}
/**
* 关闭和客户端的连接
*/
private void closeClient(){
String ip = getClientIP();
writeSysLog(DateDeal.getCurrentTime()+",客户端"+getClientIP()+"下线.");
try {
if(oos!=null)oos.close();oos = null;
if(ois!=null)ois.close();ois = null;
if(client!=null)client.close();client=null;
} catch (IOException e) {
writeSysLog(DateDeal.getCurrentTime()+",关闭到客户端"+ip+"的连接时时发生错误:"+e.getMessage());
}
}
/**
* 处理客户端退出消息。
* @param message JQMessage对象。
*/
private void dealQuit(JQMessage message){
Object obj = message.getObj();
if(obj instanceof FriendUser){
FriendUser user = (FriendUser)obj;
writeLog(getLog(user, "用户退出"));
}
updateUserState(jqnum, UserState.OFFLIENSTATE.getState());
UserDAOByFile userDAO = new UserDAOByFile();
try {
telFriendState(userDAO.findById(jqnum));
} catch (FileNotFoundException e) {
} catch (IOException e) {
} catch (ClassNotFoundException e) {}
table.remove(jqnum);
closeClient();
}
/**
* 处理注册新用户。
* @param message JQMessage对象。
*/
private void dealAddUser(JQMessage message){
if(message.getObj() instanceof Integer){
int jqnum = (Integer)message.getObj();
JQMessage message2 = new JQMessage();
boolean b = eachAddFriend(jqnum);
if(b){
message2.setType(45);
message2.setObj("恭喜好友添加成功!");
}else{
message2.setType(46);
message2.setObj("抱歉好友添加失败!");
}
writeToClient(message2);
UserDAOByFile userDAO = new UserDAOByFile();
User user = userDAO.findById(jqnum);
User self = userDAO.findById(this.jqnum);
if(user!=null)
telfriendOnline(this.jqnum, user);
if(self!=null)
telfriendOnline(jqnum, self);
}
}
/**
* 告诉好友我的状态。
* @param jqnum jq号码。
* @param user User对象。
*/
private void telfriendOnline(int jqnum,User user){
if(isHasLoged(jqnum)){
JQMessage message = new JQMessage();
FriendUser friendUser = new FriendUser();
friendUser.setJqnum(user.getJqnum());
friendUser.setNickName(user.getNickname());
friendUser.setPhoto(user.getPhoto());
friendUser.setSignature(user.getSignature());
friendUser.setState(user.getState());
message.setType(25);
message.setObj(friendUser);
table.get(jqnum).writeToClient(message);
}
}
/**
* 相互添加好友。
* @param jqnum jq号码。
* @return 然会添加成功否。
*/
private boolean eachAddFriend(int jqnum){
UserDAOByFile userDAO = new UserDAOByFile();
User user = userDAO.findById(jqnum);
User self = userDAO.findById(this.jqnum);
if(user!=null && self!=null){
Vector<Integer> v = user.getListFriend();
//好友不存在好友列表的情况下再添加
if(!v.contains(this.jqnum)){
v.add(this.jqnum);
user.setListFriend(v);
writeLog(getLog(user, " 用户["+user.getNickname()+"("+user.getJqnum()+")]添加好友["+self.getNickname()+"("+self.getJqnum()+")]"));
try {
userDAO.update(user);
} catch (FileNotFoundException e) {
writeLog(getLog(user, " 用户["+user.getNickname()+"("+user.getJqnum()+")]添加好友["+self.getNickname()+"("+self.getJqnum()+")]时发生错误:"+e.getMessage()));
return false;
} catch (IOException e) {
writeLog(getLog(user, " 用户["+user.getNickname()+"("+user.getJqnum()+")]添加好友["+self.getNickname()+"("+self.getJqnum()+")]时发生错误:"+e.getMessage()));
return false;
}
}
Vector<Integer> v2 = self.getListFriend();
if(!v2.contains(jqnum)){
v2.add(jqnum);
self.setListFriend(v2);
writeLog(getLog(user, " 用户["+self.getNickname()+"("+self.getJqnum()+")]添加好友["+user.getNickname()+"("+user.getJqnum()+")]"));
try {
userDAO.update(self);
} catch (FileNotFoundException e) {
v.remove(this.jqnum);
user.setListFriend(v);
try {
userDAO.update(user);
} catch (FileNotFoundException e1) {} catch (IOException e1) {}
writeLog(getLog(self, " 用户["+self.getNickname()+"("+self.getJqnum()+")]添加好友["+user.getNickname()+"("+user.getJqnum()+")]时发生错误:"+e.getMessage()));
return false;
} catch (IOException e) {
v.remove(this.jqnum);
user.setListFriend(v);
try {
userDAO.update(user);
} catch (FileNotFoundException e1) {} catch (IOException e1) {}
writeLog(getLog(self, " 用户["+self.getNickname()+"("+self.getJqnum()+")]添加好友["+user.getNickname()+"("+user.getJqnum()+")]时发生错误:"+e.getMessage()));
return false;
}
}
return true;
}else
return false;
}
/**
* 传输当前的在线用户FriendUser。
*/
private void dealFindOnlineUser(){
UserDAOByFile userDAO = new UserDAOByFile();
Enumeration<Integer> en = table.keys();
while(en.hasMoreElements()){
int jqnum = en.nextElement();
if(jqnum!=this.jqnum){
User user = userDAO.findById(jqnum);
if(user!=null && !user.getListFriend().contains(this.jqnum)){
FriendUser friendUser = new FriendUser();
friendUser.setJqnum(jqnum);
friendUser.setPhoto(user.getPhoto());
friendUser.setNickName(user.getNickname());
friendUser.setSignature(user.getSignature());
friendUser.setState(user.getState());
JQMessage message = new JQMessage();
message.setType(43);
message.setObj(friendUser);
writeToClient(message);
}
}
}
}
/**
* 传输当前在线用户数。
*/
private void dealFindOnlineUserNum(){
JQMessage message = new JQMessage();
message.setType(41);
message.setObj(table.size());
writeToClient(message);
}
/**
* 处理客户端发送过来的消息。
* @param message 发送过来的消息。
* @throws FileNotFoundException 发送给好友失败时抛出此异常。
* @throws IOException 发送给好友失败是抛出此异常。
*/
private void dealMessage(JQMessage message) throws FileNotFoundException, IOException{
if(message.getObj() instanceof Record){
Record record = (Record)message.getObj();
record.setSendTime(new Date());
int jqnum = record.getToid();
//发送消息的好友是否检测在线
//System.out.println("新消息"+record);
if(isHasLoged(jqnum)){
ClientLink client = table.get(jqnum);
sendRecordToClient(client, record);
}else{
record.setRead(false);
record.setReadTime(new Date());
record.setSendTime(new Date());
RecordDAOByFile recordDAO = new RecordDAOByFile();
recordDAO.addRecordForAdmin(record);
}
}else
writeSysLog("客户端"+getClientIP()+"发送错误的数据信息["+message.getObj()+"]到服务端");
}
/**
* 发送消息到客户端。
* @param client 发送的目标Socket
* @param record 发送的记录
* @throws FileNotFoundException 发送失败抛出此异常
* @throws IOException 发送失败抛出此异常
*/
private void sendRecordToClient(ClientLink client,Record record) throws FileNotFoundException, IOException{
JQMessage message = new JQMessage();
message.setType(31);
message.setObj(record);
if(client.writeToClient(message)){
record.setRead(true);
record.setReadTime(new Date());
}else{
record.setRead(false);
RecordDAOByFile recordDAO = new RecordDAOByFile();
recordDAO.addRecordForAdmin(record);
}
}
/**
* 处理注册用户。
* @param message JQMessage对象。
* @throws FileNotFoundException
* @throws IOException
*/
private void dealRegiter(JQMessage message) throws FileNotFoundException, IOException{
if(message.getObj() instanceof User){
User user = (User)message.getObj();
JQCreater creater = new JQCreater();
int id = creater.createID();
int num = creater.createJQ();
creater.saveIDJQ(id, num);
user.setId(id);
user.setJqnum(num);
user.setRegisterTime(new Date());
UserDAOByFile userDAO = new UserDAOByFile();
boolean b =userDAO.add(user);
eachAddFriend(JQServer.manager);
JQMessage regResult = new JQMessage();
if(b){
regResult.setType(11);
RegUser regUser = new RegUser();
regUser.setJqnum(user.getJqnum());
regUser.setNickname(user.getNickname());
regUser.setRealname(user.getRealname());
regUser.setPassword(user.getPassword());
regResult.setObj(regUser);
writeLog(getLog(user,"新用户注册成功!"));
}else{
regResult.setType(12);
regResult.setObj(null);
writeLog(getLog(user,"用户注册失败!"));
}
writeToClient(regResult);
}else{
writeSysLog("客户端"+getClientIP()+"发送错误的数据信息到服务端");
}
//closeClient();
}
/**
* 处理用户登陆。
* @param message JQMessage对象。
*/
private void DealLogin(JQMessage message){
//用户登陆
if(message.getObj() instanceof LoginUser){
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?