中南大学计算机网络课程设计 实验报告 0909113224樊列龙Word格式.docx
《中南大学计算机网络课程设计 实验报告 0909113224樊列龙Word格式.docx》由会员分享,可在线阅读,更多相关《中南大学计算机网络课程设计 实验报告 0909113224樊列龙Word格式.docx(40页珍藏版)》请在冰豆网上搜索。
JICQ-WWW服务器环境
Tomcat7.0
JICQ测试环境
FireFox2.5,IE9,GoogleChrome,Windows7
数据库开发环境
SQLServerManagementStudio
PowerDesigner16
其他工具
VisualParadigm
第二节需求分析
2.1实验要求
2.1.1基本要求
设计中要求综合运用所学知识,上机解决一些与实际应用结合紧密的、规模较大的问题,通过分析、设计、编码、调试等各环节的训练,深刻理解、牢固掌握网络原理的基本技术,掌握分析、解决实际问题的能力。
2.1.2基本功能要求
1、服务模式
实现网络聊天的功能,采用WindowsSocket(或JavaSocket)编程,服务器与客户端采用了TCP/IP连接方式,在设计聊天方案时,可将所有信息发往服务器端,再由服务器进行处理,服务器端是所有信息的中心。
2、保存信息
服务器端要保存用户信息,可利用数据库来实现这一功能,需要建立用户信息数据库。
在客户端可采用文件系统保存聊天纪录和用户号码。
3、提示上线
可通过闪动托盘图标和播放不同的音乐提示信息到来及好友上线等信息。
可通过建立消息链表来保存用户接收的各种消息。
2.1.3详细功能要求
表2.1.3详细功能要求
1、登录功能。
建立与服务器的连接并登陆,能显示登陆错误信息。
2、一对一和多对多聊天
客户可以通过服务器转发,实现一对一和多对多聊天。
3、用户的状态
客户端程序应该可以实时显示目前其它用户的状态。
4、界面显示
将在线好友显示在好友列表中,并实现系统托盘,加入工具栏。
5、聊天记录
能保存聊天纪录,并能察看聊天纪录。
6、友好的界面
应该具有易用、美观的图形界面
7、信息提示
闪动托盘图标提示到来信息,并播放不同音乐来提示。
8、其他功能
用户登陆成功,将保存其号码,以便下次登陆时,不必再输入而可以直接选择,显示登陆时间。
三、概要设计
3.1JICQ部署和原理图
图3.1JICQ工作原理和部署图
3.1.1软件简介和工作原理
1、软件简介
Java即时通信系统的服务器端包括JICQ服务器程序(其监听9001端口)和数据库服务器(本系统采用MSSQLServer2008);
客户端为JICQ即时通信工具软件和网页服务软件。
Java即时通信系统(JICQ)是以Java语言为实现的网络即时通信工具,包括服务器端和客户端,可以在企业内部网络和互联网上运行。
使用JICQ可以和好友进行交流,信息即时发送,即时回复,传输文件等功能。
本系统充分利用了Java语言的平台无关性等众多优点,主要采用了Socket网络编程接口、多线程、输入输出流、Swing界面编程技术,为我们构建一个跨平台的真正畅通的网络信息交换工具。
2、工作原理简述
本聊天软件采用InternetSocket通信,实现两个客户端用户的聊天基本功能,包括一对一,一对多,群聊、好友列表、上线提示等。
客户端采用JavaSwing及Socket技术实现,服务器端采用JavaEE和JavaSocket实现,客户端连上Internet后向指定好友(制定IP)发送消息,服务器端搜到消息后按照客户端的需求将消息转发给相应的用户,另一用户能接收到来自服务器的数据。
服务器端使用JDBC连接数据库,并操作数据库。
本地管理员可以在后台看到数据流向并且能对数据库进行管理。
3.2JICQ基本用例图、交互图和序列图
3.2.1JICQ用例图
图3.2.1用户用例图
3.2.2用户注册活动图
图3.2.2用户注册活动图
3.2.3用户登陆活动图
图3.2.3用户登陆活动图
3.2.4客户机之间通信活动图
图3.2.4用户登陆序列图
3.2.5添加好友活动图
图3.2.5添加好友活动图
3.2.6删除好友活动图
图3.2.6删除好友活动图
3.3数据库模型
图3.3数据库模型设计
3.3.1JICQ存储设计
客户端JICQ除了必备的程序文件之外,还有相关的数据文件,以辅助程序运行。
主要包括用户信息,好友信息,头像文件,声音文件等信息。
图3.2.1存储结构设计
3.4系统类包
图3.4系统类包
Message包为JICQ系统的消息类包,其中包含有JICQ系统定义的短消息类型,为服务器与客户端所共用;
Server包为系统的服务器端程序类包,运行在服务器端机器;
Client包为系统的客户端程序类包,运行在客户端机器。
www为网页服务类包,为系统提供网页在线注册的功能。
3.5JICQ线程控制
图3.5JICQ线程控制
客户端JICQ主要由监听线程、消息处理线程控制。
首先由监听线程监听消息,当有消息来到时,启动消息处理线程处理消息,最后由消息线程将消息通知用户边界对象。
另外,客户端还有一个能与服务器保持联络的线程,每两分钟向服务器通知一次,表明该客户端仍然在线。
3.6网页客户端设计
使用HTML5和CSS3做前端网页的基本显示,并使用JavaScript和JQuery库对网页进行全局的优化,提供良好的用户体验。
图3.5网页客户端设计
3.7工程架构设计
图3.6JICQ工程架构图
3.7.1JavaEEMVC框架简介
mvc是一种源于桌面程序的架构模式,它的基本思想是把程序界面和业务逻辑分开,这样便于软件的后期维护,同时也方便开发时期分工及管理,mvc有很多有点所以现在已经被广泛的应用与web开发中。
三层架构分为表示层,逻辑层,持久层;
其中表示层是属于web方面的开发,对应与mvc的视图和控制器,控制器根据需要调用业务逻辑和视图层显示给用户;
逻辑层和持久层是为了程序的可移植性我们把mvc中的模型层分为专门用于计算的逻辑层和专门访问数据的持久层(包括访问数据库、访问xml、以及访问其他可以永久保存数据的文件等),业务逻辑层主要是javabean实现;
而持久层最常见的就是dao,封装了数据库的所有操作。
其实三层架构从结构来说是纵向的分层,上层依赖于下层,而下层不依赖于上层,即单项依赖。
图3.7.1MVC框架原理图
3.7.2项目用用MVC框架部署
1.前端:
前端显示界面,利用jsp页面显示
2.后端:
后端控制程序,分为四个层,domain层、dao层、service层、servlet层
1damain层:
存放数据库中原始对象
2dao层:
实现对数据库的增、删、改、查操作
3service层:
数据的持久化层
4servlet层:
用于前端和后端的接口
第四节详细设计
4.3数据库详细设计
4.3.1数据库SQL代码:
SQLServer2008数据库SQL代码
USE[iCoze]
GO
/******Object:
Table[dbo].[Users]ScriptDate:
01/16/201414:
34:
00******/
SETANSI_NULLSON
SETQUOTED_IDENTIFIERON
CREATETABLE[dbo].[Users](
[userId][int]IDENTITY(1,1)NOTNULL,
[userNo][nvarchar](10)NULL,
[userNickname][nvarchar](10)NULL,
[userPassword][nvarchar](20)NULL,
[userSex][nvarchar](10)NULL,
[userImage][nvarchar](100)NULL,
PRIMARYKEYCLUSTERED
(
[userId]ASC
)WITH(PAD_INDEX=OFF,STATISTICS_NORECOMPUTE=OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON)ON[PRIMARY]
)ON[PRIMARY]
Table[dbo].[UGRelations]ScriptDate:
CREATETABLE[dbo].[UGRelations](
[ugrId][int]IDENTITY(1,1)NOTNULL,
[userId][int]NULL,
[groupId][int]NULL,
[ugrId]ASC
Table[dbo].[UFRelations]ScriptDate:
CREATETABLE[dbo].[UFRelations](
[ufrId][int]IDENTITY(1,1)NOTNULL,
[friendId][int]NULL,
[friendRemarks][nvarchar](40)NULL,
[friendGroup][nvarchar](40)NULL,
[ufrId]ASC
Table[dbo].[OutlineMsgs]ScriptDate:
CREATETABLE[dbo].[OutlineMsgs](
[oId][int]IDENTITY(1,1)NOTNULL,
[message][nvarchar](1000)NULL,
[oId]ASC
Table[dbo].[Logs]ScriptDate:
CREATETABLE[dbo].[Logs](
[lId][int]IDENTITY(1,1)NOTNULL,
[Action][nvarchar](40)NULL,
[date][date]NULL,
[lId]ASC
Table[dbo].[HistoryMsgs]ScriptDate:
CREATETABLE[dbo].[HistoryMsgs](
[hId][int]IDENTITY(1,1)NOTNULL,
[hId]ASC
Table[dbo].[Groups]ScriptDate:
CREATETABLE[dbo].[Groups](
[groupId][int]IDENTITY(1,1)NOTNULL,
[groupNo][nvarchar](10)NULL,
[groupName][nvarchar](40)NULL,
[groupBroadcast][nvarchar](40)NULL,
[groupImage][nvarchar](40)NULL,
[groupId]ASC
4.2Java后端控制实现
4.2.1服务器端架构实施文件
图4.5.1架构实施文件
4.2.2Socket核心代码
Com.lennon.util.TCPServer.java---TCP服务类
packagecom.lennon.util;
importjava.io.IOException;
import.ServerSocket;
import.Socket;
importjava.util.ArrayList;
importjava.util.HashSet;
importjava.util.List;
importjava.util.Set;
importjava.util.concurrent.ExecutorService;
importjava.util.concurrent.Executors;
publicclassTCPServer{
privatefinalstaticintPORT=9001;
privatefinalstaticintMAX_THREAD=100;
privateServerSocketserver;
privateSocketsocket;
publicstaticSet<
Socket>
clients=newHashSet<
();
publicstaticbooleanflag=false;
publicstaticList<
String>
message=newArrayList<
privateServerThreadserverThread=null;
publicTCPServer(){
ExecutorServicethreadPool=Executors.newFixedThreadPool(MAX_THREAD);
while(true){
try{
server=newServerSocket(PORT);
System.out.println("
...Waiting..."
);
}catch(IOExceptione){
}
socket=server.accept();
上线客户端IP:
"
+socket.getInetAddress());
clients.add(socket);
serverThread=newServerThread(socket);
threadPool.execute(serverThread);
//
//if(socket!
=null){
//newServerThread(socket).start();
//为每个客户端启动一个线程
//}
}
}
}
publicvoidsetUid(intuid){
this.uid=uid;
publicStringgetUsername(){
returnusername;
publicvoidsetUsername(Stringusername){
this.username=username;
publicStringgetPassword(){
returnpassword;
publicvoidsetPassword(Stringpassword){
this.password=password;
publicStringgetEmail(){
returnemail;
publicvoidsetEmail(Stringemail){
this.email=email;
publicStringgetUrl(){
returnurl;
publicvoidsetUrl(Stringurl){
this.url=url;
publicStringgetRolename(){
returnrolename;
publicvoidsetRolename(Stringrolename){
this.rolename=rolename;
@Override
publicStringtoString(){
return"
User[uid="
+uid+"
username="
+username+"
password="
+password+"
email="
+email+"
url="
+url
+"
rolename="
+rolename+"
]"
;
Com.lennon.util.ServerThread.java---线程类
importjava.io.BufferedReader;
importjava.io.InputStream;
importjava.io.InputStreamReader;
importjava.io.OutputStream;
importjava.io.PrintWriter;
importjava.util.HashMap;
importjava.util.Iterator;
importjava.util.Map;
importcom.lennon.service.FriendService;
importcom.lennon.service.UserService;
importcom.lennon.service.impl.FriendServiceImpl;
importcom.lennon.service.impl.UserServiceImpl;
importcom.lennon.vo.Friend;
importcom.lennon.vo.User;
publicclassServerThreadimplementsRunnable{
publicstaticMap<
String,String>
toFriendIP=newHashMap<
Socketsocket;
intport;
UserServiceuserService=newUserServiceImpl();
FriendServicefriendService=newFriendServiceImpl();
StringuserNo;
StringuserPassword;
Stringstr=null;
InputStreaminput;
InputStreamReaderisReader=null;
BufferedReaderreader=null;
OutputStreamsocketOut;
PrintWriterpw=null;
ServerThread(Sockett