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

📄 client.java

📁 实现多人即时聊天
💻 JAVA
字号:
import java.io.*;
import java.net.*;
import java.util.Vector;
import java.util.Hashtable;
import javax.swing.Timer;
import javax.swing.JOptionPane;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

class Client implements Runnable{
	private LoginDiag loginframe;
	private UserInfo myself;
	private Socket CSocket;
	//流
	private ObjectOutputStream StreamOut;
	private ObjectInputStream StreamIn;
	
	private Vector OnlineUsers;
	private Vector OfflineUsers;
	private Vector PubMsglist;
	private Vector Msglist;
	private ClientFrame clientframe;
	//线程体
	private boolean shutdown=false;

	public Client(){

		OnlineUsers=new Vector();
		OfflineUsers=new Vector();
		PubMsglist=new Vector();
		Msglist=new Vector();

		clientframe=new ClientFrame(this);
		loginframe=new LoginDiag(this);
		loginframe.setVisible(true);

	}//public Client()


public User getmyself(){
	return myself.getUser();
}

public void connect(String IP,int port)throws Exception{

System.out.println("in connect() 服务器IP+Port="+IP+":"+port);

	try{
System.out.println("准备连接服务器");

		CSocket=new Socket(IP,port);

System.out.println("服务器连接成功");

		StreamOut=new ObjectOutputStream(CSocket.getOutputStream());
		StreamIn=new ObjectInputStream(CSocket.getInputStream());
System.out.println("流创建成功");

	}catch(Exception e){
		throw e;
	}
}//public void connect(String IP,int port)throws UnknownHostException,IOException


public int getClientPort(){//在connect()方法之前调用会出错

	return CSocket.getLocalPort();
}

public String getIPAddr(){//在connect()方法之前调用会出错

	return CSocket.getLocalAddress().getHostAddress();
}


public boolean login(UserInfo myself,boolean Register){

System.out.println("in login()");
System.out.println("UserInfo myself="+myself);
System.out.println("boolean Register="+Register);

this.myself=myself;

	char Cetified;
    try{
	if(Register){
		StreamOut.writeChar('R');
	}else{
		StreamOut.writeChar('L');
	}
	
	StreamOut.writeObject(myself);
	StreamOut.flush();

System.out.println("连接服务器的用户信息:");
myself.display();
System.out.println("等待服务器反馈信息:(Y/N)");

	Cetified=StreamIn.readChar();
System.out.println("服务器的返回信息:");

	if(Cetified=='Y'){

System.out.println("收到Y准备进入初始化Init()");

		Init();		
		new Thread(this).start();
		clientframe.setVisible(true);
		return true;
	}
	else{return false;}

    }catch(Exception e){
	return false;
    }
}//public boolean login(UserInfo myself,boolean Register)

public void Init()throws Exception{

System.out.println("in Init()");

	PublicMessage tempPubMsg;
	Message tempmsg;
 	UserInfo tempUser;
	char tempConChar;
	boolean over=false;
    try{

System.out.println("准备进入while(!over)");

       while(!over){

//System.out.println("in while(!over)");

	tempConChar=StreamIn.readChar();

	switch(tempConChar){
			case 'C':{//公告

//System.out.println("in case 'C' 接收公告");

				tempPubMsg=(PublicMessage)StreamIn.readObject();

//System.out.print("接收的公告==null?   ");
//System.out.println(tempPubMsg==null);
//tempPubMsg.display();
				PubMsglist.add(tempPubMsg);
//System.out.println("正确一个接收公告");

				break;
			}//case 'C':
			case 'M':{//留言

//System.out.println("in case 'M' 接收留言");

				tempmsg=(Message)StreamIn.readObject();
				Msglist.add(tempmsg);
				break;
			}//case 'M':
			case 'F':{//其他用户

//System.out.println("in case 'F' 接收用户");

				tempUser=(UserInfo)StreamIn.readObject();

//System.out.print("接收的用户==null?");	
//System.out.println(tempUser==null);	
			
				if(tempUser.getRegName().equals(this.myself.getRegName())){
					this.myself=tempUser;
				}else{
					if(tempUser.getOnlineState()){
						OnlineUsers.add(tempUser.getUser());
					}else{
						OfflineUsers.add(tempUser.getUser());
					}//offline
				}//if(!tempUser.getRegName().equals(this.myself.getRegName()))
				break;
			}//case 'F':
			case 'E':{//初始化信息接收完毕
				over=true;

System.out.println("接收到初始化结束标志'E'");

				break;
			}//case 'E'
		}//switch(tempConChar)
	      }//while(!over)

//System.out.println("初始化clientframe前:");
//System.out.println("OnlineUsers.size()="+OnlineUsers.size());
//System.out.println("OfflineUsers.size()="+OfflineUsers.size());
//System.out.println("PubMsglist.size()="+PubMsglist.size());
//System.out.println("Msglist.size()="+Msglist.size());
System.out.println("开始初始化clientframe");

	clientframe.Init(OnlineUsers,OfflineUsers,PubMsglist,Msglist);

    }catch(Exception e){

System.out.println(e);
	throw e;
    }//catch(Exception e)
}//public void Init()throws Exception

public void send(Message msg,boolean RealTime){

System.out.println("in Client send(Message msg,boolean RealTime)");

     try{
		//StreamOut.flush();

		if(RealTime){
			StreamOut.writeChar('F');
		}else{
			StreamOut.writeChar('M');
		}

		//StreamOut.flush();

		msg.setFromName(myself.getRegName());
		StreamOut.writeObject(msg);
		StreamOut.flush();

System.out.println("即时信息已经正确传送");

     }catch(Exception e){

System.out.println("IO Error in Client send()");

		//有IO错误忽略	
		//StreamOut.close();
		//StreamIn.close();
		//CSocket.close();
		System.out.println("IO Error In Client's send()");

		JOptionPane.showMessageDialog(clientframe,
				      "Server connected error,will exit!",
				      "Error",
				      JOptionPane.ERROR_MESSAGE);
		System.exit(0);
     }//catch(Exception e)	
}//public void send(Message msg,boolean Conbool)



public void send(User myNewInfo){

System.out.println("in Client send(User myNewInfo)");

     try{
		//StreamOut.flush();

		
System.out.println("in Client send(User myNewInfo),发送数据:");
System.out.println("in InputThread 用户名:"+myNewInfo.getUserName());
System.out.println("in InputThread 职位:"+myNewInfo.getJob());
System.out.println("in InputThread 密码:"+myNewInfo.getPassword());
System.out.println("in InputThread 邮箱:"+myNewInfo.getEMail());
System.out.println("in InputThread 电话:"+myNewInfo.getTel());

		StreamOut.writeChar('N');
		

	
	StreamOut.writeObject(myNewInfo);
	StreamOut.flush();

System.out.println("个人最新信息已经正确传送");

     }catch(Exception e){

System.out.println("IO Error in Client send()");

		//有IO错误忽略	
		//StreamOut.close();
		//StreamIn.close();
		//CSocket.close();
		System.out.println("IO Error In Client's send()");

		JOptionPane.showMessageDialog(clientframe,
				      "Server connected error,will exit!",
				      "Error",
				      JOptionPane.ERROR_MESSAGE);
		System.exit(0);
     }//catch(Exception e)	
}//public void send(User myNewInfo)







public void logoff(){

     try{
	StreamOut.writeChar('D');
	StreamOut.flush();

	//2秒钟后自动退出
System.out.println("2秒钟后自动关闭");

	Timer ClientExit =new Timer(2000,new ActionListener(){
      		public void actionPerformed(ActionEvent evt){

System.out.println("in logoff() 准备结束程序");

          		System.exit(0);
      		}
  	});
	ClientExit.start();

     }catch(Exception e){
		//有IO错误则退出    //关闭流
		System.out.println("IO Error In Client's logoff() 准备结束程序");
		JOptionPane.showMessageDialog(clientframe,
					      "Server connected error!",
					      "Error",
					      JOptionPane.ERROR_MESSAGE);
		System.exit(0);

     }//catch(Exception e)

}//public void logoff()

public boolean isOnline(String RegName){
//由ClientFrame同名方法调用
	User tempUser;
	int OnUserslen,OffUserslen;
	int i;
	OnUserslen=OnlineUsers.size();
	OffUserslen=OfflineUsers.size();

	
	if(OnUserslen<OffUserslen){	
		for(i=0;i<OnUserslen;i++){
			tempUser=(User)OnlineUsers.get(i);
			if(tempUser.getRegName().equals(RegName)) break;
		}

		if(i==OnUserslen) return false;
		else return true;

	}else{

		for(i=0;i<OffUserslen;i++){
			tempUser=(User)OfflineUsers.get(i);
			if(tempUser.getRegName().equals(RegName)) break;
		}

		if(i==OffUserslen) return true;
		else return false;
	}
}//public boolean isOnline(String RegName)


public User indexToUser(boolean OnlineUserlist,int index){
//由ClientFrame双击事件调用
//要求Jlist中条目与OnlineUsers和OfflineUsers中条目保持一致(下标严格对应)
//这样就能保证返回值不会为null

	User tempUser;
	if(OnlineUserlist){
		tempUser=(User)OnlineUsers.get(index);
		return tempUser;
	}else{
		tempUser=(User)OfflineUsers.get(index);
		return tempUser;
	}

}//public String indexToUser(boolean OnlineUserlist,int index)

public int RegNameToindex(String RegName,boolean OnlineUserlist){
//有ClientFrame中RealTimeMsgReceiver(Message msg)调用
	User tempUser; 
	int len;
	int i;
	if(OnlineUserlist){
		
		len=OnlineUsers.size();
		for(i=0;i<len;i++){
			tempUser=(User)OnlineUsers.get(i);
			if(tempUser.getRegName().equals(RegName)) break;
		}

		
	}else{

		len=OfflineUsers.size();
		for(i=0;i<len;i++){
			tempUser=(User)OfflineUsers.get(i);
			if(tempUser.getRegName().equals(RegName)) break;
		}
	}	


	if(i==len) return -1;
	else return i;

}//public int RegNameToindex(String RegName,boolean OnlineUserlist)

public User RegNameToUser(String RegName){
//由ClientFrame的RealTimeMsgReceiver(Message msg)方法调用
	User tempuser=null;

	for(int i=0,len=OnlineUsers.size();i<len;i++){
		tempuser=(User)OnlineUsers.get(i);
		if(tempuser.getRegName().equals(RegName))
			break;
	}


	for(int i=0,len=OfflineUsers.size();i<len;i++){
		tempuser=(User)OfflineUsers.get(i);
		if(tempuser.getRegName().equals(RegName))
			break;
	}
	
	return tempuser;
}//public User RegNameToUser(String RegName)


public void run(){
	PublicMessage tempPubMsg;
	Message tempmsg;
	User tempUser;
	char tempConchar;
     try{
	while(!shutdown){

System.out.println("in Client run() while(!shutdown) 准备接收服务器的控制字符");

		tempConchar=StreamIn.readChar();
		switch(tempConchar){
			case 'U':{

/*************************以下测试************************************/
//System.out.println("in Client run() case'U'");//\n两个Vector中条目修改之前");
///System.out.println("OnlineUsers中内容:");
//User testUser;

//for(int i=0,len=OnlineUsers.size();i<len;i++){
//	testUser=(User)OnlineUsers.get(i);
//	testUser.display();
//	System.out.println();
//}

//System.out.println("OfflineUsers中内容:");

//for(int i=0,len=OfflineUsers.size();i<len;i++){
//	testUser=(User)OfflineUsers.get(i);
///	testUser.display();
//	System.out.println();
//}

/*************************以上测试************************************/


				tempUser=(User)StreamIn.readObject();

				if(tempUser.getRegName().equals(this.myself.getRegName())) break;
				
				//检查有没有重名(RegName相同)
				//防止两用户上线时间很接近后上者在线用户列表中就会出现两个先上者
				int i,len=OnlineUsers.size();
				for(i=0;i<len;i++){
				    if(((User)OnlineUsers.get(i)).getRegName().equals(tempUser.getRegName())) break;
				}
				if(i==len) OnlineUsers.add(tempUser);//没有,添加
		
				//如果是OfflineUsers中的用户上线则OfflineUsers中相应条目删除
				for(i=0,len=OfflineUsers.size();i<len;i++){
				   if(((User)OfflineUsers.get(i)).getRegName().equals(tempUser.getRegName())){
				   	OfflineUsers.removeElementAt(i);
//System.out.println("成功删除不在线列表中的用户");
//testUser.display();
				   	break;
				   }//if()
				}//for
//System.out.println("用户上线后刷新ClientFrame之前");
//System.out.println("OnlineUsers.size()="+OnlineUsers.size());
//System.out.println("OfflineUsers.size()="+OfflineUsers.size());	
			
				clientframe.UpdateUserlist(OnlineUsers,OfflineUsers);
				break;
			}//case 'U':
			case 'D':{
				tempUser=(User)StreamIn.readObject();
				OfflineUsers.add(tempUser);
				
				//如果是OnlineUsers中的用户下线则OnlineUsers中相应条目删除
				for(int i=0,len=OnlineUsers.size();i<len;i++){
				   if(((User)OnlineUsers.get(i)).getRegName().equals(tempUser.getRegName())){
				   	OnlineUsers.removeElementAt(i);
				   	break;
				   }//if()
				}//for

//System.out.println("用户下线后刷新ClientFrame之前");
//System.out.println("OnlineUsers.size()="+OnlineUsers.size());
//System.out.println("OfflineUsers.size()="+OfflineUsers.size());

				clientframe.UpdateUserlist(OnlineUsers,OfflineUsers);
				break;
			}//case 'D':
			case 'F':{

System.out.println("准备接收即时信息");

				tempmsg=(Message)StreamIn.readObject();

System.out.println("成功接收即时信息,准备交付clientframe");

				clientframe.RealTimeMsgReceiver(tempmsg);
				break;
			}//case 'F':
			case 'C':{
				tempPubMsg=(PublicMessage)StreamIn.readObject();
				PubMsglist.add(tempPubMsg);
				clientframe.PubMsgReceiver(tempPubMsg);
				break;
			}//case 'C':
			case 'G':{
				shutdown=true;
				//关闭流可以没有
System.out.println("in Client run() while case 'G'准备结束程序");
				System.exit(0);
				break;
			}//case 'G':
		}//switch(tempConchar)

	}//while(!shutdown)
     }catch(Exception e){
	System.out.println("IO Error In Client's run()");

	JOptionPane.showMessageDialog(clientframe,
				      "Server connected error,will exit!",
				      "Error",
				      JOptionPane.ERROR_MESSAGE);
	System.exit(0);

     }//catch(Exception e)
}//public void run()
	
public static void main(String args[]){
	new Client();
}//main()
	
	
}//class ServerFrame

⌨️ 快捷键说明

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