用户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;
}
}
}