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 users = new HashMap();

QQServerSocket server = new QQServerSocket(); server.start();

static HashMap terms = new HashMap(); static int count = 1; static Term[] tm;

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 col = users.values(); Iterator it = col.iterator(); while(it.hasNext()){ }

Collection colt = terms.values(); Iterator itt = colt.iterator(); while(itt.hasNext()){ Term trm = itt.next(); Socket st = trm.getS(); try {

} 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) {

本文来源:https://www.bwwdw.com/article/xpwr.html

Top