📄 chatserver.java
字号:
package viewtuba1;
import java.awt.ComponentOrientation;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JToolBar;
import javax.swing.KeyStroke;
import control.ServerListen;
import control.ServerReceive;
import control.UserLinkList;
import model.Node;
import java.net.*;
import java.io.*;
public class ChatServer extends JFrame {
private JTextField textField;
private JComboBox comboBox;
private JTextArea textArea;
ServerSocket serverSocket;
public static int port = 8888;
final JButton portSet;
final JButton startServer;
UserLinkList userLinkList;
final JButton stopServer;
final JButton sysMessageButton;
ServerListen listenThread;
JMenuItem portItem;
Node node;
JMenuItem startItem;
JMenuItem stopItem;
JMenuItem exitItem;
JLabel showStatus_1;
/**
* Launch the application
*
* @param args
*/
public static void main(String args[]) {
try {
ChatServer frame = new ChatServer();
frame.setVisible(true);
frame.setTitle("聊天室服务端");
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Create the frame
*/
public ChatServer() {
super();
getContentPane().setLayout(null);
setBounds(100, 100, 418, 520);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JMenuBar menuBar = new JMenuBar();
final JMenu menu = new JMenu("服务(V)");
menu.setMnemonic('V');
portItem = new JMenuItem("端口设置(P)");
portItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P,
InputEvent.CTRL_MASK));
portItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
new PortConf().main(null);
}
});
startItem = new JMenuItem("启动服务(S)");
startItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,
InputEvent.CTRL_MASK));
startItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
startService();
}
});
stopItem = new JMenuItem("停止服务(T)");
stopItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T,
InputEvent.CTRL_MASK));
stopItem.setEnabled(false);
stopItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
int i = JOptionPane.showConfirmDialog(null, "really stop?",
"stop service", JOptionPane.YES_OPTION,
JOptionPane.QUESTION_MESSAGE);
if (i == JOptionPane.YES_OPTION) {
stopService();
sendStopToAll();
}
}
});
exitItem = new JMenuItem("退出(X)");
exitItem.setMnemonic('X');
exitItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
stopService();
sendStopToAll();
dispose();
}
});
final JMenu helpMenu = new JMenu("帮助(H)");
helpMenu.setMnemonic('H');
JMenuItem helpItem = new JMenuItem("帮助(H)");
// helpItem.setMnemonic('H');
helpItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H,
InputEvent.CTRL_MASK));
helpItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
new HelpServer().main(null);
}
});
setJMenuBar(menuBar);
menu.add(portItem);
menu.add(startItem);
menu.add(stopItem);
menu.addSeparator();
menu.add(exitItem);
helpMenu.add(helpItem);
menuBar.add(menu);
menuBar.add(helpMenu);
final JToolBar toolBar = new JToolBar();
toolBar.setBounds(0, 0, 435, 32);
getContentPane().add(toolBar);
final JPanel panel = new JPanel();
panel.setLayout(null);
toolBar.add(panel);
portSet = new JButton();
portSet.setText("端口设置");
portSet.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
new PortConf().main(null);
}
});
portSet.setBounds(2, 0, 87, 26);
panel.add(portSet);
startServer = new JButton();
startServer.setText("启动服务");
startServer.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
startService();
}
});
startServer.setBounds(108, 0, 87, 26);
panel.add(startServer);
stopServer = new JButton();
stopServer.setText("停止服务");
stopServer.setEnabled(false);
stopServer.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
int i = JOptionPane.showConfirmDialog(null, "真的要停止服务吗?",
"停止服务", JOptionPane.YES_OPTION,
JOptionPane.QUESTION_MESSAGE);
if (i == JOptionPane.YES_OPTION) {
stopService();
sendStopToAll();
}
}
});
stopServer.setBounds(201, 0, 87, 26);
panel.add(stopServer);
final JButton exitButton = new JButton();
exitButton.setText("退出");
exitButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
stopService();
sendStopToAll();
dispose();
}
});
exitButton.setBounds(324, 0, 64, 26);
panel.add(exitButton);
final JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(5, 38, 401, 327);
getContentPane().add(scrollPane);
textArea = new JTextArea();
textArea.setEditable(false);
scrollPane.setViewportView(textArea);
final JLabel label = new JLabel();
label.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
label.setText("发送至:");
label.setBounds(10, 379, 60, 22);
getContentPane().add(label);
comboBox = new JComboBox();
comboBox.insertItemAt("所有人", 0);
comboBox.setSelectedIndex(0);
comboBox.setBounds(81, 380, 69, 21);
getContentPane().add(comboBox);
final JLabel label_1 = new JLabel();
label_1.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
label_1.setText("发送消息:");
label_1.setBounds(10, 416, 69, 15);
getContentPane().add(label_1);
textField = new JTextField();
textField.setBounds(81, 413, 221, 21);
getContentPane().add(textField);
sysMessageButton = new JButton();
sysMessageButton.setText("发送");
sysMessageButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
sendSystemMessage();
}
});
sysMessageButton.setBounds(316, 412, 69, 23);
getContentPane().add(sysMessageButton);
final JLabel showStatus = new JLabel();
showStatus.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
showStatus.setText("在线人数:");
showStatus.setBounds(10, 442, 60, 22);
getContentPane().add(showStatus);
showStatus_1 = new JLabel();
showStatus_1.setBounds(71, 442, 91, 22);
getContentPane().add(showStatus_1);
//
}
public void startService() {
try {
serverSocket = new ServerSocket(port, 10);
textArea.append("服务器已经启动,在" + port + "端口侦听...\n");
startServer.setEnabled(false);
startItem.setEnabled(false);
portSet.setEnabled(false);
portItem.setEnabled(false);
stopServer.setEnabled(true);
stopItem.setEnabled(true);
textField.setEnabled(true);
} catch (Exception e) {
e.printStackTrace();
}
userLinkList = new UserLinkList();
listenThread = new ServerListen(serverSocket, comboBox, textArea,
showStatus_1, userLinkList);
listenThread.start();
}
public void stopService() {
try {
sendStopToAll();
listenThread.isStop = true;
serverSocket.close();
int count = userLinkList.getCount();
int i = 0;
while (i < count) {
node = userLinkList.findUser(i);
node.input.close();
node.output.close();
node.socket.close();
i++;
}
stopServer.setEnabled(false);
stopItem.setEnabled(false);
startServer.setEnabled(true);
startItem.setEnabled(true);
portSet.setEnabled(true);
portItem.setEnabled(true);
textField.setEnabled(false);
textArea.append("服务器已经关闭!\n");
comboBox.removeAllItems();
comboBox.addItem("所有人");
} catch (Exception e) {
e.printStackTrace();
}
}
public void sendStopToAll() {
int count = userLinkList.getCount();
int i = 0;
while (i < count) {
node = userLinkList.findUser(i);
if (node == null) {
i++;
continue;
}
try {
node.output.writeObject("服务关闭");
node.output.flush();
} catch (Exception e) {
e.printStackTrace();
}
i++;
}
}
public void sendMsgToAll(String msg) {
int count = userLinkList.getCount();
int i = 0;
while (i < count) {
node = userLinkList.findUser(i);
if (node == null) {
i++;
continue;
}
try {
node.output.writeObject("系统信息");
node.output.flush();
node.output.writeObject(msg);
node.output.flush();
} catch (Exception e) {
e.printStackTrace();
}
i++;
}
textField.setText("");
}
public void sendSystemMessage() {
String s1 = comboBox.getSelectedItem().toString();
String s2 = textField.getText() + "\n";
textArea.append(s2);
if (s1.equalsIgnoreCase("所有人")) {
sendMsgToAll(s2);
} else {
Node node = userLinkList.findUser(s1);
try {
node.output.writeObject("系统信息");
node.output.flush();
node.output.writeObject(s2);
node.output.flush();
} catch (Exception eo) {
eo.printStackTrace();
}
textField.setText("");
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -