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

📄 server.java

📁 实现多人即时聊天
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
import java.io.*;
import java.net.*;
import java.sql.*;
import java.util.Hashtable;
import java.util.Set;
import java.util.Vector;
import java.util.LinkedList;
import java.util.HashSet;
import java.util.Iterator;

import javax.swing.Timer;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

/**********************Server中与数据库通信的方法*********************************************/
//public Server()
//public void DBUpdate()
//public void DBInsert(UserInfo userinfo)
//public void DBInsert(PublicMessage pubmsg)
/**********************Server中与数据库通信的方法*********************************************/
public class Server implements Runnable{

	//
	private ServerLoginDiag SLoginDiag;
	private String SerAdminPassword;	//保存服务器端用户密码
	private String AdminName;		//保存服务器端用户名

	private Hashtable AllUsers;	//所有用户 UserInfo
	private Hashtable CSThreads;	//在线用户
	private HashSet AllUserskeys;	//登陆时会用到
	private HashSet CSThreadskeys;	//交给SwitchThread使用

	private SwitchThread switchthread;

	private File ServerInfo;
	private DataOutputStream ToFile;

	private UserInfo yourself;		//临时存放当前登录者信息
	private ServerThread serverthread;	//临时存放当前登录者信息
	private Timer UPDateTimer;
	private static int CurConNum=0;

	//队列
	private Vector PublicMessagelist;
	private LinkedList Messagelist;

	private ServerSocket welcome;
	private Socket Csocket;

	//流
	private ObjectOutputStream StreamOut;
	private ObjectInputStream StreamIn;

	//服务器端主界面
	private ServerFrame serverframe;

	//数据库相关
    	private Statement UserStatement,MsgStatement,PubMsgStatement,ServerLogStatement;
  	private Connection conDataBase;
	private ResultSet UserDatas,MsgDatas,PubMsgDatas,ServerLogDatas;

	public Server(){
		
	

	AllUsers=new Hashtable();	//所有用户
	CSThreads=new Hashtable();	//在线用户
	AllUserskeys=new HashSet(AllUsers.keySet());	//登陆时会用到

	//AllUserskeys=new HashSet(AllUsers.entrySet());
	CSThreadskeys=new HashSet(CSThreads.keySet());	//交给SwitchThread使用
	//CSThreadskeys=new HashSet(CSThreads.entrySet());
	
	//队列
	PublicMessagelist=new Vector();
	Messagelist=new LinkedList();
	


	try{
		
		
		//加载数据库驱动程序

/**************************MYSQL**********************************************************/
	//	Class.forName("org.gjt.mm.mysql.Driver");//.newInstance();//throws ClassNotFoundException
	//	Class.forName("com.mysql.jdbc.Driver");//.newInstance();
	//	System.out.println("驱动加载成功");
	//	/*public static Connection getConnection(String url) throws SQLException*/
	//	String url="jdbc:mysql://localhost:3306/Com?user=root&password=root & useUnicode=true & characterEncoding=gb2312/";
	//	Com数据库的名称
	//	user=root	访问数据库的用户名
	//	password=root	访问数据库的密码
	//	gb2312		使用的字符集
	//	
      	//	conDataBase =DriverManager.getConnection(url);
	//	System.out.println("数据库连接成功");
/**************************MYSQL**********************************************************/


/**************************MS Access**********************************************************/
//		Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
//		System.out.println("驱动加载成功");
//		//String url="jdbc:odbc:Driver={Microsoft Access Driver(*.mdb)};DBQ="+application.getRealPath("."+File.separator+"Communication.mdb");
//		String url="jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=."+File.separator+"Communication.mdb";
//				//上述url中的Driver和(*.mdb)之间空格有且只能有一个
//		//sun.jdbc.odbc.JdbcOdbcDriver驱动程序类名
//		//DBQ=."+File.separator+"Communication.mdb"数据库文件
//		conDataBase=DriverManager.getConnection(url,"root","root");
//		System.out.println("数据库连接成功");
/**************************MS Access**********************************************************/


/**************************SQL Server 2000**********************************************************/
		//Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
		Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
		System.out.println("驱动加载成功");
		String url="jdbc:odbc:JavaCom";
		//conDataBase=DriverManager.getConnection("jdbc:microsoft:sqlserver://NUSTCS608\\NUSTSQLSERVER:1433;DatabaseName=JavaCommunication","sa","");
		//conDataBase=DriverManager.getConnection("jdbc:odbc:JavaCom","sa",""); 
		conDataBase=DriverManager.getConnection(url,"sa","");
		System.out.println("数据库连接成功");
/**************************SQL Server 2000**********************************************************/

//******************************读数据库用到的变量*********************************************
String RegName,UserName,Password,IpAddr,Port,Job,Sex,EMail,Tel;
String lastDate,PubMsg,SendrName,PubMsgID;
String fromName,toName,msg;

		UserStatement=conDataBase.createStatement();
		PubMsgStatement=conDataBase.createStatement();
		MsgStatement=conDataBase.createStatement();
		ServerLogStatement=conDataBase.createStatement();




		UserDatas=UserStatement.executeQuery("select *  from UserInfo");//读取数据库中表userinfo用户信息


		while(UserDatas.next()){
System.out.println("UserInfo 已经读出");
			RegName=UserDatas.getString("RegName");
			UserName=UserDatas.getString("UserName");
			Password=UserDatas.getString("Password");
			Sex=UserDatas.getString("Sex");
			Job=UserDatas.getString("Job");
			IpAddr=UserDatas.getString("IpAddr");
			Port=UserDatas.getString("Port");
			lastDate=UserDatas.getString("lastDate");

			//UserName=CharConvert.GB2312toUnicode(UserName);//转换成正确的中文字符
			//Job=CharConvert.GB2312toUnicode(Job);//转换成正确的中文字符


			//EMail=UserDatas.getString("EMail");
			//Tel=UserDatas.getString("Tel");

			if(RegName.equals("admin")){
				SerAdminPassword=Password;
				AdminName=RegName;
				continue;
			}



		yourself=new UserInfo(RegName,UserName,Password,lastDate,IpAddr,Integer.parseInt(Port));
		yourself.setStrSex(Sex);
		yourself.setJob(Job);
		//yourself.setJob(EMail);
		//yourself.setJob(Tel);

		AllUsers.put(yourself.getRegName(),yourself);

			 System.out.println(RegName+"  "+UserName
					    +"  "+Password+"  "+IpAddr
					    +"  "+Port+"  "+Job
					    +"  "+Sex+"  "+lastDate);
		}





		
		PubMsgDatas=PubMsgStatement.executeQuery("select *  from PublicMessage");//读取数据库中表userinfo用户信息
System.out.println("公告已经读出");
		
		while(PubMsgDatas.next()){
				PubMsg=PubMsgDatas.getString("PubMsg");
				PubMsg=CharConvert.GB2312toUnicode(PubMsg);//转换成正确的中文字符
				SendrName=PubMsgDatas.getString("SenderName");
				lastDate=PubMsgDatas.getString("lastDate");
				PublicMessagelist.add(new PublicMessage(PubMsg,lastDate,SendrName));
			  System.out.println(PubMsg+"  "+SendrName+"  "+lastDate);
		}

		MsgDatas=MsgStatement.executeQuery("select *  from Message");//读取数据库中表userinfo用户信息
System.out.println("留言已经读出");
		while(MsgDatas.next()){
			fromName=MsgDatas.getString("fromName");
			toName=MsgDatas.getString("toName");
			msg=MsgDatas.getString("msg");
			msg=CharConvert.GB2312toUnicode(msg);//转换成正确的中文字符
			lastDate=MsgDatas.getString("lastDate");
			Messagelist.add(new Message(fromName,toName,msg,lastDate));
		System.out.println(fromName+"  "+toName+"  "+msg+"  "+lastDate);
		}
/**************************MS Access**********************************************************/		
		
		//监听3000号端口
		welcome=new ServerSocket(3000);
		
		//将服务器所在IP和Port写入文件,方便客户端使用
		ServerInfo=new File("."+File.separator+"SerIPort.dat");
		ToFile=new DataOutputStream(new FileOutputStream(ServerInfo));//会自动删除原来的文件新建一个同名文件	
		ToFile.write((getIPAddr()+":"
			     +Integer.toString(welcome.getLocalPort())).getBytes());
		ToFile.close();
		//服务器端主界面
		serverframe=new ServerFrame(this);
		serverframe.setVisible(false);
		serverframe.CurConNum(0);//为了显示当前用户在线状态调用此方法
					 //否则当前在线用户的状态只有在有第一个用户登陆时候才能看到
					 //因为这个方法在有用户登陆时候才会调用,要不在此调用,则服务器不显示用户在线状态

System.out.println("启动服务器登陆界面");

		SLoginDiag=new ServerLoginDiag(this,serverframe);

		SLoginDiag.setVisible(true);


		new Thread(this).start();

		switchthread=new SwitchThread(CSThreads,CSThreadskeys);
		new Thread(switchthread).start();

	}catch(UnsupportedEncodingException e){
		System.out.println("GB2312到Unicode转换错误");
	}catch(IOException e){
		System.out.println("new ServerSocket(3000)失败");
	}catch(ClassNotFoundException e){
		System.out.println("找不到数据库驱动程序!ClassNotFoundException");
	//}catch(InstantiationException e){
	//	System.out.println("驱动加载错误InstantiationException");
	//}catch(IllegalAccessException e){
	//	System.out.println("驱动加载IllegalAccessException");
	}catch(SQLException e){
		System.out.println("DriverManager.getConnection()错误"+e.toString());
	}catch(NumberFormatException e){
		System.out.println("字符串转换整数错误");
	}//catch
	

	
	
	}//public Server()

public void deleteUser(UserInfo user){

	AllUsers.remove(user.getRegName());

	try{

		UserStatement.executeUpdate("delete from UserInfo where RegName=\'"+user.getRegName()+"\'");
	
System.out.println("用户删除成功"+user.getRegName());

	}catch(SQLException e){
		System.out.println("DriverManager.getConnection()错误"+e.toString()+"用户删除失败");
	}
}//public void deleteUser(UserInfo user)

public String getSerAdminPassWord(){
	return SerAdminPassword;
	
}


public String getSerAdminName(){
	return AdminName;
	
}


public Hashtable getAllUsers(){
	return AllUsers;
}


public int getServerPort(){//在构造器Server()之前调用会出错

	return welcome.getLocalPort();
}

public String getIPAddr(){//在构造器Server()之前调用会出错

	try{
		InetAddress addr=InetAddress.getLocalHost();
		return addr.getHostAddress();
	}catch(UnknownHostException e){
		System.out.println("服务器获取IP失败!");
		return null;
	}
	//return welcome.getInetAddress().getHostAddress();
   
}//public String getIPAddr()



public void MsgReceiver(Message msg){
	synchronized(Messagelist){Messagelist.add(msg);}	//加到队尾
}//public void MsgReceiver(Message msg)


public void OffUserReceiver(User offuser){

	UserInfo tempUserInfo;
	tempUserInfo=(UserInfo)AllUsers.get(offuser.getRegName());
	tempUserInfo.setDate(System.currentTimeMillis());
	tempUserInfo.setOnlineState(false);
	AllUsers.put(offuser.getRegName(),tempUserInfo);//修改AllUsers中数据??

	CSThreads.remove(offuser.getRegName());
	switchthread.OffUserReceiver(offuser);
	serverframe.CurConNum(--CurConNum);
	
}//public void OffUserReceiver(User offuser)


public void UserInfoModifyReceiver(User NewUserInfo){

	UserInfo tempUserInfo;

	tempUserInfo=(UserInfo)AllUsers.get(NewUserInfo.getRegName());
	tempUserInfo.setUserName(NewUserInfo.getUserName());
	tempUserInfo.setPassword(NewUserInfo.getPassword());
	tempUserInfo.setEMail(NewUserInfo.getEMail());
	tempUserInfo.setTel(NewUserInfo.getTel());
	tempUserInfo.setJob(NewUserInfo.getJob());


	AllUsers.put(NewUserInfo.getRegName(),tempUserInfo);//修改AllUsers中数据??
	switchthread.UserInfoModifyReceiver(NewUserInfo);

	DBUpdate(NewUserInfo);	
	
}//public void UserInfoModifyReceiver(User NewUserInfo)


public void PubMsgdispatch(PublicMessage pubmsg){
	PublicMessagelist.add(pubmsg);		//加到队尾
	switchthread.PubMsgReceiver(pubmsg);
	DBInsert(pubmsg);
}//public void PubMsgdispatch(PublicMessage pubmsg)



/****************************************************下面的数据库写入未完成****************************************************/
//如果插入的条目的主键相同时 executeUpdate("insert into...");就会产生SQLException
//删除不存在的条目不会抛出异常
//单引号可以不用\'可直接用'为安全用\'
//executeQuery(SQL)则用来执行SQL查询语句
//executeUpdate(SQL)方法用来执行那些会修改数据库内容的SQL语句,insert、update、delete以及create等命令
//execute(SQL)方法可以执行任意类型的SQL语句
//executeBatch()用来批量执行SQL语句
//UserStatement.executeUpdate("update UserInfo set Port=8000 where RegName=\'Lzpaul\'");
//UserStatement.executeUpdate("insert into UserInfo(RegName,UserName,Password,IpAddr,Port) values (...)");
//UserStatement.executeUpdate("delete from UserInfo where RegName='x个jj'");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -