servicepane.java
来自「一个简单的程序稳操胜券用拖把有稳操胜券」· Java 代码 · 共 967 行 · 第 1/3 页
JAVA
967 行
LoginUser loginUser = (LoginUser)message.getObj();
String inputPassword = loginUser.getPassword();
int jqnum = loginUser.getJqnum();
UserDAOByFile userDAO = new UserDAOByFile();
try {
User user = userDAO.findById(jqnum);
JQMessage loginResult = new JQMessage();
//用户存在
if(user!=null){
if(user.getPassword().equals(inputPassword)){
this.jqnum = jqnum;
//正确登陆
//检测用户是否已经登陆,若已登陆,将之前的登陆用户下线。
if(isHasLoged(jqnum))
letClientLogout(jqnum, client.getInetAddress().toString());
//更改用户状态
//System.out.println("状态:"+loginUser.getState());
user.setState(loginUser.getState());
userDAO.update(user);
//发送用户的好友的状态.
loginResult.setType(21);
Vector<FriendUser> friends = new Vector<FriendUser>();
FriendUser SelfUser = new FriendUser();
SelfUser.setJqnum(user.getJqnum());
SelfUser.setNickName(user.getNickname());
SelfUser.setPhoto(user.getPhoto());
SelfUser.setSignature(user.getSignature());
SelfUser.setState(user.getState());
friends.add(SelfUser);
Vector<Integer> listFriend = user.getListFriend();
//System.out.println(listFriend.size());
for(int i=0;i<listFriend.size();i++){
Integer friend_jqnum = listFriend.get(i);
User friend_user = userDAO.findById(friend_jqnum);
if(friend_user!=null){
FriendUser friendUser = new FriendUser();
friendUser.setJqnum(friend_user.getJqnum());
friendUser.setNickName(friend_user.getNickname());
friendUser.setPhoto(friend_user.getPhoto());
friendUser.setSignature(friend_user.getSignature());
friendUser.setState(friend_user.getState());
friends.add(friendUser);
}
}
loginResult.setObj(friends);
//向table中添加该用户
if(writeToClient(loginResult))
table.put(user.getJqnum(), this);
else
return;
//通知好友,我上线了
writeLog(getLog(user, "用户登录"));
telFriendState(user);
//检测是否存在好友的留言,发送过去给用户。
RecordDAOByFile recordDAO = new RecordDAOByFile();
Vector<Record> v = recordDAO.findLeaveRecord(jqnum);
try {
if(v!=null){
for(Record record:v)
sendRecordToClient(this, record);
recordDAO.deleteRecordForAdmin(jqnum);
//System.out.println(recordDAO.deleteRecordForAdmin(jqnum));
}
} catch (RuntimeException e) {
writeLog(getLog(user, "发送留言给用户时发生错误:"+e.getMessage()));
}
}else{
//密码错误
loginResult.setType(22);
loginResult.setObj("错误的登陆密码["+loginUser.getJqnum()+"]");
writeToClient(loginResult);
writeLog(getLoginLog(loginUser, "错误的用户["+loginUser.getJqnum()+"]登录密码"));
closeClient();
}
}else{
//不存在的用户.
loginResult.setType(22);
loginResult.setObj("不存在的用户["+loginUser.getJqnum()+"]");
writeToClient(loginResult);
writeLog(getLoginLog(loginUser, "不存在的用户["+loginUser.getJqnum()+"]登录"));
closeClient();
}
} catch (ClassNotFoundException e) {
writeSysLog("错误:"+e.getMessage());
} catch (FileNotFoundException e) {
writeSysLog("错误:"+e.getMessage());
} catch (IOException e) {
writeSysLog("错误:"+e.getMessage());
}
}else{
writeSysLog("客户端"+getClientIP()+"发送错误的数据信息到服务端");
closeClient();
}
}
/**
* 告诉当前用户的好友自己的状态。
* @param user 当前用户.
* @throws FileNotFoundException 程序运行异常将抛出此异常。
* @throws IOException 程序运行异常将抛出此异常。
* @throws ClassNotFoundException 程序运行异常将抛出此异常。
*/
private void telFriendState(User user) throws FileNotFoundException, IOException, ClassNotFoundException{
FriendUser meState = new FriendUser();
meState.setJqnum(user.getJqnum());
meState.setState(user.getState());
meState.setNickName(user.getNickname());
meState.setPhoto(user.getPhoto());
meState.setSignature(user.getSignature());
JQMessage friendLogin = new JQMessage();
friendLogin.setType(25);
friendLogin.setObj(meState);
Vector<Integer> listFriend = user.getListFriend();
//UserDAOByFile userDAO = new UserDAOByFile();
for(int i=0;i<listFriend.size();i++){
Integer friend_jqnum = listFriend.get(i);
/*User friend_user = userDAO.findById(friend_jqnum);
if((state==UserState.ONLINESTATE.getState() || state==UserState.BUSYSTATE.getState() || state==UserState.DEPARTURESTATE.getState()) && isHasLoged(friend_jqnum) && friend_user.getState()!=UserState.OFFLIENSTATE.getState()){
writeToClient(friendLogin);
}*/
if(isHasLoged(friend_jqnum)){
ClientLink client = table.get(friend_jqnum);
client.writeToClient(friendLogin);
}
}
}
/**
* 想客户端发送消息。
* @param message JQMessage对象。
* @return 返回发送成功否。
*/
public boolean writeToClient(JQMessage message){
/* if(oos!=null){
try {
oos.writeObject(message);
oos.flush();
return true;
} catch (IOException e) {
writeSysLog("向客户端["+client.getLocalAddress().toString()+":"+client.getLocalPort()+"]发送数据失败!");
return false;
}
}else
return false;*/
new ClientWrite(this,message).start();
return true;
}
/**
* 根据User的情况和日志内容获得日志对象。
* @param user User对象。
* @param what 日志内容。
* @return 返回日志对象。
*/
public Log getLog(User user,String what){
Log log = new Log();
log.setUserid(user.getJqnum());
log.setIp(client.getLocalAddress().toString());
log.setNickname(user.getNickname());
log.setTime(new Date());
log.setUserid(user.getJqnum());
log.setWhat(what);
return log;
}
/**
* 根据FriendUser的情况和日志内容获得日志对象。
* @param user FriendUser对象。
* @param what 日志内容。
* @return 返回日志对象。
*/
public Log getLog(FriendUser user,String what){
Log log = new Log();
log.setUserid(user.getJqnum());
log.setIp(client.getLocalAddress().toString());
log.setNickname(user.getNickName());
log.setTime(new Date());
log.setUserid(user.getJqnum());
log.setWhat(what);
return log;
}
/**
* 根据LoginUser和日志内容返回日志对象。
* @param user LoginUser对象。
* @param what 日志内容。
* @return 返回日志对象。
*/
private Log getLoginLog(LoginUser user,String what){
Log log = new Log();
log.setNickname("未知用户");
log.setUserid(user.getJqnum());
log.setIp(client.getLocalAddress().toString());
log.setTime(new Date());
log.setWhat(what);
return log;
}
/**
* 更新用户的状态。
* @param jqnum jq号码。
* @param state 用户的当前状态。
*/
private void updateUserState(int jqnum,int state){
UserDAOByFile userDAO = new UserDAOByFile();
User user = userDAO.findById(jqnum);
if(user!=null){
try {
user.setState(state);
userDAO.update(user);
} catch (FileNotFoundException e) {
writeLog(getLog(user, "更改用户状态时发生错误:"+e.getMessage()));
} catch (IOException e) {
writeLog(getLog(user, "更改用户状态时发生错误:"+e.getMessage()));
}
}
}
}
/**
* 客户端的输出线程类。
* 2008-9-27
* @author 达内科技[Tarena Training Group]
* @version 1.0
* @since JDK1.6(建议)
*/
private class ClientWrite extends Thread{
private ClientLink clientLink;
private JQMessage message;
public ClientWrite(ClientLink clientLink,JQMessage message) {
this.clientLink = clientLink;
this.message = message;
}
public void run() {
if(clientLink.oos!=null){
try {
clientLink.oos.writeObject(message);
clientLink.oos.flush();
} catch (IOException e) {
writeSysLog("向客户端"+clientLink.getClientIP()+"发送数据失败!");
}
}
}
}
/**
* 检测jqnum用户是否已经登陆。
* @param jqnum
* @return 返回用户是否登陆否。
*/
private boolean isHasLoged(int jqnum){
return table.containsKey(jqnum);
}
/**
* 断开和服务端的连接。
* @param jqnum
* @param ip
*/
private void letClientLogout(int jqnum,String ip){
if(isHasLoged(jqnum)){
ClientLink clientLink = table.get(jqnum);
JQMessage message = new JQMessage();
message.setType(23);
message.setObj("您的账号在别处[IP:"+ip+"]登录,程序将退出!");
clientLink.writeToClient(message);
table.remove(jqnum);
clientLink.closeClient();
}
}
/**
* 客户端异常发生和服务端断开连接时,清空table中断开的客户端~~,这是绝对的需要处理的。
* @param client
*/
private void removeClientForException(ClientLink client){
if(client!=null && table!=null && table.contains(client)){
Enumeration<Integer> en = table.keys();
while(en.hasMoreElements()){
Integer jqnum = en.nextElement();
if(table.get(jqnum).equals(client) || table.get(jqnum)==client){
table.remove(jqnum);
//更改用户状态
client.updateUserState(jqnum, UserState.OFFLIENSTATE.getState());
break;
}
}
}
}
/**
* 广播系统消息。
* @param msg 消息内容
* @return 返回广播成功否。
*/
public static boolean broadcast(String msg){
if(isServiceRun){
JQMessage message = new JQMessage();
message.setType(91);
message.setObj(" 系统消息:"+msg+"\n[该消息发布于"+DateDeal.getCurrentTime()+"]");
Enumeration<ClientLink> en = table.elements();
while(en.hasMoreElements()){
en.nextElement().writeToClient(message);
}
return true;
}else{
JOptionPane.showMessageDialog(null, "系统服务未启动,无法发送广播!");
return false;
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?