⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 server.java

📁 实现多人即时聊天
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
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 + -