网络聊天室课程设计报告内附java代码.docx
- 文档编号:26050104
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:21
- 大小:147.93KB
网络聊天室课程设计报告内附java代码.docx
《网络聊天室课程设计报告内附java代码.docx》由会员分享,可在线阅读,更多相关《网络聊天室课程设计报告内附java代码.docx(21页珍藏版)》请在冰豆网上搜索。
网络聊天室课程设计报告内附java代码
课程设计
网络聊天室
院(系)别信电学院
班级计算102
学号
姓名
指导教师
时间2013-4-18—2013-5-10
课程设计任务书
题目网络聊天室
课程设计
系(部)信电学院
专业计算机科学与技术
班级计算102
学生姓名
学号
4月18日至5月10日共4周
指导教师(签字)
系主任(签字)
年月日
一、设计内容及要求
二、设计原始资料
1)电子工业出版社《JSP实用教程》,郑阿奇编著
2)电子工业出版社《JAVA程序设计实用教程》,叶核亚编著
三、设计完成后提交的文件和图表
1.计算说明书部分
JSP界面设计
2.图纸部分:
程序流程图
四、进程安排
五、主要参考资料
1)电子工业出版社《JSP实用教程》,郑阿奇编著
2)电子工业出版社《JAVA程序设计实用教程》,叶核亚编著考资料
成绩评定表
作品成绩
报告成绩
口试(答辩)成绩
总评成绩
课程设计概述
问题描述
`随着计算机网络日新月异的发展,人们的交流方式越来越多,传统的交流方式,如:
信件、电报、电话等已经难以满足人们的交流要求,在互联网上即时的和好友取得联系,已经成为当今社会人们主流的联系方式。
因此,两台计算机之间进行即时通讯、发送文件等交流方式已经成为必然潮流。
因此出现了QQ等聊天工具,然而QQ等聊天工具虽然方便、实用,但是,娱乐功能太多,有很多吸引人的娱乐功能,从一定程度上来说,是一种娱乐工具,不能作为用于即时通讯、文件共享的专用工具。
目前,用于实现单一的即时通讯、文件共享的软件实在太少,而且,它们中大部分都是绝对的C/S模式,对远程服务器有非常大的依赖性,没有彻底实现点对点的交流。
为此,我决定开发一个专用于实现两台计算机之间即时通讯、文件共享的软件,以方便两台计算机之间信息的交流。
避免了服务器忙或与服务器无法连接时,浪费过多时间用于和服务器建立连接。
因此,这个软件是极具适应性和实用性的即时通讯软件。
功能需求分析
实现网络聊天的功能,采用Windows Socket(或Java Socket)编程,服务器与客户端采用了TCP/IP连接方式,在设计聊天方案时,可将所有信息发往服务器端,再由服务器进行处理,服务器端是所有信息的中心。
服务器端要保存用户信息,可利用数据库来实现这一功能,需要建立用户信息数据库。
在客户端可采用文件系统保存聊天纪录和用户号码。
可通过闪动托盘图标和播放不同的音乐提示信息到来及好友上线等信息。
可通过建立消息链表来保存用户接收的各种消息。
环境需求分析
运行环境:
Windows9x、2000、XP、Windows7
必要环境:
JDK以上、eclipse开发环境
硬件环境:
CPU400MHz以上,内存512MB以上
学生信息管理系统软件总体设计
整体思路
该C/S模式的聊天系统,就是服务器来提供服务端连接响应,客户端主动的发起连接请求。
当多个用户同时连接到服务器时,经由服务器的接收与转发便可以实现客户之间的通信。
对于整体系统的流程,也是分为两部分,即客户端的发起请求,服务器响应请求。
首先是客户端的登陆,客户端在登陆时,必须设置所想要连接的服务器,然后客户端就会根据设置的服务器IP地址,向服务器发起建立连接请求。
而服务器端是始终在监听网络状态的,主要检测到有一个连接请求,那么服务器就会给当前的发起端分配一个服务线程,用于处理它的各种请求。
对于客户端的各种请求,实际上都是通过在客户发往服务器的各种字符流区分的,具体的方法就是在消息的头部以及尾部添加特殊字符串,从而实现服务器对消息请求的识别。
比如对于登陆信息,消息的头部就是“PEOPLO”,而对于私聊中的消息,头部就是“SEC”,其他的同理都添加了头部。
当然,对于客户端来说,这些都是透明的,用户的操作并没有受到任何影响。
在服务器端,消息被检测分析后,变回根据具体的目的进行处理,比如是私聊消息,服务器便会根据其尾部的目的信息,向目标端转发该条消息。
这里额外要说的是,该系统特别的对用户发来的消息进行了加密处理,即用户的各种具体信息,不仅能够防止向第三方的泄漏,而且即使服务器端出现异常,信息也不会泄漏。
对于私聊的方式,该系统所采用的方法类似于QQ的通信方式,由发起方主动连接,当目的方接收到连接请求后,会主动建立一个私聊窗口,从而实现私聊。
总体设计流程图
学生信息管理软件详细设计
.界面设计
由于这里界面设计源代码比较简单,这里不再列出。
服务器界面设计
服务器界面
客户端界面设计
登陆界面
注册界面
聊天室界面
通信功能实现方法
列举部分实现通信功能的主要代码
文件
publicclassAppServerextendsThread{
privateServerSocketserverSocket;
privateServerFramesFrame;
privatestaticVectoruserOnline=newVector(1,1);
privatestaticVectorv=newVector(1,1);
/**
*创建服务器启动服务监听1001端口
*
*/
publicAppServer(){
sFrame=newServerFrame();
try{
serverSocket=newServerSocket(1001);
.");
();etScreenSize();reateEmptyBorder(1,1,1,1)));
lblStatus=newJLabel("当前状态:
");
txtStatus=newJTextField(10);
(false);
lblNumber=newJLabel("当前在线人数:
");
txtNumber=newJTextField("0人",10);
(false);
lblMax=newJLabel("最多在线人数:
");
txtMax=newJTextField("50人",10);
(false);
lblServerName=newJLabel("服务器名称:
");
txtServerName=newJTextField(10);
(false);
lblProtocol=newJLabel("访问协议:
");
txtProtocol=newJTextField("HTTP",10);
(false);
lblIP=newJLabel("服务器IP:
");
txtIP=newJTextField(10);
(false);
lblPort=newJLabel("服务器端口:
");
txtPort=newJTextField("8000",10);
(false);
btnStop=newJButton("关闭服务器(C)");
(newActionListener(){
publicvoidactionPerformed(ActionEventarg0){
closeServer();
}
});
lblLog=newJLabel("[服务器日志]");
taLog=newTextArea(20,50);
btnSaveLog=newJButton("保存日志(S)");
(newActionListener(){
publicvoidactionPerformed(ActionEventarg0){
saveLog();
}
});
(lblStatus);
(txtStatus);
(lblNumber);
(txtNumber);
(lblMax);
(txtMax);
(lblServerName);
(txtServerName);
(lblProtocol);
(txtProtocol);
(lblIP);
(txtIP);
(lblPort);
(txtPort);
(5,5,100,400);
(110,5,100,30);
(110,35,400,370);
(200,410,120,30);
(320,410,120,30);
(pnlServerInfo);
(lblLog);
(taLog);
(btnStop);
(btnSaveLog);
etView(lstUser);
(5,5,100,25);
(5,35,300,360);
(310,5,100,25);
(310,35,220,360);
(5,410,40,25);
(50,410,160,25);
(210,410,80,25);
(320,410,100,25);
(440,410,80,25);
(lblMessage);
(taMessage);
(lblUser);
(spUser);
list=newJList();
(newString[]{""});
(list);
(lblNotice);
(txtNotice);
(btnSend);
(lblUserCount);
(btnKick);
dd(tpServer);
setVisible(true);
}
protectedvoidserverMessage(){
oString();
log("Ti:
"+ti);
}
privatevoidlog(Stringstring){
etName().equals("Customer")){
etName().equals("Register_Customer")){
etName().equals("Message")){
serverMessage();
}
if().getName().equals("Chat")){
serverChat();
}
if().getName().equals("Exit")){
serverExit();
}
}catch(IOExceptione){
}catch(ClassNotFoundExceptione1){
"读对象发生错误!
"+e1);
}finally{
try{
();
}catch(IOExceptione){
}
}
}
/**
*
*登录处理
*/
@SuppressWarnings("deprecation")
publicvoidserverLogin(){
try{
CustomerclientMessage2=(Customer)obj;
lementAt(a)).custName;
if{
login_flag=1;
break;
}
}
if()>=50){
("登录人数过多,请稍候再试");
break;
}
if(login_flag==0){
=;oString();
"ps:
["+ps+"]");
"pass:
["+pass+"]");
if())){
login=true;
"logined:
");
}
"compareTo:
"+(pass));
head=("head");
"head:
"+("head"));
}
"login:
"+login);
if(!
login){
("密码不正确");
return;
}
ustName;
if{
login_flag=1;
break;
}
}
if()>=50){
("登录人数过多,请稍候再试");
return;
}
if(login_flag==0){
"head:
"+head);
=head;lementAt(i);
if{
("注册名重复,请另外选择");
flag=1;
break;
}elseif"所有人")){
("禁止使用此注册名,请另外选择");
flag=1;
break;
}
}
}
if(flag==0){
etOutputStream());
((Message)mess);
();
();
}catch(IOExceptione){
}
}
/**
*增加信息处理
*/
publicvoidserverChat(){
//将接收到的对象值赋给聊天信息的序列化对象
ChatcObj=newChat();
cObj=(Chat)obj;
//chenmin
=;
chatLog(cObj);
//将聊天信息的序列化对象填加到保存聊天信息的矢量中
((Chat)cObj);
return;
}
/**
*用户退出处理
*/
@SuppressWarnings("deprecation")
publicvoidserverExit(){
Exitexit=newExit();
exit=(Exit)obj;
removeUser(exit);
//chenmin
if{
="";
}
Datet=newDate();
log("用户"++"已经退出,"+"退出时间:
"+());
freshServerUserList();
}
/**
*在线用户中删除退出用户
*
*@paramexit
*退出用户名对象
*/
privatevoidremoveUser(Exitexit){
//TODO自动生成方法存根
Vector
Customer_cus=null;
for(intj=0;j<();j++){
_cus=(Customer)(j);
if(!
{
(_cus);
}
//"list:
"+;
}
();
for(intj=0;j<();j++){
_cus=(Customer)(j);
(_cus);
}
}
/**
*日志服务器窗体写信息
*
*@paramlog
*日志信息
*/
publicvoidlog(Stringlog){
Stringnewlog=+"\n"+log;
}
/**
*
*日志服务器窗体写聊天信息
*
*
*聊天信息对象
*/
@SuppressWarnings("deprecation")
publicvoidchatLog(Chatobj){
Stringnewlog=Datedate=newDate();
if(!
{
newlog+="\n";
newlog+=("["+()+"]");
newlog+=;
newlog+="->";
newlog+=;
newlog+=":
";
newlog+=;
}
Stringtext="";
text+=;
text+="->";
text+=;
text+=":
";
text+=;
Stringsql="insertintologs(text,shijian)values('"+text+"','"+()+"')";
try{
(sql);
}catch(Exceptione){
//TODOAuto-generatedcatchblock
();
}
}
}
设计体会及今后的改进意见
为了提高我们的实践能力,让我们学以致用,能灵活运用所学的知识进行再创造,学校特安排我们进行为期二周的VisualC++课程设计实习,并安排了指导老师帮助辅导,让我们在规范化、严谨化、实用化上面有了很大进展。
在此次字符统计程序开发过程中,有很多东西值得我们思考并总结。
开发过程大体可分为以下几个步骤:
(1)思考总体设计方案:
总体结构和模块外部设计,功能分配。
思考要实现整个程序大体需要的几个模块和其中用到的VisualC++语言基本操作符、语句等。
(2)画出总体设计方案流程图:
用流程图的形式展现你的基本编程思想。
(3)流程图具体化:
即将流程图中的几大模块的具体实现思考清楚,可以用流程图的形式展现.并想好实现的关键代码。
(4)编辑程序代码:
这是一个至关重要复杂而且需要反复修改的环节,在此环节中你将发现总体设计和模块思想会存在很多问题,需不断改进.如何实现各函数功能,达到预期效果也将是一项繁复的工作。
(5)代码的调试:
在VisualC++环境下输入代码并进行调试和正确运行。
在调试过程中会遇到很多需要精化的地方,需要十足的耐心与细心,不断改进完善程序。
(6)最后修饰:
程序可以正确运行之后,再不影响程序功能的情况下,运用各种辅助性符号,使界面更加美观漂亮,操作更人性化.增强程序的新意与可行性。
通过这次课程设计,使我们更加熟悉的掌握了VisualC++语言的运用。
帮助我们熟悉了更多VisualC++语言的功能,提高了我们的动手能力,学到了许多解决实际问题的宝贵经验.同时也挖掘出了我们潜在的能力,使我们对自己更有自信,对编程也更有兴趣。
我相信,只要努力、勤奋、坚持不懈,就没有什么做不到的事,不能还没开始就退缩,要勇于拼搏,敢于创新。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 聊天室 课程设计 报告 java 代码