📄 chatserver.java
字号:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.*;
import java.io.*;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class ChatServer extends JFrame
{
JMenuBar mb = new JMenuBar();
JMenu m1 = new JMenu("文件");
JMenu m2 = new JMenu("帮助");
JMenuItem mi1 = new JMenuItem("连接");
JMenuItem mi2 = new JMenuItem("退出");
JLabel lab1 = new JLabel("用户在线列表");
JLabel lab2 = new JLabel("消息:");
JTextArea ta = new JTextArea(9,30);
List list = new List(9);
JTextField tf = new JTextField(24);
JButton b = new JButton("发送");
JScrollPane sp = new JScrollPane();
JPanel p1 = new JPanel();
JPanel p2 = new JPanel();
JPanel p3 = new JPanel();
ServerSocket serverSocket;
Socket socket;
ArrayList array = new ArrayList();//用来存储Client线程对象
int connect;
public ChatServer()
{
super("聊天服务器");
setJMenuBar(mb);
mb.add(m1);
mb.add(m2);
m1.add(mi1);
m1.addSeparator();
m1.add(mi2);
sp.getViewport().add(ta);
p1.setLayout(new BorderLayout());
p3.add(lab1);
p1.add(p3,BorderLayout.NORTH);
p1.add(list,BorderLayout.SOUTH);
p2.add(lab2);
p2.add(tf);
p2.add(b);
getContentPane().add(sp,BorderLayout.NORTH);
getContentPane().add(p1,BorderLayout.CENTER);
getContentPane().add(p2,BorderLayout.SOUTH);
pack();
//服务器端界面居中显示
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = this.getSize();
if(frameSize.width > screenSize.width)
{
frameSize.width = screenSize.width;
}
if(frameSize.height > screenSize.height)
{
frameSize.height = screenSize.height;
}
setLocation((screenSize.width - frameSize.width)/2,
(screenSize.height - frameSize.height)/2);
setSize(400,430);
setVisible(true);
setResizable(false);
mi1.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if(serverSocket == null)
{
try
{
serverSocket = new ServerSocket(7000);
ta.append("系统提示:"+" 聊天服务器"
+" 正在启动......\n");
ta.append("系统提示:"+" 聊天服务器"
+" 启动完成\n");
}
catch(IOException ex)
{
ta.append("系统提示:"+" 聊天服务器"
+" 启动失败!\n");
}
}
else
{
ta.append("系统提示:"+" 聊天服务器"
+" 已经启动\n");
}
//启动监听客户端连接线程
Thread t = new Watch();
t.start();
}
});
mi2.addActionListener(new ServerListener());
b.addActionListener(new ServerListener());
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
closeAll();
System.exit(0);
}
});
}
class Watch extends Thread
{
public void run()
{
while(true)
{
if(array.size() <= 10)//设置最大连接数为10
{
try
{
socket = serverSocket.accept();
}
catch(IOException ex)
{
ta.append("系统消息: "+ex+"\n");
}
//创建客户端线程,一个线程对应一个客户端
Client c = new Client(socket);
c.start();
}
else
{
ta.append("系统消息:"+" 聊天服务器"
+" 已经超过最大连接数,请待会连接!\n");
}
}
}
}
class Client extends Thread
{
String name;
String ip;
String ipAddress;
Socket socket;
BufferedReader br;
PrintStream ps;
public Client(Socket s)
{
try
{
socket = s;
br = new BufferedReader(new InputStreamReader(s.getInputStream()));
ps = new PrintStream(s.getOutputStream());
}
catch (IOException ex)
{
ta.append("系统消息: "+ex+"\n");
}
}
public void run()
{
String info;
while(true)
{
try
{
info = br.readLine();
if(info == null)
break;
//以":"来分割接收到的字符串
StringTokenizer st = new StringTokenizer(info, ":");
String keyword = st.nextToken();
//处理客户端传来的各种信息,"CONNECT"表示客户端发出
//的连接请示,"MSG"表示客户端发出了聊天消息,"QUIT"
//表示客户端要求退出聊天室
if (keyword.equals("CONNECT"))
{
name = st.nextToken();
ip = st.nextToken();
ipAddress = ip.substring(ip.indexOf("/")+1);
if(checkName(name)) //判断用户名是否重复
{
array.add(this);
ps.println("CONNECT:"+"Success");
ps.flush();
ta.append("系统消息: " + name + "/"
+ ipAddress + " 已经连接\n");
list.add(name + " " + ip
+ " 已经登录");
notifyChatRoom(); //通知客户端刷新用户列表
}
else
{
try
{
ps.println("CONNECT:"+"FaultName");
ps.flush();
socket.close();
}
catch(IOException ex)
{
ta.append("系统消息: "+ex+"\n");
}
break;
}
}
else if (keyword.equals("MSG"))
{
String broadcast = st.nextToken();
StringBuffer message = new StringBuffer("MSG:" +broadcast);
message.append(st.nextToken("\0"));
if (broadcast.equals("Broad"))
{
sendToClients(message);
}
else
{
sendToClient(message, broadcast);
}
}
else if (keyword.equals("QUIT"))
{
disConnect(this);
notifyChatRoom();
break;
}
}
catch (IOException ex)
{
ta.append("系统消息: " + "Debug:"+ex + "\n");
disConnect(this);
notifyChatRoom();
}
}
}
public void send(StringBuffer msg)
{
ps.println(msg);
ps.flush();
}
}
//检查新连接的用户名是否与在线用户名重复
public boolean checkName(String userName)
{
for(int i=0;i<array.size();i++)
{
Client c = (Client)array.get(i);
if(c.name.equalsIgnoreCase(userName))
{
return false;
}
}
return true;
}
//把消息发给所有的在线用户
public synchronized void sendToClients(StringBuffer msg)
{
for(int i=0;i<array.size();i++)
{
Client c = (Client)array.get(i);
c.send(msg);
}
}
//把消息发给指定用户名的客户端
public synchronized void sendToClient(StringBuffer msg,String s)
{
for(int i=0;i<array.size();i++)
{
Client c = (Client)array.get(i);
if(c.name.equals(s))
{
c.send(msg);
break;
}
}
}
//通知客户端刷新用户列表
public void notifyChatRoom()
{
StringBuffer sb = new StringBuffer("PEOPLE");
for(int i=0;i<array.size();i++)
{
Client c =(Client)array.get(i);
sb.append(":"+c.name);
}
sendToClients(sb);
}
//断开客户端用户的连接
public synchronized void disConnect(Client client)
{
try
{
client.send(new StringBuffer("QUIT:"+client.name));
ta.append("系统消息: " + client.name
+ "/"+ client.ipAddress +" 已经断开\n");
client.socket.close();
array.remove(client);
//刷新服务器的在线用户列表
list.removeAll();
for (int i = 0; i < array.size(); i++)
{
Client c = (Client) array.get(i);
list.add(c.name + " " + c.ip
+ " 已经登录", i);
}
}
catch(IOException ex)
{
ta.append("系统消息: "+ex+"\n");
}
}
public void closeAll()
{
sendToClients(new StringBuffer("QUIT:"+"Server"));
while(array.size()>0)
{
try
{
for(int i=0;i<array.size();i++)
{
Client c = (Client)array.get(i);
c.socket.close();
array.remove(c);
}
}
catch(IOException ex)
{
ta.append("系统消息: "+ex+"\n");
}
}
}
class ServerListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
if(e.getActionCommand().equals("发送"))
{
StringBuffer msg = new StringBuffer("MSG:"+"Broad:");
msg.append("Server:"+tf.getText());
sendToClients(msg);
tf.setText("");
}
//退出聊天服务器
else if(e.getActionCommand().equals("退出"))
{
closeAll();
System.exit(0);
}
}
}
public static void main(String[] args)
{
ChatServer app = new ChatServer();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -