java课程设计报告聊天室Word格式文档下载.docx
《java课程设计报告聊天室Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《java课程设计报告聊天室Word格式文档下载.docx(72页珍藏版)》请在冰点文库上搜索。
详细设计
⏹聊天室服务器端设计:
聊天室服务端主要包括7个文件,它们的功能如下:
(1)ChatServer.java:
包含名为ChatServer的public类,其主要功能为定义服务器端的界面,添加事件侦听与事件处理。
调用ServerListen类来实现服务端用户上线与下线的侦听,调用ServerReceive类来实现服务器端的消息的收发。
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
importjavax.swing.event.*;
import.*;
importjava.io.*;
/*
*聊天服务端的主框架类
*/
publicclassChatServerextendsJFrameimplementsActionListener{
publicstaticintport=8888;
//服务端的侦听端口
ServerSocketserverSocket;
//服务端Socket
Imageicon;
//程序图标
JComboBoxcombobox;
//选择发送消息的接受者
JTextAreamessageShow;
//服务端的信息显示
JScrollPanemessageScrollPane;
//信息显示的滚动条
JTextFieldshowStatus;
//显示用户连接状态
JLabelsendToLabel,messageLabel;
JTextFieldsysMessage;
//服务端消息的发送
JButtonsysMessageButton;
//服务端消息的发送按钮
UserLinkListuserLinkList;
//用户链表
//建立菜单栏
JMenuBarjMenuBar=newJMenuBar();
//建立菜单组
JMenuserviceMenu=newJMenu("
服务(V)"
);
//建立菜单项
JMenuItemportItem=newJMenuItem("
端口设置(P)"
newImageIcon("
face/98.gif"
));
JMenuItemstartItem=newJMenuItem("
启动服务(S)"
face/icon.gif"
JMenuItemstopItem=newJMenuItem("
停止服务(T)"
face/Uabrand.gif"
JMenuItemexitItem=newJMenuItem("
退出(X)"
face/messenger_big.gif"
JMenuhelpMenu=newJMenu("
帮助(H)"
JMenuItemhelpItem=newJMenuItem("
face/HelpCenter.gif"
//建立工具栏
JToolBartoolBar=newJToolBar();
//建立工具栏中的按钮组件
JButtonportSet;
//启动服务端侦听
JButtonstartServer;
JButtonstopServer;
//关闭服务端侦听
JButtonexitButton;
//退出按钮
//框架的大小
DimensionfaceSize=newDimension(400,600);
ServerListenlistenThread;
JPaneldownPanel;
GridBagLayoutgirdBag;
GridBagConstraintsgirdBagCon;
/**
*服务端构造函数
publicChatServer(){
init();
//初始化程序
//添加框架的关闭事件处理
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.pack();
//设置框架的大小
this.setSize(faceSize);
this.setVisible(true);
//设置运行时窗口的位置
DimensionscreenSize=Toolkit.getDefaultToolkit().getScreenSize();
this.setLocation((int)(screenSize.width-faceSize.getWidth())/2,
(int)(screenSize.height-faceSize.getHeight())/2);
this.setResizable(false);
this.setTitle("
聊天室服务端"
//设置标题
//为服务菜单栏设置热键'
V'
serviceMenu.setMnemonic('
//为端口设置快捷键为ctrl+p
portItem.setMnemonic('
P'
portItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P,InputEvent.CTRL_MASK));
//为启动服务快捷键为ctrl+s
startItem.setMnemonic('
S'
startItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,InputEvent.CTRL_MASK));
//为端口设置快捷键为ctrl+T
stopItem.setMnemonic('
T'
stopItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T,InputEvent.CTRL_MASK));
//为退出设置快捷键为ctrl+x
exitItem.setMnemonic('
X'
exitItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,InputEvent.CTRL_MASK));
//为帮助菜单栏设置热键'
H'
helpMenu.setMnemonic('
//为帮助设置快捷键为ctrl+p
helpItem.setMnemonic('
helpItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H,InputEvent.CTRL_MASK));
}
*程序初始化函数
publicvoidinit(){
ContainercontentPane=getContentPane();
contentPane.setLayout(newBorderLayout());
//添加菜单栏
serviceMenu.add(portItem);
serviceMenu.add(startItem);
serviceMenu.addSeparator();
serviceMenu.add(stopItem);
serviceMenu.add(exitItem);
jMenuBar.add(serviceMenu);
helpMenu.add(helpItem);
jMenuBar.add(helpMenu);
setJMenuBar(jMenuBar);
//初始化按钮
portSet=newJButton("
端口设置"
startServer=newJButton("
启动服务"
stopServer=newJButton("
停止服务"
);
exitButton=newJButton("
退出"
//将按钮添加到工具栏
toolBar.add(portSet);
toolBar.addSeparator();
//添加分隔栏
toolBar.add(startServer);
toolBar.add(stopServer);
toolBar.add(exitButton);
contentPane.add(toolBar,BorderLayout.NORTH);
//初始时,令停止服务按钮不可用
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=newJComboBox();
combobox.insertItemAt("
所有人"
0);
combobox.setSelectedIndex(0);
messageShow=newJTextArea();
messageShow.setEditable(false);
//添加滚动条
messageScrollPane=newJScrollPane(messageShow,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
messageScrollPane.setPreferredSize(newDimension(400,400));
messageScrollPane.revalidate();
showStatus=newJTextField(35);
showStatus.setEditable(false);
sysMessage=newJTextField(24);
sysMessage.setEnabled(false);
sysMessageButton=newJButton();
sysMessageButton.setText("
发送"
//添加系统消息的事件侦听
sysMessage.addActionListener(this);
sysMessageButton.addActionListener(this);
sendToLabel=newJLabel("
发送至:
"
messageLabel=newJLabel("
发送消息:
downPanel=newJPanel();
girdBag=newGridBagLayout();
downPanel.setLayout(girdBag);
girdBagCon=newGridBagConstraints();
girdBagCon.gridx=0;
girdBagCon.gridy=0;
girdBagCon.gridwidth=3;
girdBagCon.gridheight=2;
girdBagCon.ipadx=5;
girdBagCon.ipady=5;
JLabelnone=newJLabel("
"
girdBag.setConstraints(none,girdBagCon);
downPanel.add(none);
girdBagCon.gridy=2;
girdBagCon.insets=newInsets(1,0,0,0);
girdBag.setConstraints(sendToLabel,girdBagCon);
downPanel.add(sendToLabel);
girdBagCon.gridx=1;
girdBagCon.anchor=GridBagConstraints.LINE_START;
girdBag.setConstraints(combobox,girdBagCon);
downPanel.add(combobox);
girdBagCon.gridy=3;
girdBag.setConstraints(messageLabel,girdBagCon);
downPanel.add(messageLabel);
girdBagCon.gridx=1;
girdBag.setConstraints(sysMessage,girdBagCon);
downPanel.add(sysMessage);
girdBagCon.gridx=2;
girdBag.setConstraints(sysMessageButton,girdBagCon);
downPanel.add(sysMessageButton);
girdBagCon.gridy=4;
girdBag.setConstraints(showStatus,girdBagCon);
downPanel.add(showStatus);
contentPane.add(messageScrollPane,BorderLayout.CENTER);
contentPane.add(downPanel,BorderLayout.SOUTH);
//关闭程序时的操作
this.addWindowListener(
newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
stopService();
System.exit(0);
}
}
);
*事件处理
publicvoidactionPerformed(ActionEvente){
Objectobj=e.getSource();
if(obj==startServer||obj==startItem){//启动服务端
startService();
}
elseif(obj==stopServer||obj==stopItem){//停止服务端
intj=JOptionPane.showConfirmDialog(
this,"
真的停止服务吗?
"
JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);
if(j==JOptionPane.YES_OPTION){
stopService();
elseif(obj==portSet||obj==portItem){//端口设置
//调出端口设置的对话框
PortConfportConf=newPortConf(this);
portConf.show();
elseif(obj==exitButton||obj==exitItem){//退出程序
真的要退出吗?
System.exit(0);
elseif(obj==helpItem){//菜单栏中的帮助
//调出帮助对话框
HelphelpDialog=newHelp(this);
helpDialog.show();
elseif(obj==sysMessage||obj==sysMessageButton){//发送系统消息
sendSystemMessage();
*启动服务端
publicvoidstartService(){
try{
serverSocket=newServerSocket(port,10);
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);
catch(Exceptione){
//System.out.println(e);
userLinkList=newUserLinkList();
listenThread=newServerListen(serverSocket,combobox,
messageShow,showStatus,userLinkList);
listenThread.start();
*关闭服务端
publicvoidstopService(){
//向所有人发送服务器关闭的消息
sendStopToAll();
listenThread.isStop=true;
serverSocket.close();
intcount=userLinkList.getCount();
inti=0;
while(i<
count){
Nodenode=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);
mes