版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本文格式为Word版,下载可任意编辑——JAVA课程设计实验报告中南大学
《面向对象》课程设计
题
目
"闲聊室'课程设计(java语言)
学生姓名
学生学号
专业班级
指导教师
完成时间
目目
录
第一章
闲聊室的描述33
1.1闲聊室的设计要求31.2闲聊室的根本功能31.3设计所用参考资料6其次章
闲聊室的设计62.1闲聊室的粗略设计分析62.2闲聊室的概括设计分析7第三章
闲聊室的实现10
3.1闲聊室所使用的类及功能的实现10
第四章
闲聊室的运行30
第五章课程设计总结31
5.1开发中所遇到的问题315.2问题分析与解决方法325.3阅历与教训32
第一章
闲聊室的描述1.1闲聊室的设要求
当今社会,网络技术越来加倍展,可以说,二十一世纪就是网络的世纪。网络迅猛进展,势不成挡。为了实现资源共享,各式各样的网站进展急速,各种各样的闲聊工具不断更新。某公司梦想通过一个闲聊工具加强员工和客户之间的沟通和交流。所以制作一个闲聊室势在必行。
为了实现一个更好的网络交互平台,各用户之间能够实时便当的传递信息,按照用户对系统的要求不同,可以在闲聊室里实现公共闲聊,也可以邀几个私交好友私聊,同时供给了两个用户之间能够传送文件。本系统是基于便当用户闲聊,传递信息,共享资源,所以系统的功能主要是从以上几个模块着手。
本工程主要是利用JAVA语言制作一个闲聊室,采用的是客户/服务器。
二层的C/S布局是指以单一的服务器和局域网为核心,能通过客户端与用户举行直接对话。主要有二大功能:一是它用于检查用户从键盘等输入的数据,显示应用输出的数据。为使用户能直观地举行操作,一般要使用图形用户接口(GUI),操作简朴、易学易用。在变更用户接口时,只需改写显示操纵和数据检查程序,而不影响其他。检查的内容也只限于数据的形式和值的范围,不包括有关业务本身的处理规律。典型的C/S布局有以下特点:
1、服务器负责数据管理及程序处理。
2、客户机负责界面描述和界面显示。
3、客户机向服务器提出处理要求。
4、服务器响应将处理结果返回客户机。
5、使网络数据流量最少。
11.
2闲聊室的根本功能1.用户注册
2.用户登录3.在线用户列表4.用户公聊5.用户私聊6.好友信息维护7.私聊信息的维护8.登录日志的维护9.用户注销扩展功能(假设完整实现一个扩展功能,适当加分):
1.可以切换不同的界面风格2.用户可以更改个人资料,探索密码3.表情闲聊4.文件传递5.公聊信息的维护用户注册第一次用户需要供给个人注册信息,注册的用户名不能重复,密码长度不能少于6位,个人信息务必供给完整,并且存储在数据库中。
用户登录用户输入用户名和密码,提交给将服务器端确实认,根据从服务器中传过来确实认信息,判断用户登录的处境。并且把此次登录的时间及登录的IP记录在服务器。
假设用户名和密码正确的话,那么登录闲聊室主界面;假设已经在线,那么输出已经在线;否那么输出用户名和密码错误,需要重新登录或者注册。
在线用户列表用户登录之后,需要知道系统中,有哪些用户在线,这样可以便当用户选择与个别用户私聊和传送文件,也可以举行公聊。
用户公聊用户输入的用户名和密码都正确后,那么进入闲聊室。闲聊主界面主要由四大版块组成:公聊的闲聊信息、在线用户列表、好友列表,系统消息和闲聊的一些操作。
闲聊信息版块设计思想:一种就是将客户的闲聊信息写入数据库,一种是将其写入向量中。在本次工程中,要求学员把客户的闲聊信息写入数据库中。
用户私聊假设两个人聊的话题对比隐秘,不想被其他人看到,就要使用私聊。在这里,假设说话对象是全体人的话,不能选择私聊;从当前好友列表中选择了一个用户之后,那么私聊对话框理应弹出来。
文件传递两个用户在闲聊过程中,可能需要相互间传送文件。象用户闲聊信息和在线用户这样一些信息都是保存在服务器端,然后每个客户读取服务器端向量中的内容,此时服务器与客户端的联系是一对多的,而传送文件是一对一的。所以直接传送,不需要经过服务器端保存。
好友信息维护在闲聊过程中,用户可以选择闲聊室的用户加为自己的好友。对于加为好友的用户,可以选择与其举行私聊。私聊的信息用文件保存在客户端。该模块理应包括:
添加好友删除好友私聊信息的维护假设两个人聊的话题对比隐秘,不想被其他人看到,就要使用私聊。而且只有好友之间才能举行私聊。要与某用户举行私聊,务必把对方加为好友。与好友之间的闲聊信息,理应以文件的方式存储在客户端,不显示在公聊的版面上。
登录日志的维护用户每次登录之后,都记录下用户的登录信息,如登录的时间日期,登陆的IP等。便当用户察觉是否号码被盗用。
用户注销用户可以注销其身份,对于注销后的用户务必在数据库中删除其相应的信息。
31.3设计所用参考资料
Java编程思想(第四版)(机械工业出版社)
Java程序设计与问题解决(人民邮电出版社)
Java语言最新使用案例教程(清华大学出版社)
Java2应用开发指南(其次版)(电子工业出版社)
JDK-API-1.5中文版网上查阅资料
其次章
闲聊室的设计2.1闲聊室的粗略设计分析闲聊系统平台应有两个片面组成:服务端和客户端。服务端主要完成用户信息的存储、客户端命令的采纳与响应以及发送系统消息、信息转发、踢人等服务端应有的功能。客户端主要完成闲聊信息的发送与采纳、登录、注销等功能。
此c/s系统使用的是TCP/IP协议,应用了如下通讯模式:
22
.2闲聊室的概括设计分析根据课程设计的要求及工程的需求分析,闲聊程序应实现以下几项功能:登录、注册、公聊、私聊、系统消息、踢人、文件传送、注销等。
当客户程序需要与服务器程序通讯的时候,客户程序在客户机创造一个socket对象。创造了一个Socket对象后,那么它可以通过调用Socket的getInputStream()方法从服务程序获得输入流读传送来的信息,也可以通过调用Socket的getOutputStream()方法获得输出流来发送消息。
由于Client使用了流套接字,所以服务程序也要使用流套接字。这就要创造一个ServerSocket对象,接下来服务程序进入无限循环之中,无限循环从调用ServerSocket的accept()方法开头,在调用开头后accept()方法将导致调用线程阻塞直到连接建立。在建立连接后accept()返回一个最近创造的Socket对象,该Socket对象绑定了客户程序的IP地址或端口号。由于存在单个服务程序与多个客户程序通讯的可能,服务程序循环检测是否有客户连接到服务器上,假设有,那么创造一个线程来服务这个客户,以此完成对客户端的监听。
概括流程如下图所示:
未注册用户:
主界面:
已注册用户:
开头终止读取服务器IP接收用户信息判断信息
显示注册界面
显示主界面
NoYes
写入服务器数据库公聊私聊注销文件传输用户列表主界面
第三章
闲聊室的实现33.1闲聊室所使用的类及功能的实现客户端:
序列化后用来传递用户信息的类:
classUserimplementsSerializable{
StringName;//用户名
StringPassword;//密码
StringEmail;//e-mail
StringAge;//年龄
Stringsex;//性别
StringMessage;//要传递的信息
StringCommand;//命令标识
VectorvectorUserList;//在线用户列表}这个经过序列化后可以用ObjectOutputStream和ObjectInputStream流来传递信息,而不用一行一行的读取信息。
登录界面类:
publicclassLoginextendsJFrameimplementsActionListener{....//界面组件及其他变量声明publicLogin()
{...读取服务器IP接收用户名及密码判断密码
显示登录界面
显示主界面
NoYes开头终止
..//界面组件初始化try
{
fsread=new(c:\\ServerIPaddress.txt);
InputStreamReaderinputread=newInputStreamReader(fsread);
BufferedReaderbfread=newBufferedReader(inputread);
ServerIPaddress=bfread.readLine();
fsread.close();
toServer=newSocket(ServerIPaddress,1207);
}
catch(IOExceptione){}
//服务器IP地址读取及连接的建立publicvoidactionPerformed(ActionEvente){
if(e.getSource()==button1)
{
dispose();
newCheckin(toServer);
}
if(e.getActionCommand().equals(登陆))
{
if(textField1.getText().equals())
{
JOptionPane.showMessageDialog(null,用户名不能为空!);
}
else{
try{
Useruser=newUser();
Useruserlogin=newUser();
user.Name=textField1.getText();
user.Password=textField2.getText();
user.Command=Enter;
streamToServer=newObjectOutputStream(toServer.getOutputStream());
streamFromServer=newObjectInputStream(toServer.getInputStream());
streamToServer.writeObject((User)user);
streamToServer.flush();
userlogin=(User)streamFromServer.readObject();
if(userlogin.Command.equals(Enter))
{
newMainFrame(toServer,user.Name);
dispose();
}
elseJOptionPane.showMessageDialog(null,用户名或密码错误!);
textField1.setText();
textField2.setText();
}catch(Exceptionee){JOptionPane.showMessageDialog(null,连接错误!);}
}
try{
streamToServer.close();
streamFromServer.close();
}catch(Exceptionee){}
}
}
//按钮动作及对服务器命令的响应
publicstaticvoidmain(Stringargs[]){
JFrame.setDefaultLookAndFeelDecorated(true);
Fontfont=newFont(JFrame,Font.PLAIN,14);
Enumerationkeys=UIManager.getLookAndFeelDefaults().keys();
while(keys.hasMoreElements()){
Objectkey=keys.nextElement();
if(UIManager.get(key)instanceofFont)UIManager.put(key,font);
}
newLogin();
}
//main方法}注册界面类:
publicclassCheckinextendsJFrame
implementsActionListener{......
//界面组件及其他变量声明publicCheckin(SockettoServer)
{.....
//界面组件初始化try{ToServer=toServer;
streamToServer=newObjectOutputStream(ToServer.getOutputStream());
streamFromServer=newObjectInputStream(ToServer.getInputStream());}catch(Exceptione){}
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
//将Login中建立的socket做参数传递给CheckinpublicvoidactionPerformed(ActionEvente){
if(e.getActionCommand().equals(注册))
{
for(intt=0;t==0;){
if(textField1.getText().equals())
{
JOptionPane.showMessageDialog(null,用户名不能为空!);
t=1;
}
elseif(textField3.getText().equals(textField2.getText())==false)
{
JOptionPane.showMessageDialog(null,密码不一致!);
t=1;
}else{
Useruser=newUser();
user.Name=textField1.getText();
user.Password=textField2.getText();
user.Age=textField4.getText();
user.Email=textField5.getText();
user.sex=(String)checkboxGroup1.getSelectedCheckbox().getLabel();
user.Command=Login;
try{
streamToServer.writeObject((User)user);
fromServerMessage=(User)streamFromServer.readObject();
}catch(Exceptionee){JOptionPane.showMessageDialog(null,数据发送错误!);}
if(fromServerMessage.Command.equals(Login))
{
dispose();
newMainFrame(ToServer,user.Name);
}
if(fromServerMessage.Command.equals(Repeat))
{
JOptionPane.showMessageDialog(null,用户名已存在!);
t=1;
}
}
}
}
if(e.getActionCommand().equals(取消))
{
dispose();
newLogin();
}
}
//按钮动作的添加及对服务器的信息传//递和响应}主界面类:
publicclassMainFrameextendsJFrameimplementsActionListener,Runnable{
.....
//界面组件及其他变量声明publicMainFrame(SockettoServer,Stringname){
MainFrame1(toServer,name);
//构造函数,其中toServer、name为参数
}
publicvoidMainFrame1(SockettoServer,Stringname){....
try{
ToServer=toServer;
streamToServer=newObjectOutputStream(ToServer.getOutputStream());
streamFromServer=newObjectInputStream(ToServer.getInputStream());
fromServerMessage=(User)streamFromServer.readObject();
streamToServer.flush();
vectorUserList1=(Vector)fromServerMessage.vectorUserList;
vectorUserList.setListData(vectorUserList1);
}catch(Exceptionee){JOptionPane.showMessageDialog(null,3);}
Threadthread=newThread(this);
thread.start();
}
//建立连接并启动监听线程publicvoidrun(){
try{
for(intt=1;;){
UsercommandFromServer=(User)streamFromServer.readObject();
Stringcommand=commandFromServer.Command;
if(command.equals(PublicChat)){
textArea2.append(commandFromServer.Name+对大家说:+commandFromServer.Message);
}
if(command.equals(PrivateChat)){
textArea2.append(commandFromServer.Name+对你说:+commandFromServer.Message);
}
if(command.equals(add)||command.equals(lessen)){
textArea2.append(commandFromServer.Name+对大家说:大家好!我来了);
vectorUserList.setListData(vectorUserList1);
}
if(command.equals(kick)){
lessen();
}
if(command.equals(SystemMessage)){
textArea2.append(系统消息:+commandFromServer.Message);
}
JOptionPane.showMessageDialog(null,用户名不能为空!);t=0;
continue;
}
}catch(Exceptione){}
}
//监听线程对服务器信息的处理及响应
publicvoidactionPerformed(ActionEvente){
if(e.getActionCommand().equals(公聊))
sendPublicMessage();
if(e.getSource()==button2)
sendPraviteMessage();
if(e.getActionCommand().equals(注销)){
lessen();
dispose();
try{
streamToServer.close();
streamFromServer.close();
ToServer.close();
}catch(Exceptionee){}
newLogin();
}
}
//对按钮动作的处理及响应
publicvoidsendPublicMessage(){}
//发送公聊信息
publicvoidsendPraviteMessage(){
}
//发送私聊信息
publicvoidlessen(){
}
//注销事情
服务端:
服务端序列化信息类:
classUserimplementsSerializable{
StringName;//用户名
StringPassword;//密码
StringEmail;//e-mail
StringAge;//年龄
Stringsex;//性别
StringMessage;//要传递的信息
StringCommand;//命令标识
VectorvectorUserList;//在线用户列表}服务器界面类:
publicclassServerextendsJFrame
{.
...
//组件及变量的定义publicServer()
{
initComponents();
//构造方法,初始化组件}
privatevoidinitComponents()
{
//组件初始化
try
{
//建立InetAddress对象
InetAddressintel=InetAddress.getLocalHost();
StringSerIp=intel.getHostAddress();
jLabel3.setText(服务器:+SerIp);
}
catch(UnknownHostExceptione2)
{
System.out.println(发生错误!);
}
jPanel1.add(jLabel3);
jLabel5.setText(
0个客户);
jPanel1.add(jLabel5);
jList1.setModel(newAbstractListModel(){
String[]strings={};
publicintgetSize(){returnstrings.length;}
publicObjectgetElementAt(inti){returnstrings[i];}
});
jList1.setFont(newFont(Dialog,Font.BOLD|Font.ITALIC,16));
jList1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
jList1.addMouseListener(newMouseAdapter()
{
publicvoidmousePressed(MouseEventevt)
{
if(evt.getClickCount()==1)
{
BlackList=(String)jList1.getSelectedValue();
}
}
});
jScrollPane1.setViewportView(jList1);
jPanel1.add(jScrollPane1);
jPanel1.add(jLabel1);
getContentPane().add(jPanel1);
commandMenu.setText(选项);
msgMenuItem.setText(系统消息);
msgMenuItem.setBorder(null);
msgMenuItem.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEventevt){
msgMenuItemActionPerformed(evt);
}
});
commandMenu.add(msgMenuItem);
kickMenuItem.setText(踢人);
kickMenuItem.setBorder(null);
kickMenuItem.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEventevt){
kickMenuItemActionPerformed(evt);
}
});
commandMenu.add(kickMenuItem);
menuBar.add(commandMenu);
setJMenuBar(menuBar);
startServer();
pack();}
privatevoidmsgMenuItemActionPerformed(ActionEventevt)
//系统消息事情{
try
{
UsertoUserMessage=newUser();
StringMesage=JOptionPane.showInputDialog(null,请输入内容:
,系统消息,JOptionPane.INFORMATION_MESSAGE);
toUserMessage.Message=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 原材料采购单审批制度
- 修理厂采购人员制度
- 交通局物资采购制度
- 修缮建筑采购内控制度
- 政府采购业务工作制度
- 2025年中药采购制度
- 器材采购与管理制度
- 学校日常采购规章制度
- 教学用品采购制度
- 县妇联采购制度
- 2026年安徽城市管理职业学院单招职业适应性测试题库带答案详解(满分必刷)
- 2026年安徽警官职业学院单招综合素质考试题库有答案详解
- 2026年宁夏葡萄酒与防沙治沙职业技术学院自主公开招聘工作人员考试参考试题及答案解析
- 推动职业教育国际化-交流协会的探索与实践
- 2025年“安全生产月”《安全知识》培训考试题库及答案
- 重庆市科学素养大赛题库
- 公司薪酬管理制度公告模板(3篇)
- 湖南白银股份有限公司2026年公开招聘笔试备考题库及答案解析
- 春节后医院后勤工作年度计划课件
- 2026年临汾职业技术学院单招职业倾向性考试题库含答案详解(完整版)
- 2026校招:远大物产集团试题及答案
评论
0/150
提交评论