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

📄 servermain.java

📁 用hibernata连接数据库的java聊天室 有服务器端可踢人
💻 JAVA
字号:
package cr;


import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class ServerMain extends JFrame implements ActionListener{
    ListTable ltaOnline;                      //在线用户的列表
    JTextArea jtaChats;                       //聊天记录的显示区
    JTextField jtfChat;                       //发言内容的输入框
    JTextField jtfObject;                     //发言针对对象
    JLabel jlaOnlineSum;                      //在线人数
    JButton jbuKick;                          //“踢”按钮
    JButton jbuSend;                          //“发言”按钮
    ConnectPond cpoOnline;                    //联接池对象
    Vector vecConnectListener;                //连接监听对象存放向量
    
    public ServerMain() {
        //初始化主界面
        super("Xiang的聊天室的服务器端");
        this.setSize(620,500);
        Container conMain=this.getContentPane();
        this.setDefaultCloseOperation(3);

        jtaChats=new JTextArea();
        ltaOnline=new ListTable();
        cpoOnline=new ConnectPond();

        JPanel jpaDown=new JPanel();
        jbuKick=new JButton("踢");
        jbuKick.addActionListener(this);
        jbuSend=new JButton("发言");
        jbuSend.addActionListener(this);
        jlaOnlineSum=new JLabel("0");
        jtfChat=new JTextField(25);
        jtfObject=new JTextField("   所有人   ");
        jtfObject.setEditable(false);
        jpaDown.add(jbuKick);
        jpaDown.add(new JLabel("对:"));
        jpaDown.add(jtfObject);
        jpaDown.add(new JLabel("说:"));
        jpaDown.add(jtfChat);
        jpaDown.add(jbuSend);
        jpaDown.add(new JLabel("在线人数:"));
        jpaDown.add(jlaOnlineSum);


        conMain.add(new JScrollPane(jtaChats),BorderLayout.CENTER);
        conMain.add(ltaOnline,BorderLayout.EAST);
        conMain.add(jpaDown,BorderLayout.SOUTH);


        this.setVisible(true);
        ltaOnline.addElement("所有人");

        vecConnectListener=new Vector();
        this.validate();
        //建立连接
        listenConnect();
    }

    void listenConnect(){
        ServerSocket ssoConnect = null;          //用于监听连接到服务器的连接
        Socket socConnect=null;                  //临时存放新得到的连接套接字
        BufferedReader breTemp=null;             //临时存放新建连接的输入流
        PrintWriter pwrTemp=null;                //临时存放新建连接的输出流
        String strTemp=null;                     //字符串临时变量
        int intSum=1;                            //更改用户昵称用到的变量

        try {
            ssoConnect = new ServerSocket(4000);       //检测本机的4000端口
        } catch (IOException ex1) {
            System.out.println("建立ServerSocket失败!");
        }


        while (true){                                 //永久循环检测
            try {
                socConnect = ssoConnect.accept();      //检测到新连接赋值
            } catch (IOException ex) {
                System.out.println("建立Socket失败!");
            }

            try {                                     //获取输入输出流
                breTemp = new BufferedReader(new InputStreamReader(socConnect.
                        getInputStream()));
                pwrTemp=new PrintWriter(socConnect.getOutputStream(),true);
            } catch (IOException ex2) {
                System.out.println("获取IO流失败!");
            }

            int intOnlineSum=ltaOnline.getSum()+1;    //计算给客户端发送的在线聊友列表
                                                      //的数目,“所有人”项一并统计在内
            pwrTemp.println(""+intOnlineSum);         //发送数目
            for (int i=0;i<intOnlineSum;i++){        //发送具体昵称
                pwrTemp.println(ltaOnline.isName(i));
            }

            try {
                strTemp=breTemp.readLine();          //接收用户定义的昵称

                if (ltaOnline.isBeing(strTemp)){     //判断昵称已经存在
                    strTemp+="克隆"+(intSum++)+"代";  //改名
                    pwrTemp.println("TRUE");         //通知客户端接收新昵称
                    pwrTemp.println(strTemp);        //向客户端发送新昵称
                }
                else
                     pwrTemp.println("FALSE");       //昵称没有重复

                jtaChats.append("系统广播:欢迎"+strTemp+"来到本聊天室\n");
            } catch (IOException ex3) {
                System.out.println("读数据失败!");
            }

            ltaOnline.addElement(strTemp);      //将新来者加入到在线人员列表
            cpoOnline.add(socConnect);          //将新来者加入到联接池
            ConnectListen cliTemp=new ConnectListen(socConnect,this);    //为新来者建立一个监听对象

            cliTemp.start();
            vecConnectListener.addElement(cliTemp);         //保存监听对象
            jlaOnlineSum.setText(""+ltaOnline.getSum());    //更新在线人数
            cpoOnline.sendAll("ADD");                       //通知所有在线客户端增加一个聊友
            cpoOnline.sendAll(strTemp);                     //通知所有在线客户端新聊友的昵称
            cpoOnline.sendAll("系统广播:欢迎"+strTemp+"来到本聊天室");
        }
    }


    class ListTable extends JPanel implements MouseListener{
        private BaTable jtaMain;      //用于显示聊友昵称的表
        private Vector vecHead,       //表头
                        vecData;       //数据体
        ListTable(){
            super();
            vecHead=new Vector();
            vecData=new Vector();
            vecHead.add("asdsssssssss");
            jtaMain=new BaTable(vecData,vecHead);     //创建一个初始列表
            jtaMain.addMouseListener(this);           //加鼠标监听
            this.add(jtaMain);
        }
        //在表中增加一个聊友昵称
        void addElement(String strElement){
             Vector vecRow=new Vector();
             vecRow.add(strElement);
             vecData.add(vecRow);
             jtaMain.revalidate();
        }
        //在表中删除一个聊友昵称
        void delElement(String strElement){
            Vector vecRow=new Vector();
            vecRow.add(strElement);
            vecData.removeElement(vecRow);
            jtaMain.revalidate();
        }
        //获取列表中的人数
        int getSum(){
            return vecData.size()-1;       //减去“所有人”项
        }
        //判断某个昵称是否有人在使用
        boolean isBeing(String strElement){
            Vector vecRow=new Vector();
            vecRow.add(strElement);
            return vecData.contains(vecRow);
        }
        //获取某个序号的聊友昵称
        String isName(int intTemp){
             Vector vecRow=(Vector)vecData.get(intTemp);
            return (String)vecRow.get(0);

        }
        //获取某个昵称的聊友的序号
        int getIndex(String strName){
            Vector vecRow=new Vector();
            vecRow.add(strName);
            return vecData.indexOf(vecRow);
        }

        void refurbish(){
            this.setVisible(false);
            this.setVisible(true);

        }

        public void mouseClicked(MouseEvent e) {
        }

        public void mousePressed(MouseEvent e) {
            //在聊友列表中点击某个聊友时,将其昵称填入到聊天对象框中
            jtfObject.setText((String)jtaMain.getValueAt(jtaMain.getSelectedRow(),0));
        }

        public void mouseReleased(MouseEvent e) {
        }

        public void mouseEntered(MouseEvent e) {
        }

        public void mouseExited(MouseEvent e) {
        }
    }
    //继承一个JTable,将表项的缺省模式改为不可编辑
    public class BaTable extends JTable{
        public BaTable(){super();}        //缺省构造方法

        public BaTable(Vector data, Vector head){     //向量构造方法
            super(data,head);
        }
        public boolean isCellEditable(int row,int column){
            return false;   }                 //表项不可编辑
    }



    public static void main(String args[]){
        new ServerMain();
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource()==jbuSend){              //点击“发言”按钮
            if (jtfObject.getText().trim().equals("所有人")){    //发言对象是所有人
               cpoOnline.sendAll("服务器公告:"+jtfChat.getText());
               jtaChats.append("服务器公告:"+jtfChat.getText()+"\n");
            }
            else {                                 //发言对象是某个聊友
               cpoOnline.sendTo(ltaOnline.getIndex(jtfObject.getText().trim())-1,
                                "管理员对你说:"+jtfChat.getText());
               jtaChats.append("管理员对"+jtfObject.getText()+"说:"+jtfChat.getText()+"\n");
            }
        }

        if (e.getSource()==jbuKick){              //点击“踢”按钮
            if(jtfObject.getText().trim().equals("所有人")){      //企图踢"所有人"
                jtaChats.append("把所有都踢走了就没人陪你聊天了:(");
            }
            else {                                 //“请”某个聊友出聊天室
                int intObject=ltaOnline.getIndex(jtfObject.getText().trim())-1;  //得到其序号
                cpoOnline.sendTo(intObject,"你被管理员请请出了聊天室");       //给该聊友发送“请帖”
                jtaChats.append(jtfObject.getText().trim()+"被管理员请出了聊天室\n");
                ltaOnline.delElement(jtfObject.getText().trim());      //服务器在线人员列表删除目标
              //  ltaOnline.refurbish();
                jlaOnlineSum.setText(""+ltaOnline.getSum());           //更新在线人数
                cpoOnline.remove(intObject);                           //连接池中删除相应连接
                ConnectListen cliTemp=(ConnectListen)vecConnectListener.get(intObject);  //获得对其的监听对象
                vecConnectListener.remove(intObject);                 //删除监听该连接的对象
                cliTemp.booKick=true;                                //在目标的监听对象中标识为被踢
                try {
                    cliTemp.socket.close();                          //关闭该连接
                } catch (IOException ex) {
                }
                cpoOnline.sendAll("DEL");                            //通知在线客户端删除一个聊友
                cpoOnline.sendAll(jtfObject.getText().trim());       //发送该聊友的昵称
                cpoOnline.sendAll(jtfObject.getText().trim()+"被管理员请出了聊天室");
            }
       }
    }
}

⌨️ 快捷键说明

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