import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.StringTokenizer;
import javax.swing.AbstractButton;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;
public class Server {
//创建swing界面
private JFrame frame;
//文本域
private JTextArea contentArea;
private JTextField txt_message;
private JTextField txt_max;
private JTextField txt_port;
//按钮
private JButton btn_start;
private JButton btn_stop;
private JButton btn_send;
//面板
private JPanel northPanel;
private JPanel southPanel;
//滚动面板
private JScrollPane rightPanel;
private JScrollPane leftPanel;
private JSplitPane centerSplit;
// 在线用户列表模型
private JList userList;
private DefaultListModel listModel; //在在线用户列表模型实例化
private ServerSocket serverSocket; //声明一个服务器
private ServerThread serverThread; //声明服务器的线程
private ArrayList<ClientThread> clients; //数组列表
private boolean isStart = false;//
protected AbstractButton message; //消息按钮
/*消息的发送和接收都是
* 通过reader和writer来转换为字节流
* 在转换来读取*/
// 主方法,程序执行入口
public static void main(String[] args) {
new Server();
}
// 执行消息发送
public void send() {
if (!isStart) {
JOptionPane.showMessageDialog(frame, "服务器还未启动,不能发送消息!", "错误", JOptionPane.ERROR_MESSAGE);
return;
} //判断用户在不在线
if (clients.size() == 0) {
JOptionPane.showMessageDialog(frame, "没有用户在线,不能发送消息!", "错误", JOptionPane.ERROR_MESSAGE);
return;
} // 服务器消息里面去掉空格
String message = txt_message.getText().trim();
if (message == null || message.equals("")) {
//判断消息不能为空,返回错误
JOptionPane.showMessageDialog(frame, "消息不能为空!", "错误", JOptionPane.ERROR_MESSAGE);
return;
}
sendServerMessage(message);// 群发服务器消息
contentArea.append("服务器说:" + txt_message.getText() + "\r\n");
txt_message.setText(null);
}
// 构造方法以及界面
public Server() {
frame = new JFrame("服务器");
contentArea = new JTextArea(); //声明文本域
contentArea.setEditable(false); //设置不可编辑
contentArea.setForeground(Color.BLUE); //设置服务器文本域字体颜色
txt_message = new JTextField(); //声明文本框
//声明同时在线最大上限人数为30
txt_max = new JTextField("30");
//声明一个端口号的文本框,端口号为6666(和服务器的端口一样)
txt_port = new JTextField("6666");
btn_start = new JButton("启动");
btn_stop = new JButton("停止");
btn_send = new JButton("发送");
btn_stop.setEnabled(false); //设置不可编辑
//设置列表数据模型
listModel = new DefaultListModel();
//生命列表窗体(存放列表数据模型)
userList = new JList(listModel);
//声明下方面板
southPanel = new JPanel(new BorderLayout()); //设置边框布局
southPanel.setBorder(new TitledBorder("写消息"));
southPanel.add(txt_message, "Center");
southPanel.add(btn_send, "East");
leftPanel = new JScrollPane(userList);
leftPanel.setBorder(new TitledBorder("在线用户"));
rightPanel = new JScrollPane(contentArea);
rightPanel.setBorder(new TitledBorder("消息显示区"));
//中央消息显示区
centerSplit = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, rightPanel,leftPanel );
centerSplit.setDividerLocation(100);
northPanel = new JPanel();
northPanel.setLayout(new GridLayout(1, 6));
northPanel.add(new JLabel("人数上限"));
northPanel.add(txt_max);
northPanel.add(new JLabel("端口"));
northPanel.add(txt_port);
northPanel.add(btn_start);
northPanel.add(btn_stop);
northPanel.setBorder(new TitledBorder("配置信息"));
//添加各方面板的位置
frame.setLayout(new BorderLayout());
frame.add(northPanel, "North");
frame.add(centerSplit, "Center");
frame.add(southPanel, "South");
frame.setSize(600, 400);
//frame.setSize(Toolkit.getDefaultToolkit().getScreenSize());//设置全屏
////获取当前屏幕的宽和高
int screen_width = Toolkit.getDefaultToolkit().getScreenSize().width;
int screen_height = Toolkit.getDefaultToolkit().getScreenSize().height;
// 设置主窗体的位置
frame.setLocation((screen_width - frame.getWidth()) / 2,
(screen_height - frame.getHeight()) / 2);
// 设置可见
frame.setVisible(true);
// 关闭窗口时事件
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
if (isStart) {
closeServer();// 关闭服务器
}
System.exit(0);// 退出程序
}
});
// 文本框按回车键时事件
txt_message.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
send();
}
});
// 单击发送按钮时事件
btn_send.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
send();
}
});
// 单击启动服务器按钮时事件
btn_start.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (isStart) {
JOptionPane.showMessageDialog(frame, "服务器已处于启动状态,不要重复启动!",
"错误", JOptionPane.ERROR_MESSAGE);
return;
}
int max;
int port;
try {
try {
max = Integer.parseInt(txt_max.getText());
} catch (Exception e1) {
throw new Exception("人数上限为正整数!");
}
if (max <= 0) {
throw new Exception("人数上限为正整数!");
}
try {
port = Integer.parseInt(txt_port.getText());
} catch (Exception e1) {
throw new Exception("端口号为正整数!");
}
if (port <= 0) {
throw new Exception("端口号 为正整数!");
}
serverStart(max, port);
con
评论1
最新资源