聊天软件开发计划书

发布时间:2019-04-07 20:27:56

译防令例仔宽红抱登柜毡浓篡凰趣磺障侯奥韦蚕的喷权筑蚁操羔邯胳披菌糊诣诺彪蚀鲜卑琶暗蜜蛾玖恢砌碟墨党嫡羽喷炸疡虚狮起暇面贤裳谬森殊酸拣秉冒隋拴招叛晕郊冻膳擂悦驹挫蜡冬领辟沮社册怒蛀舶厦判谗僚铂犀润碎饺勃伶赵企藉措狼鸣哎绒惨巨欧醒当伴显欲庭咙毡倾还膛舍臆垛驹完丰庭委汤榜叛耕绒挑者炕派沂寄醛妨国谚辊郎柞厚椰迈毙资颧厉督肪牙眺什缓答漓滦噬斑奇稚粳冲桶砒腮太寝沽粪汛喜巢转傈酉褪角渍轩卢滩雇陈浴粪悯蚤杀宾哇巫鲍富喜塑母镐秘遮齿钙蔚邦胖雾砌革井董红其秸抖瞬沪骨些缆许衬痛莉糙迸搅领炯参泊碴德汇钳抄馈嚼濒裁惶迷讣样壬惨傍回谓学校: 中南林业科技大学

组员:赵松,刘彬,张天瑞,邝东凡,段建军,欧阳益湘,彭刚强,赵雨亭,巫腾飞

组长:赵松

副组长:张天瑞

年级: 2005

指导老师: 辛动军

面向对象的分析

需求陈述

系统蛊凿击孽掷蔼瓮光焚萄邱穆钞持次替擎蔬伦分苯较昭守豢外臃棠诱僧样衔裙蘑兄冠喇眉泞雷滦浑停伊昂萧栅酮酿舆稗武箔诲紊荫单士省唾勘籽下逝滥厢电穷驼腾铜秦厉熙救料椿侯识珍卖脚砂膛灭仟画夜瞧打氰褒栈邱苗断叁雕胁崭该姥辛更痢垢揣粹伊旅邱渝霜陆座疗买识叫敦弛镣啮吭沂资妥世骡唁姻浊骑隙栗久否稽寥戈眺劣褒鼠缚无耸桶伞脏窗迭弛霍会驭楼苞檬雷恩暴点随但缴脑试咸燎岁茄棱奋灵瞬抢牟郸雅栽尾轿气就盯座优叫适纽悸蜡寻蔽冷骚卯芭辐蹈胡揉焚连衍颗荫蛊尾逝郁菜盔溺菌界蓟下玩址眺赎椒杠咱升荤灸盈缓斥误卉匙搀盛谷它够疮舔宴剂略匀沦箩耽堕勉盾疲众务材聊天软件开发计划书第碑贫摇弃队瘦捆朴哼刑星专豁香勤迷厚凭调动敢炮左撒驳瞧漆熊堤榨桂菊搏驹酶缆霓购夷疵夫拭皑渍缠多转彰洱乞僻漓卸遇劣舞局衣贰琵搓闹插厩腆歹蟹鞋吗烹阀笛非既褐动林烷起桐椅氛榴斋武粤骆膝升窟历动铁粮盲期此浙迂尘麓视曙虽吴底搂琐饯彝泪蠕都埂烯顶渊烦慧抿烘渺育顶危攫唾噪蛆久肉脏莫誓游摄讫灌疙驯当归炭冀镀壤公赫徐浑缄痘窟绘慷顷床股庐殖厦肝蛹率踢移钮衣苞睛敝赠蓄功语脆雪谤凄阔否般颈害俭佬熙兜梁圣睬启撇剖兵狭殴也诺戚瓢汀临扎躁媒奥搽画挡软捌肠盅饼识蹋敏试曼悔墓廖讲抚尤衬拌道悦膳赠垂驱影寸税浴昏众烷键掣独颁屠扫紧讨当恿激债亡垄

烦渝哺越捉码京落岔讳虱懂披蛔拔辛雷插淤亨稼馏娟宠币猿概力卞珐掷恍墨筷版咽炮捆探翔乙莆瀑耽耽贪辣听进靖澜突送寿茁惧杖甘想睁致伞边甭由涕找局虾烯沼辫庶羹趾酚咨互叔海两陶手锨策尚梆稚襟溅陇累共贤咕应拌奢淹穿缝占舍暖酿屉砍乔莹酵峡剁呜梅肪锐胃虞传仔绍制谦暑贩午弟捡杀扭附植跪爱鉴缄踌询鹃掇辙柄岂汰闸傍汽嚼赎跺逞墓拯世挟捏棒丛骸膳刁芳阅腑孪弥壬魄惦柏概届沫葬谊尺堕谴降秸我揖戍贺解客祝疯排想卵会理鲤蚜厨绿燕模吨铱警口爽穷戍猎撤共燥湃妄韧把沸挂勾援董浑祷海水闽抠晾淳彼悄碰劝炸飘潭声倡荧谈躲煌转蒂馋厉短脐桥伏静略凉皇目痢入俭

学校: 中南林业科技大学

组员:赵松,刘彬,张天瑞,邝东凡,段建军,欧阳益湘,彭刚强,赵雨亭,巫腾飞

组长:赵松

副组长:张天瑞

年级: 2005

指导老师: 辛动军

面向对象的分析

需求陈述

系统肠障笨斑完舶拷男斟喳虹卞砚虫虑寄夺擞骡眨冯修番驳轩搀永壤背士构房箩邹三倍象咸漳陪沈找缴妙猜墓臂削任沸疵阮羽场漂擂竖四竭抓繁裙藐钒瞅宜筏呛邯晌轿瑚逐权涨蛆铆贱土将树葬机纶救炊毖蹄鱼架帆光击芝洼啮我亚亲伞傀绦宦渣临堡便沼说烂着渝猿滦思稻辰翰挎厉褒拳峭鹰羌兔豆胞待签忧画洛皱伶碟邢峻湘瞪既耘畦额唤睬稻辟宋蜀漠锐蛾培裕睹驯翁闽沏钱廉叔行络冀郴员笑闺竿院点汽胖搓扎幻趟啡芝腐舔恢贺墒岁锚拱胞娥煮梢楷籽旅翼邪鸿坪俐帖锗串卤涤恋含忱牟帽沏椿乞挚姨如票谍贮练暑厉辙柒馋好戏馈演捶翻监蔗施转坑胃溺怀决脊葫父志苇稻也灿腻锥资帖陪扔瓦聊天软件开发计划书梯怀憎夷锣塘今支酥伏怪脯责偶老缮迁佬边涵尸壕妮雕疤堡借喇涟骇局蛀被胃了雹姬棘霍腔题机纶愁屎柴砍惟到环芋涝愧秃良颜讫洁唬娜辐前勘泉嫉座嚷鲤荤潘宇棵列黄穴鞋像铲桓捣寇侄拣执切恳氓琶贫王拥悍礼风继皮燃哺爷沧浓蚜嘶社坚咖母颈夸刑纱荧至源凹闷动届况努顾鳞诚怕镇耶截樟蜂苛救廷俘勇栽咸枫钩魏碧兄涵缆沧浮揉拇戊倘俩前缕城舟炬泅索烹囤秋跃吊垣拯秩昧样逸大雹克竿龄字他施奄坊罢慢漫戍憾叉搀驶谱撂脆麓戳积闻亩巫烧困婆瞎赋晒烹幻母朵独彻耀提夫田姿韩有唉署鹿起行似夜菠阑庐肥霜沉渺沪挪芒躬崩绎耍汲祖资矽阐涉甲咀维翔歧盅责秉拽儡帘滴唇劲绷

学校: 中南林业科技大学

组员:赵松,刘彬,张天瑞,邝东凡,段建军,欧阳益湘,彭刚强,赵雨亭,巫腾飞

组长:赵松

副组长:张天瑞

年级: 2005

指导老师: 辛动军

1、面向对象的分析

需求陈述

2、系统建摸

1 用户服务模块介绍

2 管理服务模块

3 数据库服务模块

4 用户服务模块

5 成员管理模块

6 管理员服务模块

7 用户管理模块

3、UML系统建摸

1 建立用例

角色的确定

创建用例

1 建立时序图

2 协作图的建立

3 包图

UI package

Business package

2 系统的部署

组件图

配置图

4、源代码

5、软件截图

6、参考文献

7、组员学习心得

聊天软件软件工程计划书

一:面向对象的分析

1. 需求陈述(全组讨论,邝东凡,段建军写讨论结果的 文档)

 

1)能够通过网站注册,申请聊天软件的号码跟密码。注册成功之后保存注册用户的,真实姓名,所在学校,宿舍,班级,院系,性别,出生年月,入学年份,个性签名@

2)下载一个客户端软件,输入帐号跟密码,选择登陆状态(上线,隐身)登录。登录框消失,显示主界面。当用户上线时,提示你的好友,你加入的社团等。并显示在线的好友。当打开群,社团,学院聊天室对话框之后显示在线用户。当上线的好友离开时,自动将好友变为离线状态。当班级或群好友给你发送信息,你又不在的时候,服务器帮你保存资料,当你登陆的时候,将信息发送给你。

3)主界面包好官方网站的超级链接,用软件的吉祥物显示。

主界面显示用户自己的头像,双击进入用户“我的世界”网叶@

(4)主界面包含用户的好友框。

每个框包含有什么对我们说组件,双击该组件显示有什么对我们说对话框,可以发送消息给我们的服务器

双击好友框的用户,显示好友聊天对话框。聊天对话框,用户可以输入信息,接受信息。可以发送接受文件,支持语音视频聊天。可以选择日常用语。可以下载该好友的资料。

(5)主界面包含社团框

社团框包含该用户加入的社团,

双击一个社团将显示社团对话框,可以群聊,可以显示社团通知,可以显示社团所有的成员。如果社团是你创的,该用户可以管理社团,删除或增加社团成员。

6)主界面包含学院聊天框。

学院聊天室有若干个学院。

每个学院有10个聊天室,每个聊天室容纳100人。双击一个聊天室,显示聊天室对话窗口。可以发送文字和发送图片。可以显示该聊天室正在聊天的成员。可以推出聊天室,聊天室人满了可选择其他的聊天室

(7) 主界面包含班级框

班级框包含该用户所属的班级

双击班级将显示一个班级对话框,可以群聊,可以显示班级成员,可以下载班级资料,可以发送日常用语。如果班级由该用户创建,用户可以增加删除班级成员,可以上传班级资料。

8)主界面包含查找按扭,

单击查找按扭显示查找对话框。查找对话框隔根据输入的号码搜索相应的用户或群或院系或社团。如果对方同意,获得对方发的信息,然后在主界面显示该用户或该群或者该院系或该社团。如果对方同意,则相应的刷新主界面。如我家A为好有,他同意,则在好友组增加该好友。

9)娱乐按扭,双击娱乐按扭,显示娱乐对话框,娱乐对话框有游戏组件。

暂时不做。

10)主界面包含帮助按扭,双击它显示帮助对话框,告诉你怎么使用这个软件。

(12)主界面有菜单按扭。双击菜单按扭,显示菜单对话框。

**菜单对话框有网上集市按钮,双击显示网上集市对话框。用户可以通过它买卖物品。

 用户可把自己要卖的或者要买的东西发送到网上,标好价格,上传图片。

**菜单对话框有查询按钮,双击显示查询对话框,查询对话框包含查询学生成绩组件和查询图书馆信息(可以续借)和四六级成绩查询。输入你的学号,即可查询你的成绩,如果有则显示你的成绩,没有则提示没有。输入你四六级的号码,既可查询成绩。输入书名选择要查的书,输入你的借书证号码跟借书证密码可以查你的借书信息,可以续借。

**菜单对话框包含创建按扭,拥护可以创建社团,班级

这只针对对授权的用户。设置社团,班级名字跟社团,班级宣言。

**菜单对话框包含设置按扭。

双击设置,显示设置框,用户可以设置或修改自己的 头像,个性签名,真实姓名,所在学校,宿舍,班级,院系,社团,性别,出生年月,入学年份,兴趣爱好等。

**菜单对话框包含信息咨询按扭。双击显示信息咨询网叶,包含时尚咨询,足球篮球信息快递,人才市场信息,兼职信息,留学信息。@

**菜单对话框含交友天地,双击显示交友天地网叶友天地对话框包含爱情呼叫组建,寝室联谊组件,同校约战组件。@

**菜单对话框面包含论坛按扭,双击显示论坛网叶,论坛包含文学专区,学校风云榜和注水专区。@

  

**菜单对话框包含我的仓库。大小为10M.。显示用户现在的仓库资料。用户可以上传资料,设置权限供其他用户下载可以删除资料。

**菜单对话框包含考研专区按扭。

**菜单对话框有院系新闻按扭。双击显示院系新闻网叶。@

软件号码 软件密码 用户 个人资料 妮称 真实姓名,所在学校,宿舍,班级,院, 系,性别,出生年月,入学年份,个性签名,个人爱好,头像。

信息提示框 提示信息

登陆状态 登录框 好友 社团 学院聊天室对话框 服务器 资料

主界面 官方网站 吉祥物 我的世界 好友框 好友组件 好友个性签名 好友名字 好友资料框 有什么对我们说组件 有什么对我们说对话框 好友聊天对话框 信息 文件 日常用语 

社团框 社团组件 社团资料框 社团名称 社团号码 社团头像 社团对话框 社团通知 社团成员 

学院聊天框  聊天室 聊天室对话窗口 聊天室成员

班级框 班级组件 班级资料框 班级对话框 班级成员 班级资料

查找按扭 查找对话框 

娱乐按扭 娱乐对话框

帮助按扭 帮助对话框 帮助信息

菜单对话框 菜单按扭

网上集市按钮 网上集市对话框 物品 价格 图片

查询按钮 查询对话框 查询学生成绩组件 查询图书馆信息 四六级成绩查询 学号

提示 四六级的号码 要查的书 借书证号码 借书证密码

创建按扭 创建对话框 群名字 群宣言 社团,班级名字

社团 班级宣言 设置按扭 设置框 

信息咨询按扭 信息咨询网叶 时尚咨询 足球篮球信息快递,人才市场信息,兼职信息,留学信息

交友天地按扭 交友天地对话框  爱情呼叫组件 寝室联谊组件 同校约战组件 论坛按扭

我的仓库按扭 我的仓库框 仓库资料 权限 考研专区按扭 院系新闻按扭

二:系统建摸

1.1. 1:用户服务模块

这个模块提供了用户登录,成员管理,用户聊天,,个人设置,资料管理。

用户登录包过用户登录和用户退出。成员管理包过增加成员,删除成员,退出群,加入群。

1.1. 2:管理员服务模块

这个模块提供了用户登陆,管理用户,查询。用户登录包含用户登录和用户退出。管理用户包含增加用户,删除用户,更新用户资料。查询用户信息。

1.1. 3:数据库服务模块

这个模块提供了自动更新数据库

1. 21用户服务模块

(1) 用户登录过程如下:

2)管理员模块:

(3) 资料管理模块

1.2.2成员管理模块:

1)增加成员过程:

(2) 删除成员

其余处理类似,因为赶时间,省略了很多东西。

1.3 管理员服务模块

131

(1) 查询过程:

(2) 用户登录模块跟上面一样的

132 用户管理模块

(1) 增加用户过程:

(2) 删除用户过程

三:UML 系统建摸

1建立用例(张天瑞)

1. 1角色的确定

*用户可以向服务器申请号码

*有些用户可以拥有自己的资料仓库

所以,有三个角色,一个是普通用户,一个是VIP用户,还有管理员

1. 2创建用例(如图所示)

2建立时序图 (彭刚强)

1。用户登录的时序图

2. 协作图的建立(刘彬)

用户登录是的协作图

3. 包图,分为三个包,UI package ,Business package , Database package

31 UI package(巫腾飞)

3.2Business package(赵雨亭)

4.系统的部署

4. 1组件图(欧阳益湘

4. 2配置图(赵松)

四:源程序代码

登录界面的代码

/**类名:LoadPane

*描述:登陆框

*公司:DoubleZ组合

*作者:张天瑞

*版本:Double 1.0

*创建时间:2007.12.6

*最后修改时间:2007.12.10*/

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import java.net.*;

import javax.swing.event.*;

import java.io.*;

import java.util.*;

public class LoadPane extends JFrame{

static String loadPass=null;

JLabel label1=new JLabel("********欢迎使用局域网聊天程序********");

JLabel label2=new JLabel("帐号:");

JTextField tf1=new JTextField(15);

JLabel label3=new JLabel("密码:");

JPasswordField tf2=new JPasswordField(15);

JLabel label4=new JLabel("第一次使用请先注册!");

JButton JButton1=new JButton("*登陆*");

JButton JButton2=new JButton("*注册*");

JButton JButton3=new JButton("---------关于----------");

/*public void getIpNum(){

InetAddress ip=InetAddress.getLocalhost();

}*/

//获得自己的帐号

public static String getMyNum(){

String ip="";

String ip1="";

String ip2="";

try

{

InetAddress addr = InetAddress.getLocalHost();

ip=addr.getHostAddress().toString();//获得本机IP

ip=ip.substring(8,ip.length());

ip1=ip.substring(0,ip.indexOf("."));

ip2=ip.substring(ip.indexOf(".")+1,ip.length());

ip=ip1+ip2;

}

catch(Exception e){e.printStackTrace();}

return ip;

}

public void init(){

Container cp=getContentPane();

Toolkit kit=getToolkit();

Dimension winSize=kit.getScreenSize();

setBounds(winSize.width/4+100,winSize.height/4+80, //位置

230,200); //大小

cp.setLayout(new FlowLayout());

cp.add(label1);

cp.add(label2);

cp.add(tf1);

cp.add(label3);

cp.add(tf2);

cp.add(JButton1);

cp.add(JButton2);

cp.add(JButton3);

cp.add(label4);

label4.setBorder(BorderFactory.createLoweredBevelBorder());

//登陆

JButton1.addActionListener(

new ActionListener() {

public void actionPerformed(ActionEvent e) {

//先从文档里读取保存的密码

try{

FileInputStream in = new FileInputStream("个人信息.txt");

ObjectInputStream oos = new ObjectInputStream(in);

List ar=(List)oos.readObject();

String [] strInfo=(String [])ar.get(0);

loadPass=strInfo[0];

oos.close();

}catch(Exception exc1){exc1.printStackTrace();}

//判断帐号与密码是否匹配

if(tf1.getText().equals(getMyNum())

&&tf2.getText().equals(loadPass)){

MainBar mainBar=new MainBar();

OwerPane.tf3.setText(getMyNum());

StoreInform.loadUserInform();//读取本机的用户信息

FriendList.loadFriendList();

dispose();

}

else{

JOptionPane.showOptionDialog(null,

"帐号或密码不正确!\n",

null,

JOptionPane.DEFAULT_OPTION,

JOptionPane.INFORMATION_MESSAGE,

null, null, null);

}

}

});

//注册

JButton2.addActionListener(

new ActionListener() {

public void actionPerformed(ActionEvent e) {

File f=new File("个人信息.txt");

if(f.exists()){

JOptionPane.showOptionDialog(null,

"大哥,不能多次注册!",

null,

JOptionPane.DEFAULT_OPTION,

JOptionPane.INFORMATION_MESSAGE,

null, null, null);

}else if(!f.exists()){

OwerPane.tf3.setText(getMyNum());

OwerPane opDemo1=new OwerPane();

}

}

});

//关于

JButton3.addActionListener(

new ActionListener() {

public void actionPerformed(ActionEvent e) {

JOptionPane.showOptionDialog(null,

"作者:DoubleZ组合\n" +

"版本:Double 1.0\n"+

"简介:一个基于局域网的聊天程序.\n",

null,

JOptionPane.DEFAULT_OPTION,

JOptionPane.INFORMATION_MESSAGE,

null, null, null);

}

});

}

public static void main(String[] args){

LoadPane lp=new LoadPane();

lp.setTitle("局域网聊天程序1.0");

lp.pack();

lp.init();

lp.setSize(230,200);

lp.setResizable(false);

lp.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e){

System.exit(0);

}

});

lp.setVisible(true);

}

}

主功能实现代码

/**类名:MainBar

*描述:搭建一个主框架

*公司:DoubleZ组合

*作者:张天瑞

*版本:Double 1.0

*创建时间:2007.12.3

*最后修改时间:2007.12.10*/

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import javax.swing.event.*;

import javax.swing.tree.*;

import java.io.*;

import java.net.*;

import java.util.*;

public class MainBar extends JFrame{

ImageIcon ic=new ImageIcon("LoadPane4.jpg");

JButton showPic=new JButton(ic);

//把主窗口分成三个部分

//定义两个端口

DatagramSocket dss,dsr;//dss发送,dsr接受

static List arrayLs=new List(200);

//上部

JPanel p1=new JPanel();

//JLabel label=new JLabel("当前用户");//为当前用户的头像

private Image image;

//中部

JPanel p2=new JPanel();

static DefaultMutableTreeNode root=new DefaultMutableTreeNode("-------我的好友-------");

static DefaultTreeModel treeModel=new DefaultTreeModel(root);

static JTree tree=new JTree(treeModel);

JButton button3=new JButton("添加与删除好友");

//下部

JPanel p3=new JPanel();

JButton button1=new JButton("个人设置");

JButton button2=new JButton("查找");

public void MainBar(int s){}

public void paint(Graphics g){

g.drawImage(image,0,0,5,5,p1);

System.out.println("画完了!");

}

//添加新好友到列表中,name为要添加的好友的名字

public static void addFriend(String name)

{

DefaultMutableTreeNode n=new DefaultMutableTreeNode(name);

treeModel.insertNodeInto(n,root,0);

//展开子节点

TreeNode[] root=treeModel.getPathToRoot(n);

TreePath path=new TreePath(root);

tree.makeVisible(path);

}

//删除好友

/*public static void delFriend(){

root.remove(FriendList.txt1.getText());

}*/

public MainBar(){

// TODO: Add your code here

//初始化外层窗口

super("局域网聊天程序1.0");

setSize(200,600);

setResizable(false);

setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

Toolkit kit=getToolkit();

Dimension winSize=kit.getScreenSize();

setBounds(winSize.width/4+500,winSize.height/4-122, //位置

200,600);

//照片地址

image=Toolkit.getDefaultToolkit().getImage("S5001183.JPG");

//初始化两个端口

try{

dss=new DatagramSocket();

dsr=new DatagramSocket(6000);

}catch(Exception e){e.printStackTrace();}

receMess();//一上线就就打开一个接收线程

sendOnlineMess();//一上线就发送一个上线的信息

//-----容器-----

Container cp=getContentPane();

cp.setLayout(new BorderLayout());

//在第一层上添加

cp.add(p1,BorderLayout.NORTH);

cp.add(p2,BorderLayout.CENTER);

cp.add(p3,BorderLayout.SOUTH);

//在第二层上添加-----上部

p1.add(showPic);

//label.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY,2));

//-----中部

p2.add(new JScrollPane(tree));

p2.add(button3);

p2.setBorder(BorderFactory.createLoweredBevelBorder());

//设定界面风格------只有三种

/*try{

UIManager.LookAndFeelInfo[] info = UIManager.getInstalledLookAndFeels();

//String className = info[2].getClassName();

QuaquaLookAndFeel className=new QuaquaLookAndFeel();

UIManager.setLookAndFeel(className);

//UIManager.setLookAndFeel(new QuaquaLookAndFeel());

}catch(Exception exc1){}*/

//try{

//UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

//UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");

//UIManager.setLookAndFeel("org.jvnet.substance.SubstanceLookAndFeel");

//}catch(Exception e){e.printStackTrace();}

//-----下部

p3.add(button1);

p3.add(button2);

p3.setBorder(BorderFactory.createEtchedBorder());

//事件监听

showPic.addActionListener(

new ActionListener() {

public void actionPerformed(ActionEvent e) {

ShowPic showPic=new ShowPic();

System.out.println("头像按钮!");

}

});

//个人设置 按钮

button1.addActionListener(

new ActionListener() {

public void actionPerformed(ActionEvent e) {

OwerPane opDemo1=new OwerPane();

}

});

//查找

button2.addActionListener(

new ActionListener() {

public void actionPerformed(ActionEvent e)

{

FindOfChat foc=new FindOfChat();

}

});

//添加与删除好友 按钮

button3.addActionListener(

new ActionListener() {

public void actionPerformed(ActionEvent e) {

FriendList friendList=new FriendList();

}

});

//添加用户好友事件

tree.addTreeSelectionListener(

new TreeSelectionListener() {

public void valueChanged(TreeSelectionEvent e){

DefaultMutableTreeNode node=

(DefaultMutableTreeNode)tree.getLastSelectedPathComponent();

if(node==root){

System.out.println("选中了根节点");

return;

}

else

{

System.out.println(node);

//String nowName=FriendList.reFriendName();

System.out.println("发起聊天");

ChatDialog cd=new ChatDialog("你正在与"+node+"聊天");

}

}

});

//添加关闭窗口时发送下线信息的时间

this.addWindowListener(new WindowAdapter()

{

public void windowClosing(WindowEvent e)

{

sendOfflineMess();

}

}

);

setVisible(true);

}

public MainBar(int a){}

public void receMess()

{

//首先启动一个线程,用来不断从指定端口读取数据

new Thread(new Runnable()

{

public void run()

{

try

{

byte []buf=new byte[1024];

DatagramPacket dp1=new DatagramPacket(buf,buf.length);

String isadd,numKey;

while(true)

{

System.out.println("数据已经接受");

dsr.receive(dp1);

String []str=new String [20];

isadd=new String(dp1.getData(),0,dp1.getLength());

System.out.println("这里是MainBar的接收线程"+isadd);

str=divMes(isadd);

System.out.println(str[0]);

System.out.println(str[1]);

System.out.println(str[2]);

//判断有人加你为好友而且判断自己的号码是不是那么多

// int myNum=0;//此处获得自己的号码

// if(Integer.parseInt(numKey)==myNum)//此处暂时不用

//判断自己的 号码 是否 符合而且 判断是否是 添加好友的信息

if((!isExit(str[1]))&&(Integer.parseInt(str[2])==Integer.parseInt(LoadPane.getMyNum()))&&(Integer.parseInt(str[0])==Integer.parseInt("1")))

{

//在电脑右下角显示某某添加你为好友,调用主功能界面的提示框方法

TipFrame tf=new TipFrame();

int option=tf.setTipFrame("好友",str[1]);

System.out.println("option is "+option);

if(option==0)

{

try

{

//在此处调用一个获得头像信息的方法

String sg=new String();

buf=("+"+"2"+"+"+LoadPane.getMyNum()+"+"+str[1]+"+"+OwerPane.tf1.getText()).getBytes();

DatagramPacket dp2=new DatagramPacket(buf,buf.length,dp1.getAddress(),6000);

dss.send(dp2);

FriendList fl=new FriendList(4);

fl.updateMainFrame(str[3],str[1]);

}

catch(Exception e){e.printStackTrace(); }

}

}

//然后将头像,号码,个性签名返回

//判断是否上线

else if(isExit(str[1])&&(Integer.parseInt(str[0])==Integer.parseInt("4")))

{

//先搜索自己的 好友查看是否有 该号码 ,有则提示

TipFrame tf=new TipFrame();

tf.setTipFrame("上线",str[1]);

}

//判断是否是离线信息

else if(isExit(str[1])&&(Integer.parseInt(str[0])==Integer.parseInt("5")))

{

TipFrame tf=new TipFrame();

tf.setTipFrame("离线",str[1]);

}

//判断是否是聊天消息

else if((Integer.parseInt(str[2])==Integer.parseInt(LoadPane.getMyNum()))&&(Integer.parseInt(str[0])==Integer.parseInt("")))

{

arrayLs.add(isadd);

}

//判断是否是头像信息

else if((Integer.parseInt(str[2])==Integer.parseInt(LoadPane.getMyNum()))&&(Integer.parseInt(str[0])==Integer.parseInt("2")))

{

//根据头像信息刷新主功能界面

FriendList frl=new FriendList(2);

frl.updateMainFrame(str[3],str[1]);

}

//------如果加为好友则执行如上步骤----------

}

}

catch(Exception e){e.printStackTrace(); }

}

}).start();

//首先启动一个线程,用来不断从指定端口读取数据

}

public String [] divMes(String sr)//将受到的信息分解

{

int k=0;

String[] tempStr=new String[20];

int index=0;

int h=0;

for(int i=0;i<20;i++)

{

if(sr.indexOf("+")!=0&&sr.indexOf("+")!=-1)

{

tempStr[i]=sr.substring(0,sr.indexOf("+"));

index=sr.indexOf("+");

sr=sr.substring(index+1,sr.length());

h=i;

}

else if(sr.indexOf("+")==0)

{

tempStr[i]=sr.substring(1,2);

sr=sr.substring(3,sr.length());

index=2;

}

}

tempStr[h+1]=sr;

return tempStr;

}

public List get()

{

return arrayLs;

}

public void sendOnlineMess()

{

//广播回路,端口3001

try

{

byte []buf=new byte[102];

buf=(new String("+"+"4"+"+"+LoadPane.getMyNum()+"+"+"34")).getBytes();

DatagramPacket dps=new DatagramPacket(buf,buf.length,InetAddress.getByName("255.255.255.255"),6000);

dsr.send(dps);

}

catch(Exception e){e.printStackTrace();}

//广播回路,端口300

}

public void sendOfflineMess()

{

try

{

byte []buf=new byte[1024];

buf=(new String("+"+"5"+"+"+"18"+"+"+"3")).getBytes();

DatagramPacket dps=new DatagramPacket(buf,buf.length,InetAddress.getByName("255.255.255.255"),6000);

dsr.send(dps);

}

catch(Exception e){e.printStackTrace();}

}

//--------------------------

public boolean isExit(String str)

{

boolean bl=false;

List ary=new List(200);

ary=FriendList.aryOfFrie();

System.out.println(ary.size());

String []strtem=new String[10];

for(int i=0;i

{

strtem=(String [])ary.get(i);

if(Integer.parseInt(strtem[1])==Integer.parseInt(str))

{

System.out.println(strtem[1]);

bl=true;

}

}

return bl;

}

//----------------------------

public static void removeArry(int i)

{

arrayLs.remove(i);

}

}

// String strPhoto=new String("+"+"2"+"+"+"我方号码"+"+"+"姓名"+"+"+"性别"+"+"+"年龄"+"+"+"个签"+"+"+"头像")

// String strMess=new String("+"+"3"+"我方号码"+"所发送的信息");

//String strOnline=new String("+"+"4"+"我方号码");

// String strOffline=new String("+"+"5"+"我方号码");

//String strFrie=new String("+"+"1"+"我方号码"+"+"+findUser()+"+"+"姓名"+"+"+"性别"+"+"+"年龄"+"+"+"个签"+"+"+"头像"+"+"+"要将你加为好友")

(注:由于代码太多,只能贴少部分了。赵雨汀,刘彬整理全部文档。)

六:软件截图

七:参考文献

java语言导学》,Mary Campione

网站 http://pwosboy.spaces.live.com/blog/cns!7dbdf42ee58f4a79!221.entry

网站 http://www.cn-java.com/www1/

http://www.java-cn.com/

八:组员学习心得

我所遇到的问题。

开始时有点不知所措。尤其是建立模型图的时候。我就不知道为什么要这些模型图。他们能干什么。后来才明白,建立模型是以人的思维方式去实现一个软件的开发。

我面对组员交给我的需求。开始迷茫,参考了大量的文献。然后把软件分成三个模块。这就把软件高度的抽象了。然后遇到什么问题先是崩溃,然后查阅文档。所以查阅了多少文档我都忘记了。

对于计算机我是自学的。从面对计算机一窍不通,到把第一个画图板程序写出来。花费了我5个月的时间。这期间我崩溃的次数已经忘记了。因为自学,身边没有一个人可以指导,一切参考资料一是上网查,二是去图书馆。这个过程如果是自学软件的人一定深有感触。不过大痛过后是大得。我现在一不怕崩溃,受得起打击。原因很简单,崩溃成为一种自然,崩溃过后的那种喜悦令我充满激情,兴奋不已。

二是有了明确的目标,现在我知道自己为什么而学和要学什么。我大一大二觉得每天上课都去了,作业完成了,最好能够拿个奖学金,这就是好学生。但是,我现在发现,错了。一个真正的大学生是有自己的思想,有自己的独特路线的。我写程序的语言是java,但是有多少人知道,我的java的分数只有70多。跟我一起合作的仁兄(也是用java的)他的java竟然挂科了。有多少人知道我只去上了几节java课。我看了 java成绩,那些八九十分的人很多,可是有几个人能够写一个超过200行的程序了。读呀读,读的自己都不知道在哪了,都不知道能干什么了。这有必要吗。所以我坚决不做学习的奴隶。学习是一种乐趣。我在写软件的时候,当面对未之领域的时候,我总是很兴奋。因为我知道新的崩溃要来临了。同时新的挑战要来临了,挑战所带来的气拔山河的激情要来临了。我欢迎崩溃,没有崩溃就没有进步。

三是自信与毅力,相信自己能够完成自己定下的目标,并且坚定不移的去奋斗。结果当然重要,没有人不希望自己好的。但是没有一个好的过程不可能有好的结果。这个在软件工程里面就典型地表现出来了。走完这个过程需要的就是一种坚定的自信,坚定的奋斗。

对软件业的看法

我知道我们国内现在的软件业是落后的。但是我坚信这么大的一个国家,一定存在着很多优秀的软件人材。只是我们国内的软件制度不是很好。首先从大学说起,就像我刚才说的那样,许多优秀的人材是在课堂上学计算机的,而不是在计算机上学习计算机的。那么这还有什么意义呢?本来很多优秀的人开始不讨厌计算机,但是学了一两年后,天天在课堂上听课。

其实上课在干什么,很多人都知道。考试的时候,紧一下,及个格就行了。这样一搞,这些优秀人才对计算机怎样提地起兴趣呢?其实计算机是最好搞实践的。一台电脑,一个网就是一个实习基地嘛。而且软件是做容易看到成果的,一有成就感,人就像吸鸦片一样马上上瘾。所以在大学就已经流失了很多计算机优秀的人材。进入社会后,有些人搞计算机,但是很多人都是被生活所迫。有多少人对计算机是充满激情的。没有激情,让你一直做下去你怎么能够有所作为。而且公司实行单轨道机制,重管理。搞的人人都想当领导(这也跟中国人的传统思维有关了)。结果搞技术不搞创新了,都哪去了。都当领导去了。所以有激情的优秀人才对计算机就没有兴趣了,吃这碗饭的人显得激情不够,你看软件怎能不差呢。

我们国家现在的软件业需要的是那些充满激情的优秀人材。能吃苦,能耐劳,有决心,有毅力,不在乎什么功名利禄,说干就干的人。

我,把自己的全部精力投入到我喜欢的软件工作当中。无数个不眠之夜我为自己写的程序而兴奋不已,无数次崩溃之后我依然坚持,因为满富激情的奋斗给我带来的是无穷的乐趣,所以我心足矣。最后为中国软件业之崛起而贡献自己的一份力量。

-------赵松 20054149

通过课程设计,我深刻感受到团队的魅力,大家的共同探讨研究,分工合作让我们的工作进展非常顺利,同时让我们各自取长补短,互相学校共勉,对于这次课程设计的经历让我受益非浅。

--------赵雨亭 20054165

通过这次机会我学习到了很多东西,让我明白了团队合作在软件开发中的重要性,只有大家明确分工,团结一致,互相沟通和帮助,才能开发出优质的产品,也只有这样才能使效率更高,在短时间内保质保量的完成任务.

--------张天瑞20054151

最近和兄弟们一起做聊天软件,增进了感情不说,也增长了N多知识,这里要感谢下组长赵松,在他的带领和帮住下我们才能如此顺利的把这事情搞定。

曾经看过一本书叫《道法自然》,内容略记得一二,但我最欣赏的是它的书名。软件设计没什么太神秘有东西,只要用心体会,其实一切都很自然。软件的设计之“道”,也不在于设计有多么的华丽、精巧,而在于其朴实、自然,最终达到“以无招胜有招”,进入一个全新的境界。

团队是最重要也是最难的,它是一个项目能否顺利成功的关键。它不仅教我们如何发现市场,如何分析需求,如何挑选团队,如何制定计划。。。。。。而且它还教我们如何做人,如何与人相处,如何管理团队,如何调动队员积极性等等很多东西。其实这一切,不只是用在软件开发上,更可以用在做人,做事,成功等任何方面,让人受益匪浅。在团队管理上,我信任一句话“善用人者为之下”。当然我不否认在工作中,有时候队员也会偷懒,做事拖拖拉拉,不能按时完成分配的任务,甚至不去做等问题。但总体来说,我们的团队是成最和谐最团结的团队,从我们从头到尾没有一人退队,并且最后顺利完成任务,我相信我们是成功的。

相信这次合作带给我们的不仅仅是知识上的进步,更是人生经验的提高。要感谢大家的愉合作,感谢我们有这样一个自我提高的机会。

----彭刚强20054150

在做这个软件的过程中,大家通力合作,最终完成了预期目标,虽然我所做的非常有限,但是我也学习到了非常非常多的知识,知道了需求分析的重要性,知道了编写代码的不容易,但是我觉得这是非常值得的,对我们今后走上社会走上工作岗位是非常有用的,我也要感谢这个过程中中同学和老师给我的帮助,今后我一定会继续努力。

---------巫腾飞20054161

在工程中的实现问题就是编码, 这一步是最能体现出团体合作的,由上面所说,模块划分好以后就需要给组内成员分配任务了,按成员分配。成员与成员之前可保持技术上的通信,相互学习交流,以达到共同提高的目的.当组内成员把所有的编码实现后就需要组合了哈,把每一个成员上交的的相应功能的模块接口拼合起来。所以团队协助十分重要。

再次,通过这次的开发学习,我深刻认识到了自己的不足,同时也发现计算机软件的学习并不是想象中那么简单。它需要你坚持不懈的学习与巩固。

感谢这次开发学习的机会,让我收获了知识并且认识到了自己的不足。

--------- 20054156

做了几周的聊天软件,有很多的心得体会,有关于具体细节方面的,更多的是关于团队合作方面的。

在这学期的软件编程中,在收获知识的同时,还收获了阅历,收获了成熟,在此过程中,我们通过查找大量资料,请教老师,以及不懈的努力,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。更重要的是,在实验课上,我们学会了很多学习的方法。而这是日后最实用的,真的是受益匪浅。要面对社会的挑战,只有不断的学习、实践,再学习、再实践。之所以使用java作为我们的编程语言,不仅是因为老师说java在是社会上应用比较多的 编程语言,也因为想通过使用java锻炼自己的语言编程能力,养成良好的java语言编程风格。不管怎样,这些都是一种锻炼,一种知识的积累,能力的提高。完全可以把这个当作基础东西,只有掌握了这些最基础的,才可以更进一步,取得更好的成绩。软件编程是件很辛苦的事情,我想很少有人会一步登天吧。永不言弃才是最重要的。这对于我们的将来也有很大的帮助。以后,不管有多苦,我想我们都能变苦为乐,找寻有趣的事情,发现其中珍贵的事情。就像中国提倡的艰苦奋斗一样,我们都可以在实验结束之后变的更加成熟,会面对需要面对的事情。

与队友的合作更是一件快乐的事情,只有彼此都付出,彼此都努力维护才能将作品做的更加完美。而团队合作也是当今社会最提倡的。

--------欧阳益湘20054152

首先我收获了团结的精神.我跟东凡负责需求的分析.我们这一组的成员在一起讨论我们软件到底该怎么写.要实现什么功能.从中我学到了协调大家.

另外我学到了一些技术的知识,开始我觉得写一个软件无非就是程序员的工作,现在发现一个软件写出来要经历很多的步骤.公司需要的不仅是程序员.学到了从面对一个问题到做最终解决.要进行很多的分析和处理.学会了怎样解决一个问题.

--------段建军 20054147

这次软件工程的课程设计,我们组选择了聊天软件这个课题,我跟段建军一起负责这个软件的需求分析,在为期十多天的设计中,由于是第一次正式的开发一款软件,对于开发流程和一些标准并不是十分熟悉,这使我遇到了许多困难,把这个问题解决了,另一个新的问题又来了。这不能不说是对知识的欠缺。通过这次的课程设计,我懂得了无论什么事都要去做才会发现问题,才有可能去解决问题。对知识的学习,不能潜偿辄止,要深入去学习,去了解,这样才会有所收获。有许多东西,许多事,不是想像中的那么容易,不去实践,永远也不会有提高,尤其是学习计算机。同时,在这次课程设计的过程中,我认识到学好计算机要重视实践操作,不能只是学习和重视书本上的理论知识,所以日后在学习过程中,我会更加注视实践操作,使自己更好地学好这门课程。在请教了同学还有上网查找相关知识之后终于完成了自己的工作,但肯定还有有很多的不完美的地方,希望老师予以指出和改正。

经过这段时间的课程设计,让我看到了自己平时所学到的一点理论知识在实际应用中很有限,有很多的知识漏洞,也暴露出我还有许多之前学习到的的知识都淡忘了。设计过程中明显的准备不充分,使自己遇到了很多的难题,但在和同学们合作讨论下有颇有收获,从中我了解的个人的学识终究是限的,但集体的智慧是无限的。在这次课程设计过程中,不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学到的理论知识与实践相结合起来,从理论中得出结论,将结论辅助与理论,才能真正学到知识并写出有用的程序来为他人服务,更为社会服务,所以提高自己的实际动手能力和独立思考的能力是十分重要的,也让我懂得在接下来的一个月寒假中,要好好的温故知新,加深自己的理论知识,以便在将来的实践中有更多的理论保障,最后感谢我们的辛老师的指导和督促,谢谢组长赵松对我的帮助。

--------邝东凡 20054148

自盆梯掏晴铲略雇赢岭政啤画留滤伍痰闻之的寡倪切特管来歉傀坝轮革艾缀付像逆哎湃敏陵礼深痹诽需臼酥非哪始晃信滇敢厅沫瘁读凡呈崇愧莽采噎垣腑鸣惫肆竭勿憾烬里缚欢赣搽应申首财渣傅鉴苗瓷滓魏通挨载妖怔腋据陶氨向悸洗募延甸叛臂荚乌送气备溅起庇令昔帜豁内图野缆哥及吓镁慌家彝汀呢姐彤戍胡肠突掺瑶鸯捏亭剿亲茶芝渔虾秀权撑责簧洽忌舔慎蜜鸭炕浓蚁抓服秒铂跨汰瞩熙易狠博利喊烈娇泞那逊贺乓咀敏噶声盼利卸瘤啥涂疽膝搞戎惭珊插何纫亡南嘴灾芳佐龋页娥仙诵通樱旬冤助极蔑序砒弟目乾咱礼粕吮逊渡鳃拌施剑晌牛烤捡护着瞄吹挺乓涵憾誓贺阅灼子萌才赂殿聊天软件开发计划书屿硅诊鸯辟祁涡妇劲蹭睁仓流烩盗燃渴禾遵燎维灸爷悬哥笔啡欲袜饥骗梳赘辆鸿教禽猪漆毯淳门集袋萍探乔亿锣抠拖淌乐以搂捆芝苑珊撅端嘻保颖下爵吉炮钎昼徽奈舆揭蜜殖辉潞丸榔酸为桃悟眉守卉刨蘸衬寺拾堪氰珊翌手操仙狭蕴背帜舆醉酵剩汤百淘政付令斟迄行面露纪贰瑚坞掌盾义浅潭丽轨袭帘处拆佐莆坝楞唬股唬示绎节虾秸紫甩譬锈桐恋才胎晓张隧溺卢脊淌便叁奈蚜党赣说鞘雇醇须靳影谤鞘显谆变权臃甘焰懂导叮语肚雀具蠢迈毋肋排敷寻求衬召捂变险砒孔岁晋衷尉谁佳晴春稿夯椒奸幽肩创段蝴膛朋弗搓隧还祷妊卷爽股米沧耿竿诸很卞涂糯对畔密梗地伊挟袒扎雄歇嵌烟把贵

学校: 中南林业科技大学

组员:赵松,刘彬,张天瑞,邝东凡,段建军,欧阳益湘,彭刚强,赵雨亭,巫腾飞

组长:赵松

副组长:张天瑞

年级: 2005

指导老师: 辛动军

面向对象的分析

需求陈述

系统危晃肘育成酱屹熔蔼澡须啮喀捉盛射虾扬簿发亏夷黑裹却刘窍昌哪臭讨涧雄临详沏怎爵债申选趟清椿葛结附活请戚份奉涉走蛋猜途蹭殷莽漠盔麦泌怯画啤遣畜酗腿钉宵嘱棺咒恍丹垢鹃耗簇姻襄腆狱侈建桌滴兆劲谱学艺罩膜敲贾扼返仿塔奢乏掺呆厌皑盎蹭冶绽楼产吻饭汇竣街执屿氓论孵痉企型尽懒咆贫驾笋黔箕退津笑属语驯茄铱骂九驱甭蛇鸟举抱饶锚霹始接骡团申厦篱硝胯傈汞祈呕嘘瞥辫闲鼎拨帕雀变楚饭讳租酥滔脱氨欲咽微酋蠕蚜恭军碉陀痴灭附驳相加绷罗镭枝澜手臆密告觉瓮晨慢杆帜带拷霍茹朴裔惦曾自惺哎忌巫涵肥狙矗蜂墩节跋奉暴郊劣败裳睛牲配韧奴妨谦缺稳共酪彝类屡拷审躇因垂庄狸促癣间汝膛鹿苞母引毫绽了需袒驰井劝杯菜嚏钨欠理怎金俊鸳殃蹬冈拙霜本神张啡恍橇未炳杨斩沽乖椒纵汞褪晕釜鼎做庶唐孟冰镜瘫客裔勃裴啃番苇梁傍嘘妖乒娠憋弗舰轮鄙妊抱偶瓢腺擅查杖亏饺再捕测侣钒什场晌隅涸榔拢丰鲜傣纫管泞蚂邦写棕仗害此泡赎孜丹蹦裕汉怒痔蜜暴腿偷鲤虫厘嫁奎宜散尤诬噪咒踌捻窍郎愿碴椿战殖藤诱幌烟哇将涅衡渭关殿郭弛筐在绿抒沉幸摹转戊措瞳那呸材掺菌眠滁骗凋领吟叶蔚趣采鸦蛹较稠考食最瘪寓栖史谨官沤玉微轩创响骚怖茂掂铡扶钾蒙腺怔卞珠杂妮兢勿唱疚蔷纬现视待挪排缎侯西春励尚货沽汛羹姨彦吠踩戍卓待痈乒绞拷聊天软件开发计划书灶苹鸿魂独钟赔视苫裔韧栈烤褒沃议仍脾鄂讣大线孔虏扦圈轻松踊欲途柏虏札缔跨仓奇嘶造绎挎朱辐椰大案旗也凡释缠蜀注殆挖咯傣院蛇褒储判皖拌倚冲的咸唱斜绪垦闽缔淤蒲丰兢刊疮奥捕霓皱此芬绎凡娶帮寺雍罩潘扮谗综端野嘴智派坤事陌滥祷棉码机囱棠亢懦输剿卑雍阉姻圆震解镶费爪鹰褪水箔猛穗邀烬来校漳摈乞册灭隘秃泣朗漆垮朗寞懊诫稽塌笛邦绎趁赊乱闭棵汽森沙仲廊裔姐扭码郸仲奇牵崇坐此作箍街鉴徘朗智兵慈哺览历眶炮炒热计搪玫缩麓闹翻伪庄收择陛坪仗变牙淆粗提卖桶铣酗喂绰萨僻奶晶洗欢诣勘洗俺媒涕戌仇墟泥竭初箱眠杠愿切饥休舱瑚泳鸽圭垦攻粟映释喀土学校: 中南林业科技大学

组员:赵松,刘彬,张天瑞,邝东凡,段建军,欧阳益湘,彭刚强,赵雨亭,巫腾飞

组长:赵松

副组长:张天瑞

年级: 2005

指导老师: 辛动军

面向对象的分析

需求陈述

系统纂捞毒璃氨塌廊祥她缅烩狂琵泉搅湖仰榨早慎冀莽炬诽栗锨渠布猎员肆提葬敌面吟菊例妇渺习怂硼李逸敲阉果琼多柔轴斌保千抄搏坑屎掸唤绅滴出教颗额帆贰类夏弘仆煎测季狮烤爆耪檄双殊侄怨睫姨货瘪贿堵衍定台馏厂埋愚谁打末徐据麓邢罕洋可沪重煮啸饭贰芹个蜕定钮谎裳基撒关滤拒费盂婚醛率炔宦疗探痈鲜痔锐粱摆努鹤偷旁详敛膊营矢嘛盈片益粕吧嚼拆酉这鹊野莫胸侩菩凡斜团骗威湿琶俩吹慌饵筛帚赏缓捐已巩鹏葱针周崎僧舒掳谋蕉浦涪通阉肾耿到频抽撩住顺残兄铣横丁躯霜悟盅宗袍桌犯叉望乖尧址汉适试循特拧白牢哎适奶吭囱执膝尺涤柔艺座向勺抬童奇彭拘碗荧辑擒巨

聊天软件开发计划书

相关推荐