Bug 报告
这个项目是:2015年秋季,2013级软件工程,《计算机网络》课程项目。
项目有两个部分组成,分别是客户端:Minet,服务端:Miro。核心是成为MMProcotol的数据协议。
Minet功能:
- 登录,注册等简单的用户管理功能
- 在线用户发起P2P聊天功能
- 创建群聊,聊天室功能
- 在线用户间进行P2P的屏幕分享功能
Miro功能:
- 作为Minet的后台服务器,连接数据库和Minet
- 广播在线用户基本信息,包括IP和端口
- 更新和记录上下线的用户的信息
- 群聊时,向群组内用户广播群聊信息
姓名 | 学号 | 角色 | 贡献 | 分工 |
---|---|---|---|---|
周基源 | 13331370 | 组长 | 25% | UI设计,前端swing前端编程 |
吴家荣 | 13331270 | 组员 | 25% | MMProtocol在客户端的实现 |
景涛 | 13354135 | 组员 | 25% | MMProtocol在服务端的实现 |
邱永臣 | 13331212 | 组员 | 25% | 数据库表设计与存储的实现 |
- 前后台均用java语言
- 前端使用swing实现
- 项目的核心是TCP Socket编程
- 实现了成为MMProtocol的数据协议,但是协议的设计欠合理,没有实现统一的对外接口
注意,本项目没有实现NAT,意思是,服务端和客户端的运行需要在同一局域网内,或者都在公网内。
“可视化”服务端
登陆与注册
登陆前需要填写服务器的IP地址
登陆界面
注册界面
聊天界面
屏幕共享
- 可视化服务端:Miro_v2.0.0
- 简易客户端:Minet_v2.0.0
- 双击Miro.jar,运行可视化服务程序
- 复制Miro面板上显示的IP地址
- 双击Minet.jar,运行客户端程序
- 粘贴复制的IP地址
- 选择登陆或者注册
开发工具:Eclipse
操作系统:windows 10
运行环境:JRE
引用库文件:
下载到本地:
git方式:
git clone https://github.com/wujr5/computer-network-project.git
或者点击下载:
项目开发时是用Eclipse进行开发的,因此下面步骤是针对Eclipse的。
- 打开Eclipse,选择
File > Switch Workspace > Others...
- 接着选择刚才下载的项目的最外面的文件夹:
computer-network-project
作为新的workspace - 选择
File > Import...
- 选择
General
中的Existing Projects into Workspace
- 然后选择
Select root directory
的单选选项,点击Browse...
- 选择
computer-network-project
文件夹下的Minet
文件夹 - 点击确定,然后点击
Finish
,完成Minet
项目的导入 - 重复步骤
3-7
导入Miro
项目 - 在Eclipse的Package Exporer面板中选中Minet项目,接着
右键 > Properties
- 在搜索栏中输入
build
,在结果中单击Java Build Path
- 选中
Libraies
面板,选中出现错误(有错误提示)的条目(可多选),点击Remove
- 点击
Add External JARs
选择文件夹computer-network-project/jar/
下面的全部jar文件,点击打开,点击OK - 此时,Minet应该没有错误提示了,对
Miro
重复步骤9-12
- 此时,Miro还会有错误,因为Miro引用了Minet内的文件
- 在Eclipse的Package Exporer面板中选中Miro项目,接着
右键 > Properties
- 在搜索栏中输入
build
,在结果中单击Java Build Path
- 选中
Source
面板,点击Link Source...
- 在
Link folder location
下,点击Browse...
,选择computer-network-project/Minet/ShareCode
文件夹,点击确定,点击Finish
,点击OK - 此时,正常情况是,Minet和Miro项目都已经正常部署了,无错误发生
- 接下来,先运行Miro的代码,再运行Minet的代码即可
服务器端结合java swing用户界面,直接在机器上运行jar可执行文件,即可完成对服务端的部署
- UI层:Java Swing实现,负责界面逻辑呈现
- Minet业务逻辑层:负责处理交互的逻辑
- Minet通信层:MMProtocol客户端部分实现
- Miro通信层:MMProtocol服务端部分实现
- Miro后台业务层:负责与数据库的逻辑交互
- Sqlite数据层:使用Sqlite数据库管理后台数据
Minet项目结构
Miro项目结构
项目间共享代码
git地址:https://github.com/wujr5/computer-network-project
项目统计:
在GUI和交互方面,我们小组进行了较充分的设计和调试,在有限时间尽力做到了最好。
点击下载:ppt
展示视频:
观看:展示视频
部署视频:
观看:部署视频
这次实验负责的是MMProtocol在客户端的实现,算是通信层的内容。其实总体感觉,虽然说是分工明确,其实还是免不了要了解在这个技术堆栈或者说层次堆栈上下两层的内容的。协作开发绝对少不了沟通交流,单干是可以,但是会缺少很多**碰撞的机会。
设计和实现协议的过程,让我感触很大,也对协议及其概念本身有了很深刻的理解。
在做这个项目之前,对协议的理解是一种服务。比如HTTP协议,它规定了数据传输的格式、数据包的格式,以及不同请求方法对应的操作。以前的理解是,就像浏览器的网络服务,就是HTTP协议的功能实现。其实这样的理解应该是不对的。
协议,应该是一种标准。而协议的实现,可以多种多样。比如HTTP协议,在客户端,协议的实现可以是浏览器,也可以是其他的软件,在服务端,可以是Apache,Nginx,Nodejs等,这些都是根据协议的规定而实现的服务。
而这些服务在应用层实现的核心,就是对TCP和UDP的Socket编程。
开始的时候,我们没有充分意识到这些认识,因此开始就走了弯路,后来不断重构代码,花了不少时间。
而最合理的协议实现,应该是对外提供统一的接口。比如优秀的HTTP协议,对外利用统一资源定位符进行资源定位,构造比如get, put, post, delete等方法对应不同的操作,对外接口非常简洁,因此利用起来也非常的方便。
虽然最终还是实现了要求的功能,但是不能尽善尽美,可是接近期末了,我们也没有充分的时间去改良了。因此,先就此作罢。
由于计算机网络是通过小组分工来实现,因此每个人在project中实现的部分也不一样。我负责的部分是MMProtocol在服务端的实现,也就是server的实现。在计算机网络的层次结构应该算是应用层的实现。同时,也需要涉及到应用层到传输层的信息交换。
在实现的过程中,我发现服务器本身是较好实现的,其中需要注意,服务器向数据库进行读取数据时,需要实时读取更新到的最新数据,体现到具体功能上就是,在界面中,用户应该能实时获取到当时在线的用户和用户的相关信息。因此服务器需要每个一段时间刷新服务器中的内容,不断从底层数据库中获取相关信息。
另外,由于此次project是小组分工,虽然每个人完成某一部分可以大大减少某一个的工作量,但是,这样也带来了其他的弊端。例如,组内不能很好地协调每个层次之间的关系与协议等等。这些内容都得在具体实验完成之前与小组成员确定下来。当然,虽然我做的是某一部分内容,其他人所做的我也应该有所了解。如上面说的数据库,再例如,客户端与服务器之间的通信,用何种数据协议进行传输。还有,当数据从服务器传送到运输层,我们的socket接口应该怎么设计才能与对应的传输层进行有效通信等等。这些都是需要我们考虑的。因此,即使我做的是某一部分内容,我也应该尽力去了解整个项目中,需要关心每个人所做的内容对于我自己的部分来说是否有更高的要求。
向来都觉得,数据库的设计是非常麻烦,非常痛苦的。记得我们学院某位老师(具体什么名字就不透露了,只能说他姓任)说过,数据库设计和管理太可怕了,为此出现了DBA,专门负责数据库的处理。
我之前一直维护着一个APP的数据库,为之绞尽脑汁,这次也一样。
一个数据库,不单单是为了把数据给存储下来(这一步就让99%的人没法成为DBA),还必须考虑数据的更新换代,软件应用的更新换代,数据间的无缝不断电迁移,数据安全,数据快速查询,数据备份等等大量的东西,要设计一个非常棒的数据库系统,简直不是一个人能独立完成的。
这次设计中,没有更新换代之说,相对比较简单,数据量也不是特别大(毕竟不是腾讯)。
在这个项目中,我主要负责UI设计,前端swing编程。这个应该算是应用层的编程。虽然看起来跟协议没什么关系,但是客户端本身也是要根据客户端协议的API的反馈来显示,所以我也顺便了解了客户端协议实现部分还有整个协议的设计。
对于客户端本身,细节是比较重要的,比如显示消息,对方的消息要放在边,自己的消息要放右边。还有对于swing包,还是需要根据实际的需求查Oracle的文档才可以。
最后,由于大家的分工把协议拆开了,导致大家在最开始讨论改了好一段时间。作为UI实现,我得等客户端协议的设计安排完成,因为我要知道协议会给我这个应用层的客户端带来什么反馈。比如当注册用户的用户名重复的时候,我会收到用户名重复的反馈,也就应该通过对话框告诉用户他的用户名已经被使用过了。
在这个project中,体会到了团队协作的能力,特别是在大家讨论协议设计的时候,每个人都根据自己负责的部分发表自己的想法,最后汇总起来,并且在时间中,在走弯路的过程中不断改进,每个人都收获不菲。
姓名 | 学号 | 分数 |
---|---|---|
周基源 | 13331370 | 93 |
景涛 | 13354135 | 94 |
邱永臣 | 13331212 | 95 |
姓名 | 学号 | 分数 |
---|---|---|
周基源 | 13331370 | 95 |
吴家荣 | 13331270 | 96 |
邱永臣 | 13331212 | 95 |
姓名 | 学号 | 分数 |
---|---|---|
周基源 | 13331370 | 90 |
吴家荣 | 13331270 | 92 |
景涛 | 13354135 | 91 |
姓名 | 学号 | 分数 |
---|---|---|
吴家荣 | 13331270 | 90 |
景涛 | 13354135 | 90 |
邱永臣 | 13331212 | 93 |
附加功能是:图像传输功能,也就是屏幕共享
检查:
- 源代码 & 可执行文件 & Readme:(100%)
- PPT:(100%)
- demo video:(100%)
- report documents:(100%)
- 每个小组成员的总结:(100%)
- in-group assessment:(100%)
- (Optional)附加作业:(100%)
- Protocol design. (10 points) (100%)
- Finish basic function correctly (w/o error). (60 points) (100%)
- On time. (10 points) (100%)
- Documents, codes, presentation. (20 points) (100%)
- votes (0%)
- in-group assessment (100%)
- Use top Library: Swing. (+2) (YES)
- Use github for version control: computer-network-project (+2) (YES)
- Creative or difficulty: we think yes. (+2) (YES)
- Extra functions implementation: (+2) (YES)
- Friendly GUI: we think yes. (+2) (YES)
- Apply advanced design pattern: 分成六个逻辑层进行开发 (+2) (YES)
- Excellent Presentation: (+2) (NO)