局域网聊天室Java课程设计.docx
《局域网聊天室Java课程设计.docx》由会员分享,可在线阅读,更多相关《局域网聊天室Java课程设计.docx(74页珍藏版)》请在冰豆网上搜索。
![局域网聊天室Java课程设计.docx](https://file1.bdocx.com/fileroot1/2023-7/21/09349502-07d5-4e95-9064-226b70aae490/09349502-07d5-4e95-9064-226b70aae4901.gif)
局域网聊天室Java课程设计
《面向对象程序设计》
课程设计报告
题目:
局域网聊天室程序设计
院〔系〕:
信息科学与工程学院
专业班级:
计算机科学与技术1201班
学生某某:
程伟
学号:
20121183011
指导教师:
吴奕
2014年12月29日至2015年1月9日
华中科技大学武昌分校制
面向对象程序设计课程设计任务书
一、设计〔调查报告/论文〕题目
局域网聊天室程序设计
二、设计〔调查报告/论文〕主要内容
内容:
用来提供局域网中用户之间的交互通讯,使用Eclipse与JDK1.6工具,操作系统为WINDOWS,采用面向对象方法完成,包括总体设计、详细设计、编码实现、测试。
运用套接字Socket连接技术,实现客户端的套接字对象和服务器端的套接字对象之间的输入输出流的连接,达到数据报通信的目的
根本功能与要求:
实现聊天室服务器端的要求:
①设计实现在特定端口上进展侦听,等待客户端的连接。
②用户确定服务器的侦听端口。
③系统能向已经连接到服务器端的用户发送系统消息。
④系统能统计在线人数。
⑤当系统停止服务时,设计程序应能断开所有的用户连接。
实现聊天室客户端的要求:
①系统能连接已经开启聊天服务的服务端。
②用户确定要连接服务器端的IP地址与端口号,连接后系统应能提供显示的用户名。
③当服务器端开启的话,实现用户的登录与注销。
④用户可以通过设计的系统向所有人或者某一个人发送消息。
三、原始资料
1.《面向对象程序设计课程设计》指导书
2.耿祥义.JAVA大学实用教程.:
清华大学,2009.
四、要求的设计〔调查/论文〕成果
五、进程安排
布置任务,查找资料、需求分析1天
总体设计1天
详细设计
编制源程序实现
测试与修改1天
撰写课设报告2天
六、主要参考资料
[1]X广彬.Java课程设计案例精编〔第二版〕.:
清华大学,2011.
[2]耿祥义.Java课程设计〔第二版〕.:
清华大学,2008.
[3]耿祥义.JAVA大学实用教程.:
清华大学,2009.
[4]邹林达.陈国君Java2程序设计根底.:
清华大学,2010.
[5]邹林达.Java2程序设计根底实验指导.:
清华大学,2010.
指导教师〔签名〕:
20年月日
1需求与总体设计
本系统所要实现的主要功能是为广阔用户提供一个借助网络进展人际交往的平台。
因为服务端采用多线程,所以性能有很大提升。
因为服务端和客户端之间采用TCP协议进展网络通信,建立的是可靠的、端到端的网络连接,所以可靠性和安全性都很好。
1.2.1服务端系统
2详细设计
聊天室服务器端的设计
2.1.1ChatServer类
包含名为ChatServer的public类,其主要功能为定义服务器端的界面,添加时间监听与时间处理。
调用ServerListen类来实现服务端用户上线与下线的监听,调用ServerListen来实现服务器端的消息收发。
2.1.2ServerListen类
该类实现服务器用户上线与下线的监听。
该类对用户上线下线的监听是通过调用用户链表类〔UserLinkList〕来实现的。
当用户上线与下线情况发生变化时,该类会对主类的界面进展相应的修改。
2.1.3ServerReceive类
该类是实现服务器消息收发的类,该类分别定义了向某用户与所有人发送消息的方法,发送的消息会显示在主界面类的街面上。
2.1.4PortConf类
该类继承自Jdialog,是用户对服务器端监听端口进展修改配置的类。
2.1.5Help类
服务端程序帮助类。
2.1.6UserLinkList类
用户链表节点的具体实现类。
该类通过构造函数构造用户链表,定义了添加用户、删除用户、返回用户数、根据用户名查找用户、根据索引查找用户这5个方法。
2.1.7Node类
用户链表的节点类,定义了链表中的用户。
该类与前面所讲的链表节点Node类的功能相当
2.2.1ChatClient类
包含名为ChatClient的public类,其主要功能为定义客户端的界面,添加时间监听与事件处理。
该类定义了Connect〔〕与DisConnect〔〕方法实现与客户端的连接与断开连接。
当登陆到指定的服务器时,调用ClientReceive类实现消息收发,同时该类还定义了SendMessaga〔〕方法来其他用户发送带有表情的消息或悄悄话。
2.2.2ConnectConf类
该类继承自Jdialog,是用户对所有要连接的服务器IP与监听端口进展修改配置的类。
2.2.3UserConf类
该类继承自Jdialog,是用户对到服务器时所显示的用户名进展修改配置的类。
2.2.4Help类
客户端程序的帮助类。
2.2.5ClientReceive类
该类是实现服务器端与客户端消息收发的类。
3编码实现
3.1.1ChatServer类
包含名为ChatServer的public类,其主要功能为定义服务器端的界面,添加时间监听与时间处理。
调用ServerListen类来实现服务端用户上线与下线的监听,调用ServerListen来实现服务器端的消息收发。
/*聊天服务端的主框架类*/
publicclassChatServerextendsJFrameimplementsActionListener{
privatestaticfinallongserialVersionUID=1L;
publicstaticintport=8888;//服务端的侦听端口
ServerSocketserverSocket;//服务端Socket
oBoxbobox;//选择发送消息的承受者
JTextAreamessageShow;//服务端的信息显示
JScrollPanemessageScrollPane;//信息显示的滚动条
JTextFieldshowStatus;//显示用户连接状态
JLabelsendToLabel,messageLabel;
JTextFieldsysMessage;//服务端消息的发送
uttonsysMessageButton;//服务端消息的发送按钮
UserLinkListuserLinkList;//用户链表
//建立菜单栏
JMenuBarjMenuBar=newJMenuBar();
//建立菜单组
JMenuserviceMenu=newJMenu("服务(V)");
//建立菜单项
JMenuItemportItem=newJMenuItem("端口设置(P)");
JMenuItemstartItem=newJMenuItem("启动服务(S)");
JMenuItemstopItem=newJMenuItem("停止服务(T)");
JMenuItemexitItem=newJMenuItem("退出(X)");
JMenuhelpMenu=newJMenu("帮助(H)");
JMenuItemhelpItem=newJMenuItem("帮助(H)");
//建立工具栏
JToolBartoolBar=newJToolBar();
//建立工具栏中的按钮组件
uttonportSet;//启动服务端侦听
uttonstartServer;//启动服务端侦听
uttonstopServer;//关闭服务端侦听
uttonexitButton;//退出按钮
//框架的大小
DimensionfaceSize=newDimension(400,600);
ServerListenlistenThread;
JPaneldownPanel;
GridBagLayoutgirdBag;
GridBagConstraintsgirdBagCon;
/**服务端构造函数*/
publicChatServer(){
init();//初始化程序
//添加框架的关闭事件处理
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.pack();
//设置框架的大小
this.setSize(faceSize);
//设置运行时窗口的位置
DimensionscreenSize=Toolkit.getDefaultToolkit().getScreenSize();
this.setLocation((int)(screenSize.width-faceSize.getWidth())/2,
(int)(screenSize.height-faceSize.getHeight())/2);
this.setResizable(false);
this.setTitle("聊天室服务端");//设置标题
setVisible(true);
//为服务菜单栏设置热键'V'
serviceMenu.setMnemonic('V');
//为端口设置快捷键为ctrl+p
portItem.setMnemonic('P');
(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('H');
//为帮助设置快捷键为ctrl+p
helpItem.setMnemonic('H');
helpItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H,InputEvent.CTRL_MASK));
}
/***程序初始化函数*/
publicvoidinit(){
ContainercontentPane=getContentPane();
contentPane.setLayout(newBorderLayout());
//添加菜单栏
serviceMenu.add(portItem);
serviceMenu.add(startItem);
serviceMenu.add(stopItem);
serviceMenu.add(exitItem);
jMenuBar.add(serviceMenu);
helpMenu.add(helpItem);
jMenuBar.add(helpMenu);
setJMenuBar(jMenuBar);
//初始化按钮
portSet=newutton("端口设置");
startServer=newutton("启动服务");
stopServer=newutton("停止服务");
exitButton=newutton("退出");
//将按钮添加到工具栏
toolBar.add(portSet);
toolBar.addSeparator();//添加分隔栏
toolBar.add(startServer);
toolBar.add(stopServer);
toolBar.addSeparator();//添加分隔栏
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);
bobox=newoBox();
bobox.insertItemAt("所有人",0);
bobox.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=newutton();
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=newGridBagConstraints();
girdBagCon.gridx=0;
girdBagCon.gridy=2;
girdBagCon.insets=newInsets(1,0,0,0);
girdBagCon.ipadx=5;
girdBagCon.ipady=5;
girdBag.setConstraints(sendToLabel,girdBagCon);
downPanel.add(sendToLabel);
girdBagCon=newGridBagConstraints();
girdBagCon.gridx=1;
girdBagCon.gridy=2;
girdBagCon.anchor=GridBagConstraints.LINE_START;
girdBag.setConstraints(bobox,girdBagCon);
downPanel.add(bobox);
girdBagCon=newGridBagConstraints();
girdBagCon.gridx=0;
girdBagCon.gridy=3;
girdBag.setConstraints(messageLabel,girdBagCon);
downPanel.add(messageLabel);
girdBagCon=newGridBagConstraints();
girdBagCon.gridx=1;
girdBagCon.gridy=3;
girdBag.setConstraints(sysMessage,girdBagCon);
downPanel.add(sysMessage);
girdBagCon=newGridBagConstraints();
girdBagCon.gridx=2;
girdBagCon.gridy=3;
girdBag.setConstraints(sysMessageButton,girdBagCon);
downPanel.add(sysMessageButton);
girdBagCon=newGridBagConstraints();
girdBagCon.gridx=0;
girdBagCon.gridy=4;
girdBagCon.gridwidth=3;
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.setVisible(true);
}
elseif(obj==exitButton||obj==exitItem){//退出程序
intj=JOptionPane.showConfirmDialog(
this,"真的要退出吗?
","退出",
JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);
if(j==JOptionPane.YES_OPTION){
stopService();
System.exit(0);
}
}
elseif(obj==helpItem){//菜单栏中的帮助
//调出帮助对话框
HelphelpDialog=newHelp(this);
helpDialog.setVisible(true);
}
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,bobox,
messageShow,showStatus,userLinkList);
listenThread.start();
}
/***关闭服务端*/
p