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

📄 chatserver.java

📁 聊天室说明: 此程序基于C/S模式
💻 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 + -