网络课程设计实验报告--QQ聊天实现

合集下载

《网络交流——QQ即时通讯》教学设计

《网络交流——QQ即时通讯》教学设计

《网络交流——QQ即时通讯》教学设计一、教学目标:1.了解QQ即时通讯软件的基本功能和使用方法;2.学会创建QQ账号、添加好友、发送消息等基本操作;3.能够运用QQ即时通讯软件进行网络交流。

二、教学重点:1.学生能够熟练操作QQ即时通讯软件;2.学生能够理解并运用QQ进行网络交流。

三、教学准备:1.教师准备一台电脑、投影仪和音响设备;2.学生准备一台电脑或手机,并提前安装好QQ即时通讯软件。

四、教学过程:1.导入(5分钟)教师通过投影仪展示QQ即时通讯软件的界面,引发学生对QQ的认识和使用期望,介绍QQ的功能和作用。

2.讲解(10分钟)教师详细讲解QQ的基本功能:创建账号、登录、添加好友、发送消息等。

并结合PPT 图示,讲解各个功能的操作步骤和注意事项。

3.操作演示(15分钟)教师通过电脑进行QQ的操作演示,示范登录账号、添加好友、发送消息等操作,并向学生解答遇到的问题。

4.学生练习(20分钟)学生按照教师的示范,自行操作QQ软件。

教师在一旁现场辅导,提供实时帮助。

5.整理学习成果(10分钟)请学生总结他们在操作过程中遇到的困难和解决办法。

学生可以以小组讨论的形式,将问题和解决办法填入表格中,并请各组派代表汇报。

6.网络交流实践(30分钟)学生利用QQ软件进行小组间的网络交流实践。

每个小组选择一个话题,进行文字或语音交流,并向全班汇报交流结果。

7.课堂总结(5分钟)教师对本节课的教学进行总结,强调学生的学习成果和进步,并鼓励学生在日常生活中积极运用QQ进行网络交流。

五、教学评价:教师利用学生的表现和交流结果,进行评价,主要评价学生在操作QQ软件时的熟练程度和网络交流的有效性。

六、板书设计:QQ即时通讯1.创建账号2.登录3.添加好友4.发送消息七、教学延伸:1.鼓励学生积极参与QQ群组,拓宽交流圈子,了解更多的信息;2.指导学生合理安排网络交流时间,避免过多投入网络而忽视线下交流;3.引导学生积极参与线上讨论和活动,提高网络交流的质量和效果。

仿QQ聊天系统实验报告

仿QQ聊天系统实验报告

软件工程项目实践大作业仿QQ软件的设计与实现软件工程项目实践大作业仿QQ软件的设计与实现班级:20090615学号:2009061503姓名:教师:于金峰平时成绩30分:+大作业成绩:70分:=总分:__ 成绩: _2012年6月一、项目可行研究新近一两年Android手机如雨后春笋般涨势迅猛,由此基于Android系统的应用开发也变得更加普遍,结合本次课程的学习,也为了更好的培养我们的自主开发能力,我们小组开发了这个模仿QQ的聊天系统。

二、需求阶段1.系统功能需求(1)登录功能。

(2)客户可以通过服务器转发,实现一对一和多对多聊天。

(3)实现呼叫功能。

(4)客户端程序应该可以实时显示目前其它用户的状态。

(5)应该具有易用、美观的图形界面。

2. 系统性能需求实用性:为信息交流提供方便,有效进行作业管理。

操作简单:本系统应该适用于不同水平的使用者,包括事业单位和企业单位,同时系统不应太复杂和烦琐,因此要求系统的操作尽可能简单易行。

技术先进:产品的系统设计和开发应紧跟着整个计算机发展潮流,采用当时最先进的设计思想,利用最新的开发技术和开发工具。

使系统能够无论在功能设计上,还是在技术实现上,都处于同行业的领先地位。

安装使用简便:服务器端的安装简洁明了,客户机无需再装任何软件就可以直接注册登陆聊天。

适应性:应该能广泛应用于不同类型的企事业单位。

系统采用模块化设计,用户可以根据自己的实际情况自行组合,使系统在不同的硬件环境下都能得以应用。

代码可读性好:文中的代码将尽可能简洁,易懂。

3. 系统运行需求1、移动客户端需500MHz及以上的处理器2、移动客户端需256MB及以上的ROM空间3、移动客户端需256MB及以上的RAM空间4、移动客户端需具有WiFi/GRPS网络接收模块,能正常连接到网络5、服务端需具有P4 1.6GHz及以上的处理器6、服务端需具有80GB及以上的硬板空间7、服务端需具有1GB及以上的内存空间三、设计过程1. 业务流程图业务流程图2. 功能结构图3. 数据流图(4. ER 图用户聊天记录登陆信息用户名密码验证信息登陆MN用户名密码登陆信息输入NM聊天时间聊天对象聊天内容图6 ER 图5. 后台数据库设计基于服务器跨平台运行的架构,服务器的后台数据库使用了SQL Server2005。

java课程设计报告qq聊天

java课程设计报告qq聊天

河南工业大学课程设计课程设计名称:java qq聊天系统专业班级:学生姓名: xiaoyang学号:指导教师:王高平课程设计时间: 2016.7.7计科专业课程设计任务书说明:本表由指导教师填写,由教研室主任审核后下达给选题学生,装订在设计(论文)首页1 需求分析运用java语言实现一个qq聊天局域网系统,主要功能实现信息的相互交流,整个程序分三个大模块,第一个模块是服务器端的设计,第二个模块是客户端的实现,第三个模块是数据库连接的实现。

主要实现一个客户端发送串字符信息,另一端客户端能接受(在一个局域网下),同时建立了一个数据库(mysql),用于注册用户,同时存储用户的信息,以及找回密码要用到的密保问题答案。

2 概要设计主要类:JqqF类:主要是登录窗口Cell类:按钮类Findpassword.java:找回密码类Look:注册窗口Lookpassword.java:查看密码窗口Register.java:注册账号类JavaMysql.java:数据库类,连接数据库。

3 运行环境(软、硬件环境)Windows,64位pc机,jvm(java虚拟机)4 开发工具和编程语言Eclipse,java5 详细设计Server.java(实现一个小型的服务器)package ;import java.io.*;import .*;import java.util.*;public class Sever {boolean started = false;ServerSocket ss = null;List<Client> clients = new ArrayList<Client>();public static void main(String[] args) {new Sever().start();}public void start() {try {ss = new ServerSocket(9999);started = true;} catch (BindException e) {System.out.println("端口使用中....");System.out.println("请关掉相关程序并重新运行服务器!");System.exit(0);} catch (IOException e) {e.printStackTrace();}try {while (started) {Socket s = ss.accept();Client c = new Client(s);System.out.println("a client connected!");new Thread(c).start();clients.add(c);// dis.close();}} catch (IOException e) {e.printStackTrace();} finally {try {ss.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}class Client implements Runnable {private Socket s;private DataInputStream dis = null;private DataOutputStream dos = null;private boolean bConnected = false;public Client(Socket s) {this.s = s;try {dis = new DataInputStream(s.getInputStream());dos = new DataOutputStream(s.getOutputStream());bConnected = true;} catch (IOException e) {e.printStackTrace();}}public void send(String str) {try {dos.writeUTF(str);} catch (IOException e) {clients.remove(this);System.out.println("对方退出了!我从List里面去掉了!");// e.printStackTrace();}}public void run() {//线程体try {while (bConnected) {String str = dis.readUTF();System.out.println(str);for (int i = 0; i < clients.size(); i++) {Client c = clients.get(i);c.send(str);}}} catch (EOFException e) {System.out.println("Client closed!");} catch (IOException e) {e.printStackTrace();} finally {try {if (dis != null)dis.close();if (dos != null)dos.close();if (s != null) {s.close();// s = null;}} catch (IOException e1) {e1.printStackTrace();}}}}}JqqF类:登录的窗口类package ;import java.awt.Color;import java.awt.Font;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import javax.swing.ImageIcon;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JPasswordField;import javax.swing.JTextField;public class JqqF extends JFrame implements MouseListener { private static final long serialVersionUID = 1L;public static void main(String args[]) {JqqF f = new JqqF();}public static JTextField name = new JTextField(20);JLabel nameLab = new JLabel("输入qq号:");public static JPasswordField nam = new JPasswordField(20);JLabel nameLa = new JLabel("输入qq密码:");String path5 = "pic//x.png";// 背景图片ImageIcon background5 = new ImageIcon(path5);cell but = new cell(background5);Font fnt = new Font("Serief", Font.BOLD, 15);String path4 = "pic//l.png";ImageIcon background4 = new ImageIcon(path4);cell bt = new cell(background4);String path3 = "pic//b.png";ImageIcon background3 = new ImageIcon(path3);cell bt2 = new cell(background3);String path2 = "pic//qq3.png";ImageIcon background2 = new ImageIcon(path2);JLabel label2 = new JLabel(background2);public JqqF() {super("qq测试");this.setSize(500, 334);this.setLocation(300, 200);this.setVisible(true);String path = "pic//qq.png";// 背景图片ImageIcon background = new ImageIcon(path);// 把背景图片显示在一个标签里面JLabel label = new JLabel(background);label.setLayout(null);// 把标签的大小位置设置为图片刚好填充整个面板label.setBounds(0, 0, this.getWidth(), this.getHeight()); // 把内容窗格转化为JPanel,否则不能用方法setOpaque()来使内容窗格透明JPanel imagePanel = (JPanel) this.getContentPane(); imagePanel.setOpaque(false);// 把背景图片添加到分层窗格的最底层作为背景nameLab.setFont(fnt);nameLab.setForeground(Color.yellow);nameLa.setFont(fnt);nameLa.setForeground(Color.yellow);nameLab.setBounds(160, 120, 100, 30);bt.setBounds(360, 120, 72, 30);bt.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {register x = new register();}});name.setBounds(250, 120, 100, 30);nameLa.setBounds(160, 160, 100, 30);nam.setBounds(250, 160, 100, 30);bt2.setBounds(360, 160, 72, 30);bt2.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {new findpassword();}});// // nam.setColumns(20) ;label2.setBounds(65, 120, 88, 83);but.setBounds(185, 210, 147, 30);but.addMouseListener(this);label.add(nameLab);label.add(bt);label.add(bt2);label.add(nam);label.add(nameLa);label.add(label2);label.add(name);label.add(but);this.getLayeredPane().add(label, newInteger(Integer.MIN_VALUE));this.setResizable(false);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 让组件可见}public void mouseClicked(MouseEvent e) {char[] a = nam.getPassword();String s = new String(a);// System.out.print(s);String b = "1";Statement st = null;ResultSet rs = null;boolean t = false;boolean x = false;Connection con = null;String sql = "SELECT name,mibao,password FROM qq";try {con = new JavaMysql().connnecton();st = con.createStatement();rs = st.executeQuery(sql);} catch (ClassNotFoundException e2) {// TODO Auto-generated catch blocke2.printStackTrace();} catch (SQLException e2) {// TODO Auto-generated catch blocke2.printStackTrace();}try {while (rs.next()) {String qq = rs.getString("name");//匹配用户名String password1 = rs.getString("password");//匹配密码if (qq.equals(name.getText())) {t = true;if (password1.equals(nam.getText())) {x = true;}}}con.close();st.close();rs.close();} catch (SQLException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}if (t) {if (x) {JqqF2 f1 = new JqqF2();//好友列表在这里显示this.setVisible(false);//登录窗口消失f1.setVisible(true);//好友列表出现} else {new passworderror();}} else {new look();}}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub}@Overridepublic void mouseExited(MouseEvent e) { // TODO Auto-generated method stub}};Passerror类:密码错误提示窗口package ;import javax.swing.JFrame;import javax.swing.JLabel;public class passworderror extends JFrame{JLabel b = new JLabel("密码错误");public passworderror(){this.add(b);this.setSize(100,100);this.setLocation(300, 500);this.setVisible(true);this.setResizable(false);}Findpassword类:找回密码类package ;import java.awt.Color;import java.awt.Font;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JTextField;public class findpassword extends JFrame {JLabel nameLab2 = new JLabel("密保问题:你的学号是多少");JTextField name3 = new JTextField(20);Font fnt = new Font("Serief", Font.BOLD, 15);cell but = new cell("确定");public findpassword() {this.setSize(500, 334);this.setLocation(300, 200);this.setVisible(true);this.setLayout(null);nameLab2.setFont(fnt);nameLab2.setForeground(Color.green);nameLab2.setBounds(140, 150, 200, 30);name3.setBounds(140, 180, 100, 30);this.add(name3);this.add(nameLab2);but.setBounds(160, 240, 147, 30);but.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {Statement st = null;ResultSet rs = null;boolean t = false;Connection con = null;String sql = "SELECT name,mibao,password FROM qq";//查找语句try {con = new JavaMysql().connnecton();st = con.createStatement();rs = st.executeQuery(sql);} catch (ClassNotFoundException e2) {// TODO Auto-generated catch blocke2.printStackTrace();} catch (SQLException e2) {// TODO Auto-generated catch blocke2.printStackTrace();}try {while (rs.next()) {String qqmibao = rs.getString("mibao");String name1 = rs.getString("name");String password1 = rs.getString("password");if (name3.getText().equals(qqmibao)&& name1.equals(.getText())) {//比较是否相等new lookpassword(password1);//如果和密保答案相等就输出t = true;break;}}if (t == false) {new look2password();}} catch (SQLException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}try {con.close();st.close();rs.close();} catch (SQLException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}});this.add(but);}}}Register类:注册新用户package ;import java.awt.Color;import java.awt.Font;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.SQLException;import java.sql.Statement;import javax.swing.ImageIcon;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JPasswordField;import javax.swing.JTextField;public class register extends JFrame implements MouseListener {JTextField name1 = new JTextField(20);JLabel nameLab = new JLabel("输入新qq号:");JPasswordField nam = new JPasswordField(20);JLabel nameLa = new JLabel("输入qq密码:");JLabel nameLab2 = new JLabel("密保问题:你的学号是多少");JTextField name3 = new JTextField(20);Font fnt = new Font("Serief", Font.BOLD, 15);// 背景图片cell but = new cell("确定");public register() {super("注册");this.setSize(500, 334);this.setLocation(300, 200);this.setVisible(true);String path = "pic//qq.png";// 背景图片ImageIcon background = new ImageIcon(path);// 把背景图片显示在一个标签里面JLabel label = new JLabel(background);label.setLayout(null);// 把标签的大小位置设置为图片刚好填充整个面板label.setBounds(0, 0, this.getWidth(), this.getHeight());// 把内容窗格转化为JPanel,否则不能用方法setOpaque()来使内容窗格透明JPanel imagePanel = (JPanel) this.getContentPane();imagePanel.setOpaque(false);nameLab.setFont(fnt);nameLab2.setFont(fnt);nameLab.setForeground(Color.yellow);nameLab2.setForeground(Color.green);nameLa.setFont(fnt);nameLa.setForeground(Color.yellow);nameLab.setBounds(140, 80, 100, 30);but.setBounds(160, 240, 147, 30);name1.setBounds(230, 80, 100, 30);nameLa.setBounds(140, 120, 100, 30);nam.setBounds(230, 120, 100, 30);nameLab2.setBounds(140, 150, 200, 30);name3.setBounds(140, 180, 100, 30);label.add(nameLab);label.add(but);label.add(nam);label.add(nameLa);label.add(nameLab2);label.add(name1);label.add(name3);but.addMouseListener(this);this.getLayeredPane().add(label, new Integer(Integer.MIN_VALUE));this.setResizable(false);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}public static void main(String args[]) {register f = new register();}@Overridepublic void mouseClicked(MouseEvent e) {String name = name1.getText();String mibao = name3.getText();String password = new String(nam.getPassword());PreparedStatement st = null;Connection con = null;String sql = "INSERT INTO qq(name,mibao,password) VALUES(?,?,?)";//预处理指令try {con = new JavaMysql().connnecton();st = con.prepareStatement(sql);} catch (ClassNotFoundException e2) {// TODO Auto-generated catch blocke2.printStackTrace();} catch (SQLException e2) {// TODO Auto-generated catch blocke2.printStackTrace();}try {st.setString(1, name);//向数据库输入账号st.setString(2, mibao);//密保答案st.setString(3, password);//向数据库输入密码st.executeUpdate();st.close();con.close();} catch (SQLException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}.setText("");JqqF.nam.setText("");this.setVisible(false);}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}}JqqF2类:好友列表package ;import java.awt.event.WindowAdapter ;import java.awt.event.MouseListener ;import java.awt.event.WindowEvent ;import java.awt.event.MouseEvent ;import java.awt.Color ;import javax.swing.JFrame ;import java.awt.event.ActionListener ;import java.awt.event.WindowEvent ;import java.awt.event.ActionEvent ;import java.awt.Color ;import java.awt.Container;import java.awt.GridLayout ;import java.awt.Font ;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import .Socket;import .UnknownHostException;import javax.swing.ImageIcon;import javax.swing.JFrame ;import javax.swing.JButton ;import javax.swing.JLabel ;import javax.swing.JSplitPane;import javax.swing.JTextArea ;import javax.swing.JPasswordField ;import javax.swing.JScrollPane ;import javax.swing.JPanel ;public class JqqF2 extends JFrame implements MouseListener { String path4 = "pic//m.png";// 背景图片ImageIcon background4 = new ImageIcon(path4);cell bt = new cell(background4);public JqqF2(){// 准备好了一个面板super.setLayout(null) ;super.setTitle("qq好友列表") ;this.setSize(500, 334);this.setLocation(300, 200);this.setVisible(true);String path = "pic//qq2.png";// 背景图片ImageIcon background = new ImageIcon(path);// 把背景图片显示在一个标签里面JLabel label = new JLabel(background);label.setLayout(null);// 把标签的大小位置设置为图片刚好填充整个面板label.setBounds(0,0,300, 140);// 把内容窗格转化为JPanel,否则不能用方法setOpaque()来使内容窗格透明 JPanel imagePanel = (JPanel) this.getContentPane();imagePanel.setOpaque(false);// 把背景图片添加到分层窗格的最底层作为背景String path2 = "pic//qq3.png";ImageIcon background2 = new ImageIcon(path2);// 把背景图片显示在一个标签里面JLabel label2 = new JLabel(background2);label2.setLayout(null);label2.setBounds(5, 10, 88, 83);String path3 = "pic//f.png";ImageIcon background3 = new ImageIcon(path3);// 把背景图片显示在一个标签里面JLabel label3 = new JLabel(background3);label3.setLayout(null);label3.setBounds(0, 140, 324, 22);JLabel name = new JLabel("冰河世纪(1174850659)");name.setForeground(Color.orange);name.setLayout(null);name.setBounds(97, 10, 180, 15);label.add(name);JLabel name2 = new JLabel("个性签名:坚持就是胜利");name2.setForeground(Color.GREEN);name2.setLayout(null);name2.setBounds(97, 60, 300, 15);label.add(name2);label.add(label2);this.add(label3);bt.addMouseListener(this);super.add(bt);bt.setBounds(0,162,325,60) ;this.setSize(300,550) ;this.setLocation(300,200) ;this.getLayeredPane().add(label, new Integer(Integer.MIN_VALUE));setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setResizable(false);}@Overridepublic void mouseClicked(MouseEvent e) {JqqF3 f1 =null;//提升作用域try {f1 = new JqqF3("吻柔哥(996059929)");//初始化聊天窗口} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}this.setVisible(true);f1.setVisible(true);}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}};JqqF3类:聊天窗口package ;import java.awt.Color;import java.awt.Font;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import .Socket;import .UnknownHostException;import javax.swing.ImageIcon;import javax.swing.JFrame;import javax.swing.JScrollPane;import javax.swing.JTextArea;public class JqqF3 extends JFrame implements MouseListener { String path4 = "pic//qq6.png";ImageIcon background4 = new ImageIcon(path4);cell cell2 = new cell(background4);static JTextArea j1 = new JTextArea(3, 20);static JTextArea j2 = new JTextArea(3, 20);Socket client = null;public JqqF3(String s) throws IOException {super(s);j1.setLineWrap(true);j2.setLineWrap(true);this.setLayout(null);j1.setBackground(Color.gray);j2.setBackground(Color.WHITE);JScrollPane scr1 = new JScrollPane(j1,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,//加入滚动条JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);JScrollPane scr2 = new JScrollPane(j2,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);scr1.setBounds(0, 0, 600, 600);scr2.setBounds(0, 600, 500, 60);cell2.setBounds(500, 600, 100, 60);cell2.addMouseListener(this);Font font = new Font("宋体", Font.BOLD, 15); // 创建一个字体以便其它调用j1.setFont(font);j1.setForeground(Color.blue);this.add(scr1);this.add(scr2);this.add(cell2);this.setSize(606, 694);this.setLocation(300, 200);this.setVisible(true);this.setResizable(false);client = new Socket("localhost", 9999);//初始化窗口时,客户端连接上new Thread(new Receive(client)).start();//开始一个新的进程用于接收}@Overridepublic void mouseClicked(MouseEvent e) {try {new Thread(new Send(client)).start();//开始一个线程用于发送信息} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}}Send类:用于向服务器发送信息package ;import java.awt.Font;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.BufferedReader;import java.io.DataOutputStream;import java.io.;import java.io.;import java.io.IOException;import java.io.InputStreamReader;import .Socket;import java.text.DateFormat;import java.util.Date;public class Send implements Runnable {private BufferedReader console;//输入流private DataOutputStream dos;//输出流private boolean isRuning = true;public Send(Socket client) throws IOException {dos = new DataOutputStream(client.getOutputStream());//获得输出流}public void send() {DateFormat df = null;df = DateFormat.getDateTimeInstance();String s1 = df.format(new Date());//获得日期String s2 = JqqF3.j2.getText();String s3 = "冰河世纪(1174850659) " + s1;String s = s3 + ":" + "\n" + " " + s2;try {if (null != s && !s.equals("")) {dos.writeUTF(s);dos.flush();JqqF3.j2.setText("");//每发送完一个信息编辑框清空}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void run() {//线程体{send();}}}Receive类:用于接收信息package ;import java.io.DataInputStream;import java.io.IOException;import .Socket;public class Receive implements Runnable {private DataInputStream dis;private boolean isRunning = true;public Receive(Socket client) {try {dis = new DataInputStream(client.getInputStream());//获得输入流} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();isRunning = false;}}public String receive() {String s = "";try {s = dis.readUTF();//读出字符串} catch (IOException e) {e.printStackTrace();isRunning = false;}return s;}@Overridepublic void run() {while (true) {JqqF3.j1.append(receive());//写到编辑框上JqqF3.j1.append("\n");}}}Cell:按钮类package ;import java.awt.Font;import javax.swing.ImageIcon;import javax.swing.JButton;public class cell extends JButton {private static final long serialVersionUID = 1L;public cell(ImageIcon img) {super(img);//传入一个图片类//Font fnt = new Font("Serief", Font.BOLD, 20);//设置字体此处没用//this.setFont(fnt);} // 加入事件public cell(String s) {super(s);//传入字符串参数Font fnt = new Font("Serief", Font.BOLD, 20);this.setFont(fnt);}}Look类:出现注册提示框package ;import javax.swing.JFrame;import javax.swing.JLabel;public class look extends JFrame {JLabel b = new JLabel("请注册");public look() {this.add(b);this.setSize(100, 100);this.setLocation(300, 500);this.setVisible(true);// this.setResizable(false);}}Look2password类:出现密码提示框package ;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import javax.swing.JFrame;import javax.swing.JLabel;public class look2password extends JFrame {public look2password() {String s = "回答错误";JLabel b = new JLabel(s);this.add(b);this.setSize(100, 100);this.setLocation(300, 500);this.setVisible(true);// this.setResizable(false);}}JavaMysql类:用于数据库的链接package ;import java.sql.*;public class JavaMysql{private Connection connecter = null;public JavaMysql() throws ClassNotFoundException, SQLException{ String driver="com.mysql.jdbc.Driver";String url="jdbc:mysql://localhost:3306/QQ";Class.forName(driver);connecter=DriverManager.getConnection(url,"root","1234");}public Connection connnecton (){return connecter;//获得连接}}6 调试分析做到Send类时遇到了瓶颈,主要原因有以下几点,1、主要是进程间的通信不是特别熟悉,总是抛出异常,每次用完输出输入流要记得关闭2、输入输出流的选择也不是很清楚,有可能会产生乱码,其次。

QQ聊天程序设计报告

QQ聊天程序设计报告

QQffl夭程序设计报告湖北科技学院计算机科学与技术学院课程设计报告课程名称:面向对象程序课程设计姓名:吕治政学号:4031019专业:计算机专业班级:11计应班院系:计算机科学与技术设计时间: 5 月~6月设计地点:实验室课程设计目的〈〈面向对象程序设计》是一门实践性很强的计算机专业基础课程,课程设计是学习完该课程后进行的一次较全面的综合练习。

其目的在于经过实践加深学生对面向对象程序设计的理论、方法和基础知识的理解,掌握使用Java语言进行面向对象设计的基本方法,提高运用面向对象知识分析实际问题、解决实际问题的能力。

课程设计任务与要求:主题:局域网聊天程序的设计与实现该程序实现局域网内的聊天功能,包括服务器端程序和客户端程序两部分。

客户端程序:可连接到服务器,并将消息发送到服务器端和接受服务器端发送来的信息。

课程设计选用Eclipse作为开发平台以提高开发效率,尽可能熟练掌握其中一种集成开发环境。

建议采用UML建模技术进行系统的分析设计,在报告中画出系统用例图和类图,并将UML图复制到设计报告中。

经过这次设计,要求掌握以下内容:面向对象技术中的继承与多态(重载和覆盖)机制、各种修饰符的使用类、包、接口的定义与使用常见工具类与算法的实现Java常见标准GUI组件及其事件处理Java的异常处理机制3.课程设计思路:我的思路是实现客户端与服务器端进行一对一的通信,这是一种最简单的聊天工具,也是对于一个初学者说是最容易理解的。

但我们实际生活中的聊天模型不是这样的,例如:腾讯QQ聊天工具是把服务器作为一个中转站,一个客户端向服务器端发出请求申请连接,另一个客户端也向服务器端请求连接,一个客户端先把信息发送到服务器,然后服务器把信息转发给另一个客户端,如果把它做成和腾讯QQ差不多,那还是有一定难度的,那就必须要掌握多线程,其实多线程是一个难点。

我的思路如下:实现客户端与服务器端的一对一通信,也就是客户端说一句发送给发送给服务器,服务器接收信息,然后服务器说一句发送给客户端,客户端接收,就这样你一句我一句。

模拟QQ聊天程序设计报告

模拟QQ聊天程序设计报告

模拟QQ聊天程序设计报告----网络软件创新实验报告一. 需求分析1.1 开发背景在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,类似QQ、网络聊天时一类的聊天系统的发展日新月异,因此产生了制作一个类似QQ的网络聊天工具的;而且通过制作该程序还能更好的学习网络软件编程知识。

1.2 功能要求(1)登录功能。

(2)客户可以通过服务器转发,实现一对一和多对多聊天。

(3)实现呼叫功能。

(4)客户端程序应该可以实时显示目前其它用户的状态。

(5)应该具有易用、美观的图形界面。

1.3 运行环境本系统基于WIN NT 和ACCESS XP设计,适用于WIN2000/WIN XP等系统,并需要安装office2000/office xp.1.4 功能实现1.登录验证功能。

2. 客户通过服务器转发,实现聊天功能。

3. 实时显示目前其它用户的状态。

4. 保存并能察看聊天纪录。

5.申请新的用户号码。

6. 易用、美观的图形界面,实现系统托盘。

二.技术路线2.1 总体方案为实现网络聊天的功能,采用Windows Socket编程,服务器与客户端采用了TCP/IP 连接方式,在设计聊天方案时,实行将所有信息发往服务器端,再由服务器进行分别处理的思路,服务器端是所有信息的中心。

由于服务器端要保存用户信息,我们利用数据库来实现这一功能,因此首先需要建立用户信息数据库。

在客户端保存聊天纪录和用户号码这一功能的实现中,采用了文件系统设计。

在信息到来及好友上线时,通过闪动托盘图标和播放不同的音乐进行提示。

建立消息链表来保存用户接收的各种消息。

服务器及客户端的功能可划分为以下模块:客户端:1)登陆功能:建立与服务器的连接并登陆,能显示登陆错误信息。

2)界面显示:将在线好友显示在好友列表中,并实现系统托盘,加入工具栏便于操作。

3)聊天功能:与好友聊天。

4)聊天纪录:能保存聊天纪录,并能察看聊天纪录。

聊天系统程序设计实践报告

聊天系统程序设计实践报告

程序设计实践设计报告课题名称:网络聊天程序的设计和实现学生姓名:班级:班内序号:学号:日期:1.课题概述1.1课题目标和主要内容课题实现的主要内容:本程序实现一个简单的网络聊天程序,采用客户机/服务器(Client/Server)模式,将客户端和服务端功能在一个程序中实现,运行时在不同的计算机上打开此程序即可进行聊天。

程序实现一对多,多对多聊天功能,满足聊天的基本功能。

课题目标:学会使用MFC搭建基本的对话框及基本控件的使用,了解socket套接字相关知识,实现简单聊天程序。

通过实践复习巩固课堂所学的理论知识,提高对所学知识的综合应用能力。

使用的开发平台:Microsoft Visual Studio 2010、windows7采用的主要工具:计算机、相关图书资料1.2系统的主要功能功能列表或功能框图,以及功能的简要说明。

服务器端负责指定ip地址及端口号,建立服务器,有监听、接受、发送消息等功能。

客户端通过指定的ip及端口号来连接服务器,有接受和发送消息等功能。

2. 系统设计2.1 系统总体框架包括系统框架图或层次逻辑图,设计思想等首先由服务器在指定的端口开通指定的服务,然后在客户机通过指定服务器地址、端口来连接服务器以获得指定的服务。

服务器端首先由一个服务器启动一个线程监听来自客户器的Socket连接,当服务器的Socket与客户器的Socket经过TCP协议的3次握手建立了连接后,双方就可以通过这个连接来进行信息的发送和接收,并可以进行文件的传输。

在进行程序设计时,对于多个用户连接服务器采用了多线程处理,每个客户端的Socket都启动一个线程来连接服务端的Socket,服务端的Socket接受连接后,通过一个结构体保存已经连接的客户端的地址和套接字,当客户端发送一个信息到服务端,服务器接收信息后,再从结构体中取出已保存的套接字转发所收到的信息。

客户端由客户端的Socket提出连接请求,要连接的目标是服务器端的Socket。

计算机网络课程设计实验报告--QQ网络聊天室实现

计算机网络课程设计实验报告--QQ网络聊天室实现

计算机网络课程设计报告设计选题网络聊天室姓名马继鸣学号 **********完成时间 2012-1-12 一、需求分析聊天工具大多数由客户端程序和服务器程序外加服务器端,本程序采用客户机/服务器架构模式。

通过Java提供的Socket类来连接客户机和服务器并使客户机和服务器之间相互通信,由于聊天是多点对多点的而Java提供的多线程功能。

用多线程可完成多点对多点的聊天。

主要有两个应用程序,分别为服务器程序和客户端程序。

服务器应用程序主要用于消息转发,以及向所有用户发送系统消息等;客户端应用程序主要用于客户聊天记录的显示和信息输入。

采用Client/Server(C/S)体系结构,即客户机/服务器体系结构。

聊天服务器专门用于监控用户状态和转发消息,客户端负责接收消息的用户序列和消息文本发送到服务器。

该聊天系统实现群聊,用户登陆,退出聊天系统等功能。

二. 设计1.设计思想:课程设计中利用JAVA实现基于C/S模式的聊天程序。

聊天室共分为服务器端和客户端两部分,服务器端程序主要负责侦听客户发来的消息,客户端登录到服务器端才可以实现正常的聊天功能。

2.功能设计(1)服务器端的主要功能如下。

在特定端口上进行侦听,等待客户端连接。

用户可以配置服务端的侦听端口,默认端口为10000.当停止服务时,断开所有用户连接。

(2)客户端的主要功能如下。

连接到已经开启聊天服务的服务端。

当服务器端开启的话,用户可以随时登录与注销。

用户可以向所有人发送消息。

3.详细设计聊天室服务器端设计聊天室服务器中主要的功能文件的功能如下:MyButLis.java主要用于添加事件侦听和动作处理,具体是服务器按钮中的“终止”“发送”的处理。

public class MyButLis implements ActionListenerprivate MyServe server;private JTextField filed1;public void actionPerformed(ActionEvent e)MyChatSet.java服务器的线程队列,运行的方法,新增一个用户,则增加一个线程,并可以返回应答消息,给其余用户发送上下线信息,发送聊天信息(群聊私聊虽然已写,但是不知为何没有实现),发送用户列表。

互联网程序设计实验五

互联网程序设计实验五

实验报告(五)课程名称:互联网程序设计年级:2017级实验日期:姓名:学号:班级:教师评语(成绩):实验名称:实验五 QQ聊天项目拓展(4学时)DatagramPacket backPacket=new DatagramPacket(buf,buf.length,packet.getAddress(),packet.getPort());//向登录用户发送的报文serverSocket.send(backPacket); //发送}else { //登录成功backMsg.setType("M_SUCCESS");byte[] buf=Translate.ObjectToByte(backMsg);DatagramPacket backPacket=new DatagramPacket(buf,buf.length,packet.getAddress(),packet.getPort());//向登录用户发送的报文serverSocket.send(backPacket); //发送User user=new User();user.setUserId(userId); //用户名user.setPacket(packet); //保存收到的报文userList.add(user); //将新用户加入用户列表//更新服务器聊天室大厅parentUI.txtArea.append(userId+" 登录!\n");//向所有其他在线用户发送M_LOGIN消息,向新登录者发送整个用户列表for (int i=0;i<userList.size();i++) { //遍历整个用户列表//向其他在线用户发送M_LOGIN消息if(!userId.equalsIgnoreCase(userList.get(i).getUserId())){DatagramPacketoldPacket=userList.get(i).getPacket();DatagramPacket newPacket=new DatagramPacket(data,data.length,oldPacket.getAddress(),oldPacket.getPort());//向其他用户发送的报文serverSocket.send(newPacket); //发送}//end if//向当前用户回送M_ACK消息,将第i个用户加入当前用户的用户列表Message other=new Message();other.setUserId(userList.get(i).getUserId());other.setType("M_ACK");byte[] buffer=Translate.ObjectToByte(other);DatagramPacket newPacket=new DatagramPacket(buffer,buffer.length,packet.getAddress(),packet.getPort());serverSocket.send(newPacket);}//end for}//end if}else if (msg.getType().equalsIgnoreCase("M_MSG")) { //是M_MSG消息//更新显示parentUI.txtArea.append(userId+" 说:"+msg.getText()+"\n");//转发消息for (int i=0;i<userList.size();i++) { //遍历用户DatagramPacket oldPacket=userList.get(i).getPacket();DatagramPacket newPacket=new DatagramPacket(data,data.length,oldPacket.getAddress(),oldPacket.getPort());serverSocket.send(newPacket); //发送}}else if (msg.getType().equalsIgnoreCase("M_QUIT")) { //是M_QUIT消息//更新显示parentUI.txtArea.append(userId+" 下线!\n");//删除用户for(int i=0;i<userList.size();i++) {if (userList.get(i).getUserId().equals(userId)) {userList.remove(i);break;}}//end for//向其他用户转发下线消息for (int i=0;i<userList.size();i++) {DatagramPacket oldPacket=userList.get(i).getPacket();DatagramPacket newPacket=new DatagramPacket(data,data.length,oldPacket.getAddress(),oldPacket.getPort());serverSocket.send(newPacket);}//end for}//end if} catch (IOException | NumberFormatException ex) { }}//end while}//end run}//end class实验结果:五、总结对上机实践结果进行分析,问题回答,上机的心得体会及改进意见。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机网络课程设计报告设计选题网络聊天室姓名马继鸣学号 0909090630完成时间 2012-1-12 一、需求分析聊天工具大多数由客户端程序和服务器程序外加服务器端,本程序采用客户机/服务器架构模式。

通过Java提供的Socket类来连接客户机和服务器并使客户机和服务器之间相互通信,由于聊天是多点对多点的而Java提供的多线程功能。

用多线程可完成多点对多点的聊天。

主要有两个应用程序,分别为服务器程序和客户端程序。

服务器应用程序主要用于消息转发,以及向所有用户发送系统消息等;客户端应用程序主要用于客户聊天记录的显示和信息输入。

采用Client/Server(C/S)体系结构,即客户机/服务器体系结构。

聊天服务器专门用于监控用户状态和转发消息,客户端负责接收消息的用户序列和消息文本发送到服务器。

该聊天系统实现群聊,用户登陆,退出聊天系统等功能。

二. 设计1.设计思想:课程设计中利用JAVA实现基于C/S模式的聊天程序。

聊天室共分为服务器端和客户端两部分,服务器端程序主要负责侦听客户发来的消息,客户端登录到服务器端才可以实现正常的聊天功能。

2.功能设计(1)服务器端的主要功能如下。

在特定端口上进行侦听,等待客户端连接。

用户可以配置服务端的侦听端口,默认端口为10000.当停止服务时,断开所有用户连接。

(2)客户端的主要功能如下。

连接到已经开启聊天服务的服务端。

当服务器端开启的话,用户可以随时登录与注销。

用户可以向所有人发送消息。

3.详细设计聊天室服务器端设计聊天室服务器中主要的功能文件的功能如下:MyButLis.java主要用于添加事件侦听和动作处理,具体是服务器按钮中的“终止”“发送”的处理。

public class MyButLis implements ActionListenerprivate MyServe server;private JTextField filed1;public void actionPerformed(ActionEvent e)MyChatSet.java服务器的线程队列,运行的方法,新增一个用户,则增加一个线程,并可以返回应答消息,给其余用户发送上下线信息,发送聊天信息(群聊私聊虽然已写,但是不知为何没有实现),发送用户列表。

关键在于除了线程之外,还定义了传输数据时的协议内容,如何分辨不同的信息,如聊天信息,登陆信息,上下线信息,并把信息完整准确的传递。

public static ArrayList<MyserThread> servers=new ArrayList<MyserThread>();//线程队列public static void addThread(MyserThread th) //增加一个服务器线程对象public static void sendReMess(String type,String state,String s,MyserThread myth)//返回应答信息public static void SendOSMess(String type,String user)//其他用户上下线信息public static void SendChatMess(String type,String sender,String reciver,String Mess)//聊天信息public static void SendList//用户列表MyCheckTool.java保存用户的登陆信息,在其中建立一个码表,并且可以判断登陆信息是否合法。

//建立码表,用以保存用户信息private static Map<String, MyUserInfo> maps=new HashMap<String, MyUserInfo>();public static boolean CheckUser(MyUserInfo user)// 验证用户名MyFrame.java建立服务器的主界面,关联侦听器。

并启动线程。

MyFrame my=new MyFrame();my.ShowUI();// 显示UI界面public void ShowUI()server.SetUP();MyserThread.java服务器线程类,定义输入输出流,发送读取信息,获取信息中相应标签的信息,用以判断用户名,密码,并可以中断连接。

this.socket=socket;output=socket.getOutputStream();input=socket.getInputStream();public void SendMess(String s)//发送信息public String ReadMess() //读取信息public boolean ReadFirst()//将第一条信息读出来public String GetValue(String type ,String Mess)public void Pocess()//用以判断用户名、密码public void run()//线程开始public MyUserInfo getUser()//获得该线程中的用户信息MyServe.java建立服务器,并启动该线程。

server=new ServerSocket(inport);Socket sc=server.accept();//获得socket对象MyserThread th=new MyserThread(sc);th.start(); //启动线程客户端中主要的功能文件概述如下:MyButLis.java主要用于添加事件侦听和动作处理,具体是在客户端中的登陆注册发送等的处理。

public MyButLis(MySocketChat socket,JTextArea area1,JTextArea area2,MyLoginUI loginUI,JComboBox box)public void actionPerformed(ActionEvent e) //设置动作监听器MyChatFrame.java客户端的图形界面。

关联侦听器。

并启动线程。

socket.setArea(area1);socket.start()MyLoginUI.java登陆界面MySocketChat.java构建连接,截取字符串,发送登陆,注册,聊天信息,读取信息并判断设置启动线程方法。

public MySocketChat(JTextField field1,JTextField field2,JTextArea area)//重写构造函数public String GetValue(String type ,String Mess) //截取字符串public void SendMess(String type)// 发送登陆或者注册信息public void SendChat(String getter,String chat)// 发送聊天消息public String ReadMess ()//读入的信息public void CheckMess(String Mess) //判断是什么消息public void run()//设置启动方法三. 调试及测试1、调试过程中遇到的主要问题及解决方法在对于群聊和私聊的处理中,只实现了群聊,私聊虽有写,但是还没有实现,由于时间仓促,只能在寒假的其余时间努力完成。

还有就是如何在服务器与客户端的信息交互过程中,让他们能分辨是哪种信息并准确的读出来。

如果不能准确的分析,则数据的交换只能完成一种粗略的互换,而不能提取聊天内容等用户希望得到的信息。

为此,我专门看了很多相关的资料,在很多方法里面选取了一种自己容易理解的方法,我就定义了几种方式,分别辨认登陆注册聊天列表等信息:"<msg><type>"+type+"</type>"+"<name>"+user+"</name>"+"<pwd>"+pwd+"</pwd></msg>";//第一个与最后一个msg是标示一整句话的标示符 type标示数据类型,两个<type>中间的type即为需求数据,两个<user>之间的是用户名称,两个<pwd>之间的pwd指的是密码"<msg><type>chat</type>"+"<sender>"+user+"</sender>"+"<reciver>"+gett er+"</reciver>"+"<content>"+chat+"</content></msg>";//其中sender,reciever,content分别指发送者、接受者、内容。

一些语法问题,在随着写程序的过程中,也慢慢纠正。

在服务器组建中,由于java对于网络连接强有力的支持和丰富的代码,让我没有遇到太难的问题。

2、对设计和编码的回顾讨论和分析在获取系统时间这一块上,还是做得比较好。

Calendar ca=Calendar.getInstance();Date da=new Date();// 注意是在java.util.DateSimpleDateFormat format=new SimpleDateFormat("HH:mm:ss");//设置时间格式da=ca.getTime();time=format.format(da);处理保存的注册信息时,可能做得不是很好,将hashmap写入文件,这样不能长期保存注册信息,只能在服务器不关闭的状态下,保存注册信息。

这个也会继续改进3、程序运行的时空效率分析本程序应用了线程对端口进行侦听。

线程一直后台开启,长期占用系统资源,但又能及时的实现端口监听和消息的收发。

4、测试数据集服务器端程序主界面:可以记录用户名,账号,IP地址,并可以发送系统消息客户登陆注册界面注册成功提示框客户端运行界面用户端测试界面中间的(全部)按钮,点击后可以显示当前在线的好友列表,并选择聊天对象四、经验和体会。

这是我第一次做java项目,只是这个学期选修了面向程序设计,每周一节课,很浅显的学习了java语言,在综合性如此强的项目设计中,感觉力不从心。

相关文档
最新文档