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

📄 chatserver.java~15~

📁 这是多人聊天模式的服务器
💻 JAVA~15~
字号:
package chatserver;

import java.awt.BorderLayout;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.*;
import java.util.*;
import java.io.*;

public class ChatServer extends JFrame
{
    JMenuBar mb = new JMenuBar();
    JMenu m1 = new JMenu("连接");
    JMenuItem mi1 = new JMenuItem("连接");
    JLabel lab1 = new JLabel("在线用户");
    JLabel lab2 = new JLabel("消息:");
    JTextArea ta = new JTextArea(9,30);
    java.awt.List list = new java.awt.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();
     JPanel p4 = new JPanel();

    ServerSocket serverSocket;
    Socket socket;
    ArrayList array = new ArrayList();
    int connect;

    public ChatServer()
    {
        super("服务器");
        setJMenuBar(mb);
        mb.add(m1);

        m1.add(mi1);
        m1.addSeparator();
        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(8000);
                        ta.append("系统提示: \n");
                    }
                    catch(IOException ex)
                    {
                        ta.append("系统提示:启动失败!\n");
                    }
                }
                else
                {
                    ta.append("系统消息: 启动成功\n");
                }
                //启动监听客户端连接线程
                Thread t = new Watch();
                t.start();
            }
        });
        b.addActionListener(new ServerListener());
        addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent e)
            {
                closeAll();
                System.exit(0);
            }
        });
        try {
            jbInit();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    class Watch extends Thread
    {
        public void run()
        {
            while(true)
            {
                if(array.size() <= 10)
                {
                    try
                    {
                        socket = serverSocket.accept();
                    }
                    catch(IOException ex)
                    {
                        ta.append("系统消息:                  "+ex+"\n");
                    }
                   //创建客户端线程,一个线程对应一个客户端
                   Client c = new Client(socket);
                   array.add(c);
                   c.start();
                }
                else
                {
                    ta.append("系统消息:"+" 服务器"
                              );
                }
            }
        }
    }

    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;
            try
            {
                while(true)
                {
                    info = br.readLine();
                    if(info == null)
                        break;
                    StringTokenizer st = new StringTokenizer(info, ":");
                    String keyword = st.nextToken();

                   //处理客户端传来的信息
                    if (keyword.equals("CONNECT"))
                    {
                        name = st.nextToken();
                        ip = st.nextToken();
                        ipAddress = ip.substring(ip.indexOf("/")+1);
                        ta.append("系统消息:                  " + name + "/"
                                  + ipAddress +"                  已经连接\n");
                        list.add(name + "                    " + ip
                                 +"                    已经登录");
                        notifyChatRoom();
                    }
                    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);
                        list.removeAll();
                        for (int i = 0; i < array.size(); i++)
                        {
                            Client c = (Client) array.get(i);
                            list.add(c.name + "                    " + c.ip
                                     +"                    已经登录", i);
                        }
                        notifyChatRoom();
                        break;
                    }
                }
            }
            catch (IOException ex)
            {
                ta.append("系统消息:                  "+ex+"\n");
                disConnect(this);
                notifyChatRoom();
            }
        }

        public void send(StringBuffer msg)
        {
            ps.println(msg);
            ps.flush();
        }
    }

    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 c)
    {
       try
       {
           ta.append("系统消息:                  " + c.name+ "/"
                     + c.ipAddress +"                  已经断开\n");
           c.send(new StringBuffer("QUIT:"+c.name));
           c.socket.close();
           array.remove(c);
       }
       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();
    }

    private void jbInit() throws Exception {
    }
}

⌨️ 快捷键说明

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