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

📄 fchatserver.java

📁 这是一个个人编写的在线聊天程序。是用JAVA语言编写的
💻 JAVA
字号:
import java.awt.*;
import java.io.*;
import java.net.*;
import java.util.*;
import java.awt.event.*;
import javax.swing.event.*;

public class FChatServer implements Runnable//服务器
{
	EServerFrame S;
	static Vector v=new Vector(0,1);//收集登录用户的用户名
	static Vector V=new Vector(0,1);//收集被服务器屏蔽的用户的用户名
	FChatInfo chatInfo;//创建FChatInfo的对象
	static HashMap hashMap=new HashMap();
	ServerSocket serverSocket;//创建服务器Socket
	Thread serverThread;//创建服务器线程
	Socket clientSocket;
	
	public FChatServer()
	{
		S=new EServerFrame(this);
		
		try
		{
			serverSocket=new ServerSocket(1001);
			serverThread=new Thread(this);
			serverThread.start();

			System.out.println("Start Server!!");
			S.StartMessage("***天使聊天服务器已经启动(端口:1001)***");
		}
		catch(Exception e)
		{}		
	}	
	public static void main(String args[])
	{
		 FChatServer f=new FChatServer();	
	}

	public void StopServer()//服务器断开方法
	{
		try
		{
			serverSocket.close();
			serverThread=null;
		}
		catch(Exception e)
		{
			System.out.println("Server cannot close"+e);	
		}
	}
	public void StartServer()//服务器重新连接方法
	{
		try
		{
            		serverSocket=new ServerSocket(1001);
			serverThread=new Thread(this);
			serverThread.start();
		}
		catch(Exception e)
		{
			System.out.println("Server cannot start"+e);	
		}
	}
	
	public void run()
	{		
		try
		{
			while(true)
			{
				clientSocket=serverSocket.accept();
				Connect con=new Connect(clientSocket);
			}
		}
		catch(Exception e)
		{}
	}
	
	static HashMap getHashMap()//返回hashmap 
	{
		return hashMap;	
	}
	
	class Connect extends Thread//通讯线程
	{
		Socket netClient;
		ObjectOutputStream streamToClient;
		ObjectInputStream streamFromClient;
		
		public Connect(Socket client)
		{
			netClient=client;
			try
			{
				streamFromClient=new ObjectInputStream(netClient.getInputStream());
				streamToClient=new ObjectOutputStream(netClient.getOutputStream());	
			}	
			catch(Exception e)
			{
				S.StartMessage("Cannot get client stream");	
			}
			this.start();
		}
		
		public void run()
		{
			try
			{
				for(;;)
				{
					chatInfo=(FChatInfo)streamFromClient.readObject();
					//如果接收到的对象中的命令是用户登录命令,调用用户登录的方法
					if(chatInfo.getCommand().equals("login"))
					{
						login(chatInfo,streamToClient);
					}
					//如果接收到的对象中的命令是用户登出命令,调用用户登出的方法
					if(chatInfo.getCommand().equals("logout"))
					{
						logout(chatInfo);
					}
					//如果接收到的对象中的命令是用户群聊命令,调用群聊的方法
					if(chatInfo.getCommand().equals("toall"))
					{
						toall(chatInfo);
					}
					//如果接收到的对象中的命令是用户私聊命令,调用群聊的方法
					if(chatInfo.getCommand().equals("toone"))
					{
						toone(chatInfo,streamToClient);
					}
					//如果接收到的对象中的命令是断开连接命令,调用断开连接的方法
					if(chatInfo.getCommand().equals("leave"))
					{
						Leave(chatInfo);
					}
					//如果接收到的对象中的命令是恢复连接命令,调用恢复连接的方法
					if(chatInfo.getCommand().equals("return"))
					{
						back(chatInfo);
					}
					//如果接收到的对象中的命令是屏蔽用户命令,调用屏蔽用户的方法
					if(chatInfo.getCommand().equals("stopuser"))
					{
						stopuser(chatInfo);
					}							
				}
		    }				
			catch(InvalidClassException e)
			{}			
			catch(NotSerializableException e)
			{}			
			catch(IOException e)
			{
				try
				{
					netClient.close();	
				}	
				catch(IOException ioe)
				{
					S.StartMessage("Error closing client Socket!!!");	
				}
			}
			
			catch(ClassNotFoundException e)
			{
				S.StartMessage("FChatInfo class could not be found");
			}
			
			finally
			{
				try
				{
					netClient.close();	
				}	
				catch(IOException e)
				{
					S.StartMessage("Error closing client Socket!!!");	
				}
			}	
		}
		
		public void login(FChatInfo ci,ObjectOutputStream output)//用户登录时调用的方法
		{
			if(V.contains(ci.getUser()))//如果接收到的用户名在服务器屏蔽名单中
			{
				chatInfo.setCommand("Cannot in");
				try
				{
					output.writeObject(chatInfo);
				}
				catch(IOException e)
				{}	
				return;
			}
			if(v.contains(ci.getUser()))//如果接收到的用户名已经在聊天室中
			{
				chatInfo.setCommand("tryagain");
				try
				{
					output.writeObject(chatInfo);
				}
				catch(IOException e)
				{}	
			}
			else
			{
				synchronized(hashMap)
				{
					v.addElement(ci.getUser());//把用户名加到列表中
					hashMap.put(ci.getUser(),output);//把用户名加到列表中
					S.S.M.L1.UserLabel.setText("在线用户数:"+hashMap.size());//更改服务器中的当前在线数
		chatInfo=new FChatInfo(ci.getUser(),"login",v,"***用户: "+ci.getUser()+
		" 登录聊天室***","",null,0,"");
					toall(chatInfo);//通知在线用户用户登录的消息
					S.S.M.L1.U.UserList.removeAll();//清空列表
					S.S.M.L1.U.UserList.setListData(v);//重新设置列表

					S.LoginMessage("***用户:"+ci.getUser()+" 登录聊天室***");//服务器显示用户登录消息
				}		
			}			
		}
		
		public void logout(FChatInfo ci)//用户登出时调用的方法
		{
			synchronized(hashMap)
			{
				v.remove(ci.getUser());//把用户名从列表中除去
				hashMap.remove(ci.getUser());//把用户名从列表中除去
				S.S.M.L1.UserLabel.setText("在线用户数:"+hashMap.size());//更改服务器中的当前在线数
		chatInfo=new FChatInfo(ci.getUser(),"logout",v,"***用户: "+ci.getUser()+
		" 离开聊天室***","",null,0,"");
				toall(chatInfo);//通知在线用户用户登出的消息
				S.S.M.L1.U.UserList.removeAll();//清空列表
				S.S.M.L1.U.UserList.setListData(v);//重新设置列表

				S.LogoutMessage("***用户:"+ci.getUser()+" 离开聊天室***");//服务器显示用户登出消息
			}
		}
		
		public void toall(FChatInfo ci)//用户群聊时调用
		{			
			synchronized(hashMap)//循环用来将HASHMAP中保存的对象遍历,并且对每个对象发送
			{
				for(Iterator i = hashMap.values().iterator(); i.hasNext();)
        		try
	  			{
	  				((ObjectOutputStream)i.next()).writeObject(ci);
	  			}
	  			catch(IOException e)
	  			{
	  				S.StartMessage("canot write to client");	
	  			}			  		
		  	}
		}
		
		public void toone(FChatInfo ci,ObjectOutputStream output)//用户私聊时调用
		{
			synchronized(hashMap)
			{		
				try
				{
					//获得特定的人的输入流
					ObjectOutputStream out=(ObjectOutputStream)hashMap.get(ci.gettoUser());
					out.writeObject(ci);//发送给特定的人
					output.writeObject(ci);//在自己的屏幕上显示自己说的话
				}	
				catch(IOException e)
				{
					S.StartMessage("cannot write to outputstream");	
				}
			}
		}
		public void Leave(FChatInfo ci)//断开连接时调用
		{
			synchronized(hashMap)
			{
		chatInfo=new FChatInfo(ci.getUser(),"leave",v,"***用户: "+ci.getUser()+
		" 暂时离开***","",null,0,"");
				toall(chatInfo);//通知在线用户用户暂时离开的消息

				S.LeaveMessage("***用户:"+ci.getUser()+" 暂时离开***");//服务器显示消息
			}
		}
		public void back(FChatInfo ci)//恢复连接时调用
		{
			synchronized(hashMap)
			{
		chatInfo=new FChatInfo(ci.getUser(),"return",v,"***用户: "+ci.getUser()+
		" 回到了聊天室***","",null,0,"");
				toall(chatInfo);//通知在线用户用户回到聊天室的消息

				S.ReturnMessage("***用户:"+ci.getUser()+" 回到了聊天室***");//服务器显示消息
			}
		}			
		public void stopuser(FChatInfo ci)//服务器踢人时调用
		{
			synchronized(hashMap)
			{
				v.remove(ci.getUser());//从列表中除去被屏蔽的用户
				hashMap.remove(ci.getUser());
				S.S.M.L1.UserLabel.setText("在线用户数:"+hashMap.size());//更改服务器中的当前在线数
			chatInfo=new FChatInfo(ci.getUser(),"Serverstopuser",v,"***用户: "+ci.getUser()+
			" 因为 " +ci.getChatText()+" 已经被管理员赶出聊天室***","",null,0,"");
				toall(chatInfo);//通过toall()方法告诉其他在线用户有用户被服务器赶出聊天室
				S.S.M.L1.U.UserList.removeAll();//清空列表
				S.S.M.L1.U.UserList.setListData(v);//重新设置列表

				S.StopMessage("***用户:"+ci.getUser()+" 已经被屏蔽***");//服务器显示消息
			}
		}		
	}	
}

⌨️ 快捷键说明

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