import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.net.*;
import java.io.*;
/*
* 聊天服务端的主框架类
*/
public static int port = 8888;//服务端的侦听端口
JLabel sendToLabel,messageLabel
;
JButton sysMessageButton
;//服务端消息的发送按钮
UserLinkList userLinkList;//用户链表
//建立菜单栏
//建立菜单组
//建立菜单项
//建立工具栏
//建立工具栏中的按钮组件
//框架的大小
ServerListen listenThread;
/**
* 服务端构造函数
*/
public ChatServer(){
init();//初始化程序
//添加框架的关闭事件处理
this.
setDefaultCloseOperation(JFrame.
EXIT_ON_CLOSE);
this.pack();
//设置框架的大小
this.setSize(faceSize);
//设置运行时窗口的位置
this.setLocation( (int) (screenSize.width - faceSize.getWidth()) / 2,
(int) (screenSize.height - faceSize.getHeight()) / 2);
this.setResizable(false);
this.setTitle("聊天室服务端"); //设置标题
//程序图标
icon = getImage("icon.gif");
this.setIconImage(icon); //设置程序图标
show();
//为服务菜单栏设置热键'V'
serviceMenu.setMnemonic('V');
//为端口设置快捷键为ctrl+p
portItem.setMnemonic ('P');
//为启动服务快捷键为ctrl+s
startItem.setMnemonic ('S');
//为端口设置快捷键为ctrl+T
stopItem.setMnemonic ('T');
//为退出设置快捷键为ctrl+x
exitItem.setMnemonic ('X');
//为帮助菜单栏设置热键'H'
helpMenu.setMnemonic('H');
//为帮助设置快捷键为ctrl+p
helpItem.setMnemonic ('H');
}
/**
* 程序初始化函数
*/
public void init(){
//添加菜单栏
serviceMenu.add (portItem);
serviceMenu.add (startItem);
serviceMenu.add (stopItem);
serviceMenu.add (exitItem);
jMenuBar.add (serviceMenu);
helpMenu.add (helpItem);
jMenuBar.add (helpMenu);
setJMenuBar (jMenuBar);
//初始化按钮
//将按钮添加到工具栏
toolBar.add(portSet);
toolBar.addSeparator();//添加分隔栏
toolBar.add(startServer);
toolBar.add(stopServer);
toolBar.addSeparator();//添加分隔栏
toolBar.add(exitButton);
//初始时,令停止服务按钮不可用
stopServer.setEnabled(false);
stopItem .setEnabled(false);
//为菜单栏添加事件监听
portItem.addActionListener(this);
startItem.addActionListener(this);
stopItem.addActionListener(this);
exitItem.addActionListener(this);
helpItem.addActionListener(this);
//添加按钮的事件侦听
portSet.addActionListener(this);
startServer.addActionListener(this);
stopServer.addActionListener(this);
exitButton.addActionListener(this);
combobox.insertItemAt("所有人",0);
combobox.setSelectedIndex(0);
messageShow.setEditable(false);
//添加滚动条
messageScrollPane.
setPreferredSize(new Dimension(400,
400));
messageScrollPane.revalidate();
showStatus.setEditable(false);
sysMessage.setEnabled(false);
sysMessageButton.setText("发送");
//添加系统消息的事件侦听
sysMessage.addActionListener(this);
sysMessageButton.addActionListener(this);
sendToLabel
= new JLabel("发送至:");
messageLabel
= new JLabel("发送消息:");
downPanel.setLayout(girdBag);
girdBagCon.gridx = 0;
girdBagCon.gridy = 0;
girdBagCon.gridwidth = 3;
girdBagCon.gridheight = 2;
girdBagCon.ipadx = 5;
girdBagCon.ipady = 5;
girdBag.setConstraints(none,girdBagCon);
downPanel.add(none);
girdBagCon.gridx = 0;
girdBagCon.gridy = 2;
girdBagCon.
insets = new Insets(1,
0,
0,
0);
girdBagCon.ipadx = 5;
girdBagCon.ipady = 5;
girdBag.setConstraints(sendToLabel,girdBagCon);
downPanel.add(sendToLabel);
girdBagCon.gridx =1;
girdBagCon.gridy = 2;
girdBag.setConstraints(combobox,girdBagCon);
downPanel.add(combobox);
girdBagCon.gridx = 0;
girdBagCon.gridy = 3;
girdBag.setConstraints(messageLabel,girdBagCon);
downPanel.add(messageLabel);
girdBagCon.gridx = 1;
girdBagCon.gridy = 3;
girdBag.setConstraints(sysMessage,girdBagCon);
downPanel.add(sysMessage);
girdBagCon.gridx = 2;
girdBagCon.gridy = 3;
girdBag.setConstraints(sysMessageButton,girdBagCon);
downPanel.add(sysMessageButton);
girdBagCon.gridx = 0;
girdBagCon.gridy = 4;
girdBagCon.gridwidth = 3;
girdBag.setConstraints(showStatus,girdBagCon);
downPanel.add(showStatus);
//关闭程序时的操作
this.addWindowListener(
stopService();
}
}
);
}
/**
* 事件处理
*/
if (obj == startServer || obj == startItem) { //启动服务端
startService();
}
else if (obj == stopServer || obj == stopItem) { //停止服务端
this,"真的停止服务吗?","停止服务",
stopService();
}
}
else if (obj == portSet || obj == portItem) { //端口设置
//调出端口设置的对话框
PortConf portConf = new PortConf(this);
portConf.show();
}
else if (obj == exitButton || obj == exitItem) { //退出程序
this,"真的要退出吗?","退出",
stopService();
}
}
else if (obj == helpItem) { //菜单栏中的帮助
//调出帮助对话框
Help helpDialog = new Help(this);
helpDialog.show();
}
else if (obj == sysMessage || obj == sysMessageButton) { //发送系统消息
sendSystemMessage();
}
}
/**
* 启动服务端
*/
public void startService(){
try{
messageShow.append("服务端已经启动,在"+port+"端口侦听...\n");
startServer.setEnabled(false);
startItem.setEnabled(false);
portSet.setEnabled(false);
portItem.setEnabled(false);
stopServer .setEnabled(true);
stopItem .setEnabled(true);
sysMessage.setEnabled(true);
}
//System.out.println(e);
}
userLinkList = new UserLinkList();
listenThread = new ServerListen(serverSocket,combobox,
messageShow,showStatus,userLinkList);
listenThread.start();
}
/**
* 关闭服务端
*/
public void stopService(){
try{
//向所有人发送服务器关闭的消息
sendStopToAll();
listenThread.isStop = true;
serverSocket.close();
int count = userLinkList.getCount();
int i =0;
while( i < count){
Node 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);
sysMessage.setEnabled(false);
messageShow.append("服务端已经关闭\n");
combobox.removeAllItems();
combobox.addItem("所有人");
}
//System.out.println(e);
}
}
/**
* 向所有人发送服务器关闭的消息
*/
public void sendStopToAll(){
int count = userLinkList.getCount();
int i = 0;
while(i < count){
Node node = userLinkList.findUser(i);
if(node == null) {
i ++;
continue;
}
try{
node.output.writeObject("服务关闭");
node.output.flush();
}
//System.out.println("$$$"+e);
}
i++;
}
}
/**
* 向所有人发送消息
*/
public void sendMsgToAll
(String msg
){
int count = userLinkList.getCount();//用户总数
int i = 0;
while(i < count){
Node node = userLinkList.findUser(i);
if(node == null) {
i ++;
continue;
}
try{
node.output.writeObject("系统信息");
node.output.flush();
node.output.writeObject(msg);
node.output.flush();
}
//System.out.println("@@@"+e);
}
i++;
}
sysMessage.setText("");
}
/**
* 向客户端用户发送消息
*/
public void sendSystemMessage(){
String toSomebody
= combobox.
getSelectedItem().
toString();
String message
= sysMessage.
getText() + "\n";
messageShow.append(message);
//向所有人发送消息
if(toSomebody.equalsIgnoreCase("所有人")){
sendMsgToAll(message);
}
else{
//向某个用户发送消息
Node node = userLinkList.findUser(toSomebody);
try{
node.output.writeObject("系统信息");
node.output.flush();
node.output.writeObject(message);
node.output.flush();
}
//System.out.println("!!!"+e);
}
sysMessage.setText("");//将发送消息栏的消息清空
}
}
/**
* 通过给定的文件名获得图像
*/
getClassLoader();
url = urlLoader.findResource(filename);
image
= Toolkit.
getDefaultToolkit().
getImage(url
);
try {
mediatracker.addImage(image, 0);
mediatracker.waitForID(0);
}
image = null;
}
if (mediatracker.isErrorID(0)) {
image = null;
}
return image;
}
public static void main
(String[] args
) {
ChatServer app = new ChatServer();
}
}