📄 fchatserver.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 + -