Linux课程设计报告书(QQ项目JAVA版)
更新时间:2024-04-06 12:58:01 阅读量: 综合文库 文档下载
Linux操作系统与程序设计
姓名:王纪兵 学号:101842126 班级:软1041 指导老师:陶陶
课程设计报告书
小组成员:
王纪兵 软件工程 101842126 程华涛 软件工程 101842107 李宗男 软件工程 101842117 纪贤松 软件工程 101842112 杨涛 软件工程 101842137
2013.6.7
目录:
1、实验项目目的 .............................................. 3 2、实验项目的功能及模块划分 .................................. 4 3、实验项目的人员组成及指责划分 .............................. 5 4、设计与实现 ................................................ 6
4.1 系统结构................................................................................................................6
4.1.1.....................................................................................................................7 4.2 客户端界面............................................................................................................7
4.2.1 注册...........................................................................................................7 4.2.2 登录...........................................................................................................7 4.2.3 界面设计...................................................................................................8 4.3服务器的实现.........................................................................................................9
4.3.1 用户登录...................................................................................................9 4.3.2 转发聊天消息.........................................................................................10 4.4 数据库访问或文件操作......................................................................................12
4.4.1 ….............................................................................................................12 4.5 通信模块的实现..................................................................................................13
4.5.1 通信方式的选择.....................................................................................13
5、测试与调试 ............................................... 14 6、总结 ..................................... 错误!未定义书签。 附录:程序代码 .............................................. 15
1、实验项目目的
QQ是一个经典的在线聊天系统,可实现点对点聊天、公聊等基本聊天功能。现应某公司要求,用JAVA重新开发QQ软件,要求其运行在Linux平台之上。除了有基本的聊天功能外,还可以有文件传输、游戏娱乐等功能。
项目背景:通过一段时间JAVA学习,需要对所学知识做一个综合的运用。NIIT的课程也重在对实际动手能力的培养。通过编写聊天室程序,巩固前段时间所学知识,锻炼小组成员之间团队合作的能力,积累宝贵的项目经验。
2、实验项目的功能及模块划分
本实验是一个Linux下的网络即时通信工具…,[描述功能]。
项目分为客服端和服务端两个模块
实验主要功能是实现两台电脑之间相互通信,本程序是仿照QQ来做的。
注册界面可以实现用户注册成为会员,从而能够彼此之间通信
登录界面可以使用户登录使用本系统
好友列表界面可以清楚的看到在线好友,方便随时和好友即时聊天
好友之间聊天界面实现具体聊天功能
服务端主要是处理客服端发来的请求
3、实验项目的人员组成及指责划分
王纪兵:组长,系统分析、整体设计和模块划分。 纪贤松:客户端界面设计和编码。 杨涛 :通信模块设计和编码。
程华涛:数据库访问或文件操作的设计和编码。李宗男:文档维护和测试。
4、设计与实现
4.1 系统结构
客服端——|
登录界面
|
登录————————————— 注册 | 登录否? |
—————— 注册界面
| 否 是| |
—— —— ———————
| | 注册成功 | |注册失败 返回重新登录 | | |
好友列表界面 ———— ———————| | | | |
返回登录 返回提示错误信息
服务端————|__ 监听
| 客服端 |
|发送请求
—————————————— Error | | | |判断请求类型 | 其他情况 | —————————————————— —————————— |注册 |登录 |好友
|请求 |请求 |聊天请求 ————| ———| ———|
| | |
响 响 响 ———…… 应 应 应 | | | | |————| ——————————— |客服端
返回给客服端 |_____________________|根据返回值做出相应反应
4.1.1 4.2 客户端界面
4.2.1 注册
4.2.2 登录
4.2.3 界面设计
4.3服务器的实现 4.3.1 用户登录
当用户在登录界面提交账号(10000)和密码(123456)后,客服端就会向服务端发送
头标识:账号:密码
字符串:login:10000:123456 代码如下:
out.write((\
当服务端收到客服端发送的字符串,服务端会根据头标识判断进行什么操作,因为登录的头标识是login,所以会进行相应登录验证,并向客服端发送处理结果,客服端根据返回结果做出相应处理,以此来
判断是否登录成功。 4.3.2 转发聊天消息
当在发送中输入:测试发送内容 此时客服端会向服务端发送 字符串: 头标识:接收人ID:发送人ID:发送内容 Send:10001:10000: 测试发送内容 代码如下:
头标识:接收人ID:发送人ID:发送内容
out.write((\Bytes());
服务端接收到客服端发送来的字符串,会根据头标识进行相应的处理
QQServerSocket类根据头标识(send)进行的相应处理代码段如下:
}else if(buf[0].equalsIgnoreCase(\)){
try { Socket st =
//Socket st =
out = st.getOutputStream();
out.write((\+str+\).getBytes()); e.printStackTrace();
terms.get(Integer.parseInt(buf[1])).getS(); tm[Integer.parseInt(buf[1])].getS();
} catch (IOException e) { }
System.out.println(\+str);
}
客服端会不断扫描接收服务端发送的字符串,如果是发送给自己的内
容,此客服端会接收并根据字符串头标识做出相应处理
4.4 数据库访问或文件操作 4.4.1 数据库表
qq_user{ int u_id,
varchar2 u_name, varchar2 pwd } 分析
设计 建表
4.4.2建模
存入用户信息,名称,密码,数据库连接通过使用java驱动建立连接,用户注册,通过服务器处理,保存在数据库中。
4.5 通信模块的实现 4.5.1 通信方式的选择
项目分客服端和服务端两个工程
客服端和服务端是通过Socket文件流 进行通信的
4.5.2 通信方式的实现
在聊天系统中Socket.Send()和Socket.Receive()方法都是传递byte[]的,所以就要想办法把文件给变成byte[]。一开始试过用StreamReader来读取string,然后用Encoding来进行编码得到byte[],接收以后再还原成string写入文件。
5、测试与调试
[举例说明]
登录时,判断是否已经登录,还有判断是否存在账号
编写登录或注册或菜单界面时,编写的测试类以此来测试
故意输入一些非法数据来测试客服端有没有过滤他们
6、总结
组长,系统分析、整体设计和模块划分【王纪兵】 本人主要任务:
规划QQ项目的整体开发过程,把QQ项目分成若干相互独立的模块
编写各个模块的具体编写步骤
分配小组人员开发相应模块
协调小组内部人员之间的联系
整合各位小组人员编写的模块
协助小组人员完成任务
通过本项目开发,我学会了如何把一个大项目划分为如干小任务。
并且如何分配人员去快速有效完成各自任务,同时又很好的联络小组成员之间的联系。
附录:程序代码
服务端主要代码如下: QQServerSocket类:
package cn.sayphone.qqserver.service;
import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Scanner;
import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
import cn.sayphone.qqserver.entity.User; import cn.sayphone.qqserver.util.Config; /**
* 参考文档 http://wenku.http://www.wodefanwen.com//view/b8611bd7b9f3f90f76c61b66.html * Socket传递对象参考
http://blog.csdn.net/kongxx/article/details/7259827 * @author BB_sayphone.cn * @version 2013/06/07 */
public class QQServerSocket {
public static void main(String[] args) throws IOException { }
static HashMap
QQServerSocket server = new QQServerSocket(); server.start();
static HashMap
private ServerSocket ss; private Socket s;
public QQServerSocket() throws IOException{ }
tm = new Term[20000];
ss = new ServerSocket(65535);
public void start() throws IOException{ //ServerSocket ss = new ServerSocket(65533); new SendUsers().start(); while(true){ } }
//@SuppressWarnings(\
private class SendUsers extends Thread{
while(true){
StringBuilder bd = new StringBuilder(); Collection
Collection
} catch (IOException e) { }
e.printStackTrace();
OutputStream ot = st.getOutputStream();
User us = it.next();
bd.append(us.toString()+\);
public void run(){
s = ss.accept();
tm[count] = new Term(count,s); count ++;
//一般创建客户端服务线程为客户提供服务
new Service(s).start();
ot.write((\+bd.toString()+\).getBytes());
} }
}
}
private boolean isReg(int id,String pwd){ Connection conn = Config.getConn(); try {
}
Statement stmt=conn.createStatement();
String sql=\+id+\System.out.println(\+sql); ResultSet rs= stmt.executeQuery(sql); if(rs.next()) return true; e.printStackTrace();
pwd='\+pwd+\;
} catch (SQLException e) {
return false; }
private String getUserName(int id,String pwd){ Connection conn = Config.getConn(); try {
}
return \;
Statement stmt=conn.createStatement();
String sql=\+id+\System.out.println(\+sql); ResultSet rs= stmt.executeQuery(sql); if(rs.next()){
return rs.getString(\); }
e.printStackTrace();
pwd='\+pwd+\;
} catch (SQLException e) {
}
private class Service extends Thread{ public Service(){ }
public Service( Socket s){ }
private Socket s;
this.s = s;
//in = s.getInputStream(); //out = s.getOutputStream();
private InputStream in; private OutputStream out; public void run(){
while(true){
try {
in = s.getInputStream(); }
out = s.getOutputStream(); e.printStackTrace(); } catch (IOException e) {
//System.out.println(\
Scanner sc = new Scanner(in); String str = sc.nextLine();
String[] buf = str.toString().split(\); if(buf[0].equals(\)){
);
//System.out.println(getUserName(Integer.parseInt(buf[1]),buf[2])
if(isReg(Integer.parseInt(buf[1]),buf[2])){
System.out.println(\);
if(users.containsKey(Integer.parseInt(buf[1]))){
try {
//账号已经登录
out.write((\+\+\).getBytes());
System.out.println(\账号已经登录\);
//System.out.println(\
} catch (IOException e) { }
e.printStackTrace();
parseInt(buf[1]),buf[2]));
}else{
User one = new
User(Integer.parseInt(buf[1]),getUserName(Integer.parseInt(buf[1]),buf[2]),buf[2]);
users.put(Integer.parseInt(buf[1]), one); terms.put(Integer.parseInt(buf[1]), try {
tm[(count-1)]);
out.write((\+buf[1]+\+buf[2]+\+getUserName(Integer.p
arseInt(buf[1]),buf[2])+\).getBytes());
}
}
//System.out.println(\ //System.out.println(\
try { Socket st =
//Socket st =
out = st.getOutputStream();
out.write((\+str+\).getBytes()); e.printStackTrace();
}
out.flush();
e.printStackTrace(); e.printStackTrace();
} catch (NumberFormatException e) { } catch (IOException e) {
System.out.println(\成功\);
} try {
//账号或密码不正确
}else{
out.write((\+\+\).getBytes());
} catch (IOException e) { }
e.printStackTrace();
}else if(buf[0].equalsIgnoreCase(\)){
terms.get(Integer.parseInt(buf[1])).getS(); tm[Integer.parseInt(buf[1])].getS();
} catch (IOException e) { }
} } }
System.out.println(\+str);
}
Term类:
package cn.sayphone.qqserver.service;
import java.net.Socket;
public class Term {
private int count; private Socket s;
public Term(){ }
public Term(int count,Socket s){
System.out.println(\+count); this.count = count; this.s = s; //count++; }
public Socket getS() { }
}
return s;
Config类:
package cn.sayphone.qqserver.util;
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException;
/**
* 链接Oracle数据库 * @author BB
* @version 2013/06/10 */
public class Config {
private static String url=\//服务器地址:210.35.205.109,端口号:1521,数据库实例名字:wjhdb。 private static String username=\private static String pw=\private static Connection conn=null; //用户名字和密码是自己建立的。 public static Connection getConn(){
try {
Class.forName(\try { }
conn=DriverManager.getConnection(url,username,pw); e.printStackTrace(); }catch(SQLException e) {
}catch(ClassNotFoundException e) {
}
}
}
e.printStackTrace();
return conn;
public static void close(){
if(conn!=null){ try { }
}
conn.close(); e.printStackTrace(); } catch (SQLException e) {
}
User类:
package cn.sayphone.qqserver.entity; import java.io.Serializable; /**
* 用户实例 * @author BB
* @version 2013/06/10 */
public class User implements Serializable{ /**
* */
private static final long serialVersionUID = 8417196398773781616L; private int id;
private String name; private String pwd; public User(){ }
public User(int id,String name,String pwd){ this.id = id; this.name = name; this.pwd = pwd; }
public int getId() { }
public void setId(int id) { }
this.id = id; return id;
public String getName() { }
public void setName(String name) { }
public String getPwd() { }
public void setPwd(String pwd) { }
this.pwd = pwd; return pwd; this.name = name; return name;
public String toString(){
return this.id+\+this.name+\+this.pwd; } }
客服端主要代码如下: Main类:
package cn.sayphone.ui; import java.io.IOException;
import java.net.UnknownHostException; import cn.sayphone.entity.QQInfo; /** * 入口
* @author BB_Saypho_e.cn * @version 2013/06/08 */
public class Main {
public static void main(String[] args) throws UnknownHostException, IOException {
ToPFrame toPFrame = new ToPFrame(); QQInfo qQInfo = new QQInfo(); RegFrame regFrame = new RegFrame();
AllFriendFrame allFriendFrame = new AllFriendFrame(); ClientContext clientContext = new ClientContext(); LoginFrame loginFrame = new LoginFrame(); allFriendFrame.setClientContext(clientContext); allFriendFrame.setqQInfo(qQInfo); clientContext.setqQInfo(qQInfo); clientContext.setRegFrame(regFrame);
clientContext.setAllFriendFrame(allFriendFrame); loginFrame.setClientContext(clientContext);
clientContext.setLoginFrame(loginFrame); toPFrame.setClientContext(clientContext); clientContext.setToPFrame(toPFrame); loginFrame.setVisible(true); //toPFrame.setVisible(true);
}
}
ClientContext类:
package cn.sayphone.ui; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket;
import java.net.UnknownHostException; import java.util.Scanner; import java.util.Set;
import javax.swing.JComponent; import javax.swing.JOptionPane; import cn.sayphone.entity.QQInfo; import cn.sayphone.entity.User; import cn.sayphone.service.QQService; /** *
* @author BB_/say_phone.Cn * @version 2013/06/07 */
public class ClientContext { private ToPFrame toPFrame; private Socket s; private InputStream in; private OutputStream out; private CWriter cWriter; //private User user; public ClientContext(){ }
public void setToPFrame(ToPFrame toPFrame) IOException { this.toPFrame = toPFrame;
this.s = new Socket(\ this.in = s.getInputStream(); this.out = s.getOutputStream();
cWriter = new CWriter(in,s);
throws UnknownHostException,
}
cWriter.start();
//this.user = new User();
public void send(String to) throws IOException { }
private String key;
private class CWriter extends Thread{ }
private AllFriendFrame allFriendFrame;
public void setAllFriendFrame(AllFriendFrame allFriendFrame) { }
//解决接收的数据
private void solveStr(String str){
this.allFriendFrame = allFriendFrame; private InputStream in; private Socket s; public CWriter(){ }
public CWriter(InputStream in,Socket s){ }
public void run(){
Scanner sc = new Scanner(in); while(true){
//System.out.println(\this.in = in; this.s = s;
String send = toPFrame.getSend(); out.write
System.out.println(\
System.out.println(\//cWriter.start();
//toPFrame.updateView(send);
((\
String str = sc.next(); solveStr(str); }
}
String[] buf = str.split(\ //reLogin:id:pwd:name
if(buf[0].equalsIgnoreCase(\ //账号已经登录
if(buf[1].equalsIgnoreCase(\
JOptionPane.showConfirmDialog(loginFrame, \账号已经登录\
//账号已经登录
}else if(buf[1].equalsIgnoreCase(\ }
}else if(buf[0].equalsIgnoreCase(\ //if(userCount != buf.length-1){ //System.out.println(buf.length);
//System.out.println(\ loadAllFrie(buf.length-1,str);
allFriendFrame.updateAllFrie(buf.length-1,qQInfo); userCount = buf.length-1; //}
}else if(buf[0].equalsIgnoreCase(\ toPFrame.updateView(str); }
//allFriendFrame.updateAllFrie(buf.length-1,qQInfo);
}
private int userCount;
private void loadAllFrie(int num,String str){ }
String[] buf = str.split(\//reAll:100-name-pwd: for(int i=0;i String[] sts = buf[i+1].split(\int id = Integer.parseInt(sts[0]); String name =sts[1]; String pwd = sts[2]; qQInfo.setUserK(i, id, name, pwd); JOptionPane.showConfirmDialog(loginFrame, \账号或密码不正确\qQInfo.setUser(Integer.parseInt(buf[1]),buf[3],buf[2]); loginFrame.setVisible(false); allFriendFrame.setVisible(true); }else{ private QQInfo qQInfo; public void setqQInfo(QQInfo qQInfo) { } private LoginFrame loginFrame; public void setLoginFrame(LoginFrame loginFrame){ } private QQService qQService; this.loginFrame = loginFrame; this.qQInfo = qQInfo; } public void setqQService(QQService qQService) { } public void login() { } public void clickOneFrie(String to) { } private RegFrame regFrame; public void setRegFrame(RegFrame regFrame) { } public void loginToReg() { } public void reg() { } // TODO Auto-generated method stub String name = regFrame.getUserName(); String pwd = regFrame.getUserPwd(); // TODO Auto-generated method stub loginFrame.setVisible(false); regFrame.setVisible(true); this.regFrame = regFrame; // TODO Auto-generated method stub toPFrame.setToP(to); toPFrame.setVisible(true); // TODO Auto-generated method stub int id = loginFrame.getUserId(); String pwd = loginFrame.getUserPwd(); try { } out.write((\e.printStackTrace(); e.printStackTrace(); //loginFrame.sh } catch (IOException e) { }catch(Exception e){ this.qQService = qQService; LoginFrame类: package cn.sayphone.ui; import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.Label; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JTextField; import javax.swing.border.EmptyBorder; /** * Login(登录) * @author BB_saYphone.C n * @time 2013/06/09 */ public class LoginFrame extends JFrame{ private static final long serialVersionUID = -2287040090089581631L; public LoginFrame(){ } private void init(){ } private JPanel createContentPane(){ } private ClientContext clientContext; public void setClientContext(ClientContext clientContext){ } private JPanel createSPane(){ JPanel p = new JPanel(new FlowLayout()); this.clientContext = clientContext; JPanel p = new JPanel(new BorderLayout(6,0)); p.setBorder(new EmptyBorder(12,12,12,12)); p.add(BorderLayout.NORTH,new Label(\登录QQ\,Label.CENTER)); p.add(BorderLayout.CENTER,createCPane()); p.add(BorderLayout.SOUTH,createSPane()); return p; this.setTitle(\登录\); this.setContentPane(createContentPane()); this.setSize(299,188); this.setLocationRelativeTo(null);//Center init(); } JButton login = new JButton(\登录\); JButton reg = new JButton(\注册\); p.add(login); p.add(reg); reg.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { } clientContext.loginToReg(); }); login.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { } clientContext.login(); }); return p; private JPanel createCPane(){ } private JPanel createPwdPane(){ } private JPanel createIdPane(){ } private JPasswordField pwdField; public int getUserId(){ return Integer.parseInt(this.idField.getText()); JPanel p = new JPanel(new BorderLayout(12,0)); JTextField idField = new JTextField(); p.add(BorderLayout.WEST,new JLabel(\账号:\)); p.add(BorderLayout.CENTER,idField); this.idField = idField; return p; JPanel p = new JPanel(new BorderLayout(12,0)); JPasswordField pwdField = new JPasswordField(); p.add(BorderLayout.WEST,new JLabel(\密码:\)); p.add(BorderLayout.CENTER,pwdField); this.pwdField = pwdField; return p; JPanel p = new JPanel(new GridLayout(2,1,0,12)); p.add(createIdPane()); return p; p.add(createPwdPane()); } } public String getUserPwd(){ } private JTextField idField; } new LoginFrame().setVisible(true); char[] ch = this.pwdField.getPassword(); return new String(ch); public static void main(String[] args) {
正在阅读:
公路大件运输系列讲座 牵引车的选型与设计07-22
核电站全范围模拟机虚拟DCS分包管理初探07-21
新闻价值与新闻道德谁更重要05-28
西北全长约11公里隧道改造可行性研究报告-广州中撰咨询03-12
六年级下册语文试题模板05-01
郑州市医保定点医院名单10-09
有效课堂教学论文(徐玉富)05-29
发展心理学三级真题11-27
CADCAM课程设计 - 图文03-14
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 报告书
- 课程
- 项目
- 设计
- Linux
- JAVA
- 华南理工知识管理复习作业题
- 二 多项选择题(天车工)
- 农贸市场新建工程实施建设方案
- AATCC 8耐摩擦色牢度 摩擦测试仪法
- 初中物理力学试题及答案(计算题)
- 理解卓越绩效模式几点体会
- 通信信息业务员中级试卷正文7d41
- 农田土地平整施工组织设计
- 2009~2012年湖南大学会计硕士研究生复试真题
- 2016春劳动与社会保障法100分作业
- 敦煌网考试试题及答案-成交不卖处罚申诉
- 平板分离法以及高压蒸汽灭菌法实验
- 2015高三文数第一轮复习导学案:直线、平面垂直的判定和性质
- CAD - 所有问题解决办法及快捷键
- 关于妈妈的作文:老妈减肥记
- 大学计算机基础复习题1
- 2013-2014学年度第一学期期中考试徐州联校试题 word版
- 有凸缘筒形件拉深设计说明书
- 食品药品安全监管工作汇报
- MATLAB基础及应用应用