追忆~似水年华 2020-02-13 12:12 采纳率: 0%
浏览 756

新登录的用户名怎么判断是否和已登录的用户名重名?

用户1、用户2、用户3、用户4依次登录,再登录用户2怎么判断是否重名

图片说明
图片说明

package Pack;

import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.text.*;
import java.util.*;

import javax.swing.*;
import javax.swing.event.*;

public class Test {
    private JFrame jf = null;

    private JTextField CastIPTxtFiled = new JTextField("228.9.6.8");// 组播IP地址文本框
    private JTextField portTxtFiled = new JTextField("8000");// 端口地址文本框
    private JTextField nameField = new JTextField("用户");// 用户名文本框

    private JTextArea receiveMesArea = new JTextArea();// 接收消息文本域
    private JTextArea sendMesArea = new JTextArea();// 发送消息文本域

    private JButton startChatBtn = new JButton("开始聊天");// 按钮
    private JButton stopChatBtn = new JButton("断开聊天");
    private JButton quitBtn = new JButton("退出");
    private JButton saveBtn = new JButton("保存");
    private JButton cleaBtn = new JButton("清空");
    private JButton sendBtn = new JButton("发送");

    private JRadioButton groupchatBtn = new JRadioButton("群聊");// 单选按钮
    private JRadioButton privatechatBtn = new JRadioButton("私聊");
    private ButtonGroup btg = new ButtonGroup();

    private JList<String> jlist = new JList<String>();// 列表框
    private DefaultListModel<String> dlm = new DefaultListModel<String>();// 用dlm向jlist动态增删用户

    private JScrollPane jScrollPane1 = new JScrollPane(receiveMesArea);// 滚动窗口
    private JScrollPane jScrollPane2 = new JScrollPane(sendMesArea);
    private JScrollPane jScrollPane3 = new JScrollPane(jlist);

    private BroadCast broadCast = null;
    boolean broadCastIsDisable = true;
    boolean chitchat = true;// 判断是群聊还是私聊

    public void InitFrame() {
        jf = new JFrame("组播聊天室");
        jf.setLayout(null);
        jf.setSize(650, 530);
        jf.setLocationRelativeTo(null);// 在屏幕中居中显示
        jf.setResizable(false);// 不可调整窗口大小
        jf.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);// 标题栏关闭按钮失效

        JLabel nameJLabel = new JLabel("用户名");
        nameJLabel.setBounds(30, 80, 60, 20);
        jf.add(nameJLabel);
        nameField.setBounds(80, 80, 100, 20);
        jf.add(nameField);

        JLabel portTxtJLabel = new JLabel("端口地址");
        portTxtJLabel.setBounds(300, 20, 60, 20);
        jf.add(portTxtJLabel);
        portTxtFiled.setBounds(360, 20, 100, 20);
        jf.add(portTxtFiled);

        JLabel CastIPTxtJLabel = new JLabel("组播IP地址");
        CastIPTxtJLabel.setBounds(10, 20, 90, 20);
        jf.add(CastIPTxtJLabel);
        CastIPTxtFiled.setBounds(80, 20, 100, 20);
        jf.add(CastIPTxtFiled);

        startChatBtn.setBounds(220, 80, 100, 20);
        stopChatBtn.setBounds(360, 80, 100, 20);
        jf.add(startChatBtn);
        jf.add(stopChatBtn);

        JLabel receiveJLabel = new JLabel("接收消息");
        receiveJLabel.setBounds(20, 140, 100, 20);
        jScrollPane1.setBounds(20, 160, 460, 130);
        jScrollPane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        jf.add(jScrollPane1);
        jf.add(receiveJLabel);

        JLabel sendJLabel = new JLabel("发送消息");
        sendJLabel.setBounds(20, 300, 100, 20);
        jScrollPane2.setBounds(20, 320, 460, 100);
        jScrollPane2.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        jf.add(jScrollPane2);
        jf.add(sendJLabel);

        jlist.setModel(dlm);
        jScrollPane3.setBorder(BorderFactory.createTitledBorder("在线用户列表"));
        jScrollPane3.setBounds(500, 20, 120, 430);
        jScrollPane3.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        jf.add(jScrollPane3);

        quitBtn.setBounds(20, 460, 100, 20); // 退出
        jf.add(quitBtn);
        saveBtn.setBounds(140, 460, 100, 20); // 保存
        jf.add(saveBtn);
        cleaBtn.setBounds(260, 460, 100, 20);// 清空
        jf.add(cleaBtn);
        sendBtn.setBounds(380, 460, 100, 20); // 发送
        jf.add(sendBtn);

        groupchatBtn.setBounds(120, 120, 100, 20);
        jf.add(groupchatBtn);
        privatechatBtn.setBounds(320, 120, 100, 20);
        jf.add(privatechatBtn);
        btg.add(groupchatBtn);
        btg.add(privatechatBtn);
        groupchatBtn.setSelected(true);

        jf.setVisible(true); // 显示窗口
        BtnFalse();
        Object1();
        receiveMesArea.setEditable(false);// 接收消息文本域不能被编辑
        sendBtn.setMnemonic(KeyEvent.VK_ENTER); // 给sendBtn设置快捷键(Alt+Enter)

        broadCast = new BroadCast(Integer.parseInt(portTxtFiled.getText()), CastIPTxtFiled.getText(),
                nameField.getText());

        startChatBtn.addActionListener(new ButtonAction());
        stopChatBtn.addActionListener(new ButtonAction());
        groupchatBtn.addActionListener(new ButtonAction());
        privatechatBtn.addActionListener(new ButtonAction());
        quitBtn.addActionListener(new ButtonAction());
        saveBtn.addActionListener(new ButtonAction());
        cleaBtn.addActionListener(new ButtonAction());
        sendBtn.addActionListener(new ButtonAction());

        jlist.addListSelectionListener(new ListSelectionListener() {
            public void valueChanged(ListSelectionEvent e) {
                Object2();
            }
        });
    }

    public class ButtonAction implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            if (e.getSource().equals(startChatBtn)) {
                jf.setTitle("当前用户:" + nameField.getText());
                startChatBtn.setEnabled(false);
                BtnTrue();
                Object2();
                broadCastIsDisable = false;
                StartChat();
            } else if (e.getSource().equals(stopChatBtn)) {
                jf.setTitle("组播聊天室");
                startChatBtn.setEnabled(true);
                BtnFalse();
                Object1();
                broadCastIsDisable = true;
                broadCast.StopChat(); // 用户下线
            } else if (e.getSource().equals(groupchatBtn)) {
                chitchat = true;
                Object2();
            } else if (e.getSource().equals(privatechatBtn)) {
                chitchat = false;
                Object2();
            } else if (e.getSource().equals(quitBtn)) {
                if (broadCastIsDisable == false) {
                    broadCast.StopChat();
                }
                System.exit(0);
            } else if (e.getSource().equals(saveBtn)) {
                try {
                    SaveScreen();
                    Object2();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            } else if (e.getSource().equals(cleaBtn)) {
                ClearScreen();
                Object2();
            } else if (e.getSource().equals(sendBtn)) {
                if (sendMesArea.getText().equals("")) {
                    JOptionPane.showMessageDialog(jf, "请输入需要发送的消息", "提示!!!", JOptionPane.ERROR_MESSAGE);
                } else {
                    SendMessage();
                    sendMesArea.setText(null);// 按发送按钮,立即将发送消息文本域内容清空
                }
                Object2();
            }
        }
    }

    public void Object1() {
        nameField.requestFocusInWindow();// 将nameField设置为焦点
        nameField.selectAll();
        startChatBtn.getRootPane().setDefaultButton(startChatBtn);// 将startChatBtn设置为焦点,按回车相当于鼠标单击
    }

    public void Object2() {
        sendMesArea.requestFocusInWindow();
    }

    public void BtnTrue() {// 按钮可点击
        stopChatBtn.setEnabled(true);
        sendBtn.setEnabled(true);
        groupchatBtn.setEnabled(true);
        privatechatBtn.setEnabled(true);
    }

    public void BtnFalse() {// 按钮不可点击
        stopChatBtn.setEnabled(false);
        sendBtn.setEnabled(false);
        groupchatBtn.setEnabled(false);
        privatechatBtn.setEnabled(false);
    }

    public void StartChat() { // 用户上线开始聊天
        String port = portTxtFiled.getText();
        String castIp = portTxtFiled.getText();
        if (!castIp.equals("") && !port.equals("")) {
            broadCast = new BroadCast(Integer.parseInt(portTxtFiled.getText()), CastIPTxtFiled.getText(),
                    nameField.getText());
            broadCast.start(); // 启动线程
        }
    }

    public void SendMessage() {
        if (chitchat == true) {
            broadCast.SendMessage(sendMesArea.getText().toString());
        } else {
            broadCast.SendMessage("@" + jlist.getSelectedValue() + "#" + sendMesArea.getText().toString());
        }
    }

    public void SaveScreen() throws IOException {
        broadCast.SaveScreen();
    }

    public void ClearScreen() {
        broadCast.ClearScreen();
    }

    public static void main(String[] args) {
        Test client = new Test();
        client.InitFrame();
    }

    public class BroadCast extends Thread {
        public int port = 0; // 端口地址
        String Ip = ""; // 组播IP地址
        String name = ""; // 用户名
        MulticastSocket multicastSocket = null;
        boolean StopThread = false;

        static final char FLAG_CHAT = '#';
        static final char FLAG_PM_USER = '@';
        static final char FLAG_PM_TEXT = '#';

        static final char FLAG_ONLINE = '$';
        static final char FLAG_OFFLINE = '&';
        static final char FLAG_REQ_ONLINE = '*';
        static final char FLAG_ALREADY_ONLINE = '+';

        public BroadCast(int port, String Ip, String name) {
            this.port = port;
            this.Ip = Ip;
            this.name = name;
        }

        public void SocketSend(String data) // 发送组播消息
        {
            try {
                byte[] buf = data.getBytes();
                DatagramPacket datagramPacket1 = new DatagramPacket(buf, buf.length);
                InetAddress address = InetAddress.getByName(Ip);
                datagramPacket1.setAddress(address);
                datagramPacket1.setPort(port);
                multicastSocket.send(datagramPacket1);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        public void SendMessage(String message) // 发送组播消息
        {
            SocketSend(FLAG_CHAT + this.name + ":" + message); // '#' + this.name + ":" + message
        }

        public void SendUserOnline() // 发送用户上线消息
        {
            SocketSend(FLAG_ONLINE + this.name); // '$' + this.name
        }

        public void SendUserOffline() // 发送用户下线消息
        {
            SocketSend(FLAG_OFFLINE + this.name); // '&' + this.name
        }

        public void ReqOnlineUser() // 请求在线用户
        {
            SocketSend(String.valueOf(FLAG_REQ_ONLINE)); // '*' 请求在线用户
        }

        public void SendAlreadyOnline() // 当前在线用户
        {
            SocketSend(FLAG_ALREADY_ONLINE + this.name); // '+' + this.name
        }

        public void StopChat() {
            SendUserOffline(); // 发送用户下线消息
            StopThread = true; // 用户下线
            while (StopThread == true) {
                dlm.removeAllElements();
            }
        }

        public void PrintMessageWT(String message) // 带时间的消息
        {
            receiveMesArea.append("[" + GetSystemTime() + "] ");
            receiveMesArea.append(message);
            receiveMesArea.append("\n");
            receiveMesArea.setCaretPosition(receiveMesArea.getText().length());
        }

        public void SaveScreen() throws IOException { // 保存聊天记录
            String msg = receiveMesArea.getText();
            FileOutputStream Note = new FileOutputStream(this.name + "的聊天记录.txt");
            PrintMessageWT("聊天记录保存地址:" + System.getProperty("user.dir") + "\\" + this.name + "的聊天记录.txt");
            Note.write(msg.getBytes());
            Note.close();
        }

        public void ClearScreen() {
            receiveMesArea.setText(""); // 清空接收消息文本域内容
        }

        public String GetSystemTime() {
            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); // 获取当前时间(格式yyyy-MM-dd HH:mm:ss)
            return sdf.format(new Date()); // 返回当前时间
        }

        public void run() { // 启动线程
            try {
                InetAddress address = InetAddress.getByName(Ip);

                multicastSocket = new MulticastSocket(this.port);
                multicastSocket.joinGroup(address);

                SendUserOnline(); // 发送用户上线消息
                ReqOnlineUser(); // 请求在线用户

                while (!StopThread) {
                    byte[] buf = new byte[1024];
                    DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length);

                    if (multicastSocket.isClosed() == false) {
                        multicastSocket.receive(datagramPacket);
                        String string_MS = new String(datagramPacket.getData(), 0, datagramPacket.getLength());

                        switch (string_MS.charAt(0)) {
                        case (FLAG_ONLINE): // '$'
                            string_MS = string_MS.substring(1, string_MS.length()); // 去掉第一个字符,获取用户名
                            // dlm.addElement(string_MS);
                            PrintMessageWT("系统提示:" + string_MS + " 上线!");
                            break;
                        case (FLAG_OFFLINE): // '&'
                            string_MS = string_MS.substring(1, string_MS.length());
                            dlm.removeElement(string_MS);
                            PrintMessageWT("系统提示:" + string_MS + " 下线!");
                            break;
                        case (FLAG_REQ_ONLINE): // '*'
                            SendAlreadyOnline();
                            break;
                        case (FLAG_ALREADY_ONLINE): // '+'
                            string_MS = string_MS.substring(1, string_MS.length());
                            boolean notfound = true;
                            for (int i = 0; i < dlm.size(); i++) {
                                if (dlm.get(i).equals(string_MS)) {
                                    notfound = false;
                                    break;
                                }
                            }

                            if (notfound == true) {
                                if (nameField.getText().equals(string_MS)) {
                                    JOptionPane.showMessageDialog(jf, "欢迎加入组播聊天室!!!", "提示!!!",
                                            JOptionPane.INFORMATION_MESSAGE);
                                }
                                dlm.addElement(string_MS);
                                // receiveMesArea.append("新加入用户:" + string_MS + "\n");
                                // receiveMesArea.append("目前总人數:" + String.valueOf(dlm.size()) + "\n");
                            }

                            int max = dlm.size(), min = 0;
                            int ran = (int) (Math.random() * (max - min) + min);
                            jlist.setSelectedIndex(ran);
                        }

                        boolean IsPM1 = false, IsPM2 = false;// 判断是否为私聊,默认不是
                        int num1 = 0, num2 = 0;
                        if (string_MS.charAt(0) == FLAG_CHAT) {// '#' 判断第一个字符是否相等
                            string_MS = string_MS.substring(1, string_MS.length());// 去掉第一个字符
                            for (int i = 0; i < string_MS.length(); i++) {// 私聊,判断@和#在哪个位置,获取姓名
                                if (string_MS.charAt(i) == FLAG_PM_USER) { // '@'
                                    num1 = i + 1;
                                    IsPM1 = true;// 是私聊
                                }
                                if (string_MS.charAt(i) == FLAG_PM_TEXT) { // '#'
                                    num2 = i;
                                }
                            }

                            String Chat_UserName = string_MS.substring(num1, num2++);// 获取私聊对象的姓名

                            if (IsPM1 == true) {// 是私聊
                                String PM_SenderName = string_MS.substring(0, num1 - 2);// 获取私聊对象的姓名
                                if (this.name.equals(Chat_UserName)) {// 是和我私聊
                                    PrintMessageWT("私聊消息-->   " + PM_SenderName + "@我:"
                                            + string_MS.substring(num2, string_MS.length()));
                                } else if (this.name.equals(PM_SenderName)) {// 自己发私聊消息
                                    PrintMessageWT("私聊消息-->   " + "我@" + Chat_UserName + ":"
                                            + string_MS.substring(num2, string_MS.length()));
                                } else {// 不是和我私聊
                                    IsPM2 = true;
                                }
                            }
                            if (IsPM1 == false && IsPM2 == false) { // 不是私聊
                                PrintMessageWT(string_MS);
                            }
                        }
                    }
                }

            } catch (Exception e) {
                e.printStackTrace();
            }

            try {
                multicastSocket.close();
            } catch (Exception e) {
                e.printStackTrace();
            }

            StopThread = false;
        }
    }
}
  • 写回答

1条回答 默认 最新

  • Kim_小星兴 2020-02-13 14:27
    关注

    用一个 Set 把上线的用户名保存下来~新用户上线前先查看Set有没有值,如果有则警告,没有则正常上线,下线时删除当前用户名;

    评论

报告相同问题?

悬赏问题

  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制