📄 server.java
字号:
public void DBUpdate(){//定时调用
UserInfo tempUser; //原来是User类型
Message tempmsg;
Iterator tempForeachUser;
String temphashkey;
AllUserskeys=new HashSet(AllUsers.keySet());
tempForeachUser=AllUserskeys.iterator();
try{
synchronized(AllUsers){
for(;tempForeachUser.hasNext();){
temphashkey=(String)tempForeachUser.next();
tempUser=(UserInfo)AllUsers.get(temphashkey);
UserStatement.executeUpdate("UPDATE UserInfo set lastDate=\'"+tempUser.getstrDate()+
"\' where RegName=\'"+tempUser.getRegName()+"\'");
UserStatement.executeUpdate("UPDATE UserInfo set IpAddr=\'"+tempUser.getIpAddr()+
"\' where RegName=\'"+tempUser.getRegName()+"\'");
UserStatement.executeUpdate("UPDATE UserInfo set Port=\'"+Integer.toString(tempUser.getPort())+
"\' where RegName=\'"+tempUser.getRegName()+"\'");
/*
UserStatement.executeUpdate("UPDATE UserInfo set EMail=\'"+tempUser.getEMail()+
"\' where RegName=\'"+tempUser.getRegName()+"\'");
UserStatement.executeUpdate("UPDATE UserInfo set Tel=\'"+tempUser.getTel()+
"\' where RegName=\'"+tempUser.getRegName()+"\'");
*/
}//for(;tempForeachUser.hasNext();)
}//synchronized(AllUsers)
System.out.println("in DBUpdate()用户列表已经成功更新到数据库");
synchronized(Messagelist){
MsgStatement.executeUpdate("delete from Message");
System.out.println("in DBUpdate()数据库中留言列表已经成功删除");
for(int i=0;i<Messagelist.size();i++){
tempmsg=(Message)Messagelist.get(i);
MsgStatement.executeUpdate("insert into Message values(\'"+tempmsg.getfromName()+"\',\'"+tempmsg.gettoName()+"\',\'"
+CharConvert.GB2312toUnicode(tempmsg.getMsg())+"\',\'"
+tempmsg.getstrDate()+"\')");
}//for(int i=0;i<Messagelist.size();i++)
System.out.println("in DBUpdate()留言列表已经成功更新到数据库");
//对于已经传送的留言将从Messagelist删除所以更新时不会再出现在数据库中
//对于没有传送的留言因为还在Messagelist所以没传出的仍会写到数据库中
// where RegName=\'"+tempUser.getRegName()+"\'");
}//synchronized(Messagelist)
}catch(UnsupportedEncodingException e){
System.out.println("in DBUpdate() 不支持的字符集");
}catch(SQLException e){
System.out.println("in DBUpdate() 数据库修改异常");
}
}//public void DBUpdate()
public void DBUpdate(User NewUserInfo){
try{
System.out.println("in DBUpdate(User NewUserInfo) 准备修改信息到数据库 用户名 "+NewUserInfo.getRegName());
System.out.println("in DBUpdate(User NewUserInfo) 准备修改信息到数据库 真实姓名 "+NewUserInfo.getUserName());
System.out.println("in DBUpdate(User NewUserInfo) 准备修改信息到数据库 密码 "+NewUserInfo.getPassword());
System.out.println("in DBUpdate(User NewUserInfo) 准备修改信息到数据库 职位 "+NewUserInfo.getJob());
UserStatement.executeUpdate("UPDATE UserInfo set Job=\'"+NewUserInfo.getJob()+
"\' where RegName=\'"+NewUserInfo.getRegName()+"\'");
UserStatement.executeUpdate("UPDATE UserInfo set Password=\'"+NewUserInfo.getPassword()+
"\' where RegName=\'"+NewUserInfo.getRegName()+"\'");
UserStatement.executeUpdate("UPDATE UserInfo set UserName=\'"+NewUserInfo.getUserName()+
"\' where RegName=\'"+NewUserInfo.getRegName()+"\'");
/*
UserStatement.executeUpdate("UPDATE UserInfo set EMail=\'"+NewUserInfo.getEMail()+
"\' where RegName=\'"+NewUserInfo.getRegName()+"\'");
UserStatement.executeUpdate("UPDATE UserInfo set Tel=\'"+NewUserInfo.getTel()+
"\' where RegName=\'"+NewUserInfo.getRegName()+"\'");
*/
System.out.println("in DBUpdate(User NewUserInfo)用户列表已经成功修改到数据库");
}catch(SQLException e){
System.out.println("in DBUpdate(User NewUserInfo) 数据库修改异常");
}
}//public void DBUpdate(User NewUserInfo)
public void DBInsert(UserInfo userinfo){
//userinfo//添加到数据库
try{
//(RegName,UserName,Password,Sex,Department,Job,Tel,EMail,IpAddr,Port,lastDate)
//UserStatement.executeUpdate("insert into UserInfo(RegName,UserName,Sex,Password,IpAddr,Port,Job,lastDate,EMail,Tel) values (\"cs\",\"ceshi\",\"female\",\"111\",\"192.168.0.22\",\"50\",\"zhiwei\",\"Sep 16, 2006 1:14:45 AM\",\"xx@njust.edu.cn\",\"02584319999\")");
UserStatement.executeUpdate("insert into UserInfo (RegName,UserName,Password,IpAddr,Port,Job,Sex,lastDate) values(\'"+userinfo.getRegName()
+"\',\'"+CharConvert.GB2312toUnicode(userinfo.getUserName())+"\',\'"+userinfo.getPassword()
+"\',\'"+userinfo.getIpAddr()+"\',\'"+userinfo.getstrPort()
+"\',\'"+CharConvert.GB2312toUnicode(userinfo.getJob())+"\',\'"+userinfo.getStrSex()
+"\',\'"+userinfo.getstrDate()+"\')");
/*
String regname="name";
userinfo.setUserName("Name");
userinfo.setPassword("111");
UserStatement.executeUpdate("INSERT INTO UserInfo values(\'"+regname
+"\',\'"+CharConvert.GB2312toUnicode(userinfo.getUserName())+"\',\'"+userinfo.getPassword()+"\')");
*/
}catch(UnsupportedEncodingException e){
System.out.println("in DBUpdate() 使用了系统不支持的字符集");
}catch(SQLException e){
System.out.println("in void DBInsert(UserInfo userinfo) 数据库修改异常");
}
//run()调用之
}//public void DBInsert(UserInfo userinfo)
public void DBInsert(PublicMessage pubmsg){//共加了4个CharConvert.GB2312toUnicode()
//pubmsg//添加到数据库
try{
MsgStatement.executeUpdate("INSERT INTO PublicMessage values(\'"+CharConvert.GB2312toUnicode(pubmsg.getPubMsg())
+"\',\'"+pubmsg.getSenderName()+"\',\'"+pubmsg.getstrDate()+"\')");
}catch(UnsupportedEncodingException e){
System.out.println("in DBUpdate() 不支持的字符集");
}catch(SQLException e){
System.out.println("in void DBInsert(UserInfo userinfo) 数据库修改异常");
}
//PubMsgdispatch()调用之
}//public void DBInsert(PublicMessage pubmsg)
/****************************************************上面的数据库写入为完成****************************************************/
public void run(){
try{
System.out.println("Server's listener thread start");
UPDateTimer=new Timer(10000,new ActionListener(){
public void actionPerformed(ActionEvent evt){
DBUpdate();
}//public void actionPerformed(ActionEvent evt)
});
UPDateTimer.start();
while(true){
Csocket=welcome.accept();
Certifing(Csocket);//用户验证
System.out.println("in server run()");
//System.out.println("in server run() CSThreads.size()="+CSThreads.size());
//System.out.println("in server run() CSThreadskeys.size()="+CSThreadskeys.size());
System.out.println("等待下一个连接:");
}//while(true)
}//try
catch(IOException e){
System.out.println("客户端连接失败");//若不作处理将不会再有客户能连接近来
}
}//public void run()
public void Certifing(Socket Csocket){
UserInfo tempUserInfo;
try{
StreamOut=new ObjectOutputStream(Csocket.getOutputStream());
StreamIn=new ObjectInputStream(Csocket.getInputStream());
char RegOrLogin;
RegOrLogin=StreamIn.readChar();
yourself=(UserInfo)StreamIn.readObject();
System.out.println("连入的客户端用户信息:");
yourself.display();
if(RegOrLogin=='R'){
if(AllUsers.get(yourself.getRegName())!=null){//返回!=null,说明该注册名已经有人使用返回'N'
StreamOut.writeChar('N');
StreamOut.flush();
StreamOut.close();
StreamIn.close();
Csocket.close();
return;
}else{
DBInsert(yourself);//添入数据库
Initing(yourself);//yourself在这里已经刷新到AllUsers中了
}
}else{//if(RegOrLogin=='L')
tempUserInfo=(UserInfo)AllUsers.get(yourself.getRegName());
if(tempUserInfo==null){//输入的用户名不在数据库的纪录中,说明输入有误返回'N'
StreamOut.writeChar('N');
StreamOut.flush();
StreamOut.close();
StreamIn.close();
Csocket.close();
return;
}//if(tempUserInfo==null)
else{//if(tempUserInfo!=null)
if(yourself.getPassword().equals(tempUserInfo.getPassword())){
//对于已注册用户登录只有IP,Port和日期(Init()中改)需要修改,其余基本信息不变,
//因为在客户端对于已经注册的用户也创建新UserInfo对象,而这个UserInfo对象得性别恒为男职务恒为空字符串,
//破坏了原有数据,所以这里只改这个三项
tempUserInfo.setIpAddr(yourself.getIpAddr());
tempUserInfo.setPort(yourself.getPort());
Initing(tempUserInfo);//tempUserInfo在这里已经刷新到AllUsers中了
}//密码正确
else{//密码错误
StreamOut.writeChar('N');
StreamOut.flush();
StreamOut.close();
StreamIn.close();
Csocket.close();
return;
}//密码错误
}//if(tempUserInfo!=null)
}//if(RegOrLogin=='L')
serverthread=new ServerThread(this,
switchthread,
yourself,
Csocket,
StreamOut,
StreamIn);
CSThreads.put(yourself.getRegName(),serverthread);
serverframe.CurConNum(++CurConNum);
switchthread.OnUserReceiver(yourself.getUser());
}catch(IOException e){}//初始化客户端时出错忽略
catch(ClassNotFoundException e){}
}//public void Certifing(Socket Csocket)
public void Initing(UserInfo tempUserInfo) throws IOException{
Message tempmsg;
PublicMessage tempPubMsg;
Iterator tempForeach;
String temphashkey;
System.out.println("in Initing()");
System.out.println("刷新UserInfo 信息");
tempUserInfo.setOnlineState(true);
tempUserInfo.setDate(System.currentTimeMillis());
this.yourself=tempUserInfo;
AllUsers.put(tempUserInfo.getRegName(),tempUserInfo);//刷新AllUsers?
System.out.println("UserInfo 信息刷新完毕");
StreamOut.writeChar('Y');
StreamOut.flush();
System.out.println("控制字符'Y'已经发送");
System.out.println("开始传输公告");
//System.out.println("公告数目="+PublicMessagelist.size());
for(int i=0;i<PublicMessagelist.size();i++){//传输公告
tempPubMsg=(PublicMessage)PublicMessagelist.get(i);
//System.out.print("读出一个公告==null? ");
//System.out.println(tempPubMsg==null);
//tempPubMsg.display();
//tempUserInfo.display();//能显示表示tempUserInfo!=null
//if(tempPubMsg.getDate().after(tempUserInfo.getDate())){
StreamOut.writeChar('C');
StreamOut.flush();
StreamOut.writeObject(tempPubMsg);
System.out.println("成功传输了一个公告");
//}//公告在上次退出后发布
}//for//传输公告
System.out.println("公告传输完毕");
System.out.println("开始传输留言");
//System.out.println("留言数目="+Messagelist.size());
for(int i=0;i<Messagelist.size();i++){//传输留言
tempmsg=(Message)Messagelist.get(i);
//System.out.println("读出一个留言==null?"+tempmsg==null);
//tempmsg.display();
if(tempmsg.gettoName().equals(tempUserInfo.getRegName())){
Messagelist.remove(i);
StreamOut.writeChar('M');
StreamOut.flush();
StreamOut.writeObject(tempmsg);
System.out.println("成功传输了一个留言");
}
//Messagelist.remove(i);
//remove后能减轻服务器的负担
i--;//remove()后面的条目下标前移1,所以i--
}//传输留言
System.out.println("留言传输完毕");
System.out.println("开始传输用户");
//传输所有用户
AllUserskeys=new HashSet(AllUsers.keySet());
tempForeach=AllUserskeys.iterator();
for(;tempForeach.hasNext();){
temphashkey=(String)tempForeach.next();
StreamOut.writeChar('F');
StreamOut.flush();
//System.out.println("读出并传输一个用户");
StreamOut.writeObject((UserInfo)AllUsers.get(temphashkey));
System.out.println("成功传输了一个用户");
}//传输所有用户
System.out.println("用户传输完毕");
//传输完毕
StreamOut.writeChar('E');
StreamOut.flush();
System.out.println("初始化信息全部传输完毕,已经向客户端发送结束标志字符'E'");
}//public void Initing(UserInfo tempUserInfo) throws IOException
public static void main(String args[]){
new Server();
}//main()
}//class Server
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -