java课程设计报告qq聊天

合集下载

JAVA课程设计报告(聊天软件)

JAVA课程设计报告(聊天软件)

Java2实用教程课程设计报告课题名称:用JAVA设计的聊天软件系别:计算机科学系班级:08软件工程2班学号:081403223 姓名:目录一、课程设计的目标二、开发及运行环境三、设计方法1.程序功能1)服务器功能2)客户端功能2.程序实现3.类的实现4.程序结果1)服务器端的运行结果2)客户端的运行结果四、设计心得五、参考文献一、课程设计的目标此次课程设计的目标是用JAVA语言实现一个功能比较完善的聊天软件,功能包含(用户注册、登录、修改昵称、更新心情、查找并添加好友、基本的文字聊天、传送文件、发送图片、窗口抖动、保存聊天记录等等),在设计该软件的过程中,综合运用了本学期所学的所有JAVA语言的基本知识,特别是线程、数据库、Swing、异常处理等知识。

通过这次课程设计,使我们对JAVA语言以及面向对象编程有了更深的体会,我们的程序设计能力也有了很大地提高。

二、开发及运行环境◇硬件:PC机◇操作系统:Windows XP◇数据库:MySQL◇开发工具:Eclipse◇JDK 要求jdk 7.0三、设计方法1.程序功能(1)服务器功能(2)客户端功能层次功能图:程序流程:(1)登录模块流程图(2)注册模块流程图(3)发送文件模块流程图2.程序实现客户端:服务器端:3.类的实现各主要类的方法、函数的核心代码:(附:源代码)(1) 数据库处理源代码:/*** 在数据库中查询用户的资料,保存在本地的PersonalData中* @return*/public void checkPersonalData(String id){PersonalData pd = PersonalData.getInstance();Connection conn = null;ResultSet rs = null;PreparedStatement pstmt = null;String sql = "select * from user where userid=?";try {conn = ConnMySQL.getConnection();pstmt = conn.prepareStatement(sql);pstmt.setString(1, id);rs = pstmt.executeQuery();if (rs.next()) {pd.setUserId(rs.getString("userId"));pd.setUserName(rs.getString("username"));pd.setPicNo(rs.getString("picNo"));}}catch(SQLException e) {e.printStackTrace();}finally {ConnMySQL.close(rs);ConnMySQL.close(pstmt);ConnMySQL.close(conn);}}(2) 其他数据处理关键语句:/*** 在数据库中查询用户的资料,保存在本地的PersonalData中* @return*/String sql = "select * from user where userid=?";/*** 在数据库中查询最新的心情* @return*/String sql = "select moodcontent from moodlist where moodid = (select max(moodid)from moodlist where pid=?)";/*** 查找用户的所有好友,保存在本地程序中* @param id* @return*/String sql = "select * from user where userId in (select friendid from relationlist where pid=?)";/*** 修改用户的昵称* @return*/String sql = "update user set username=? where userId=?";/*** 修改用户的密码* @return*/String sql = "update user set password=? where userId=?";/*** 获取自动编号ID* @param gen_name* @return*/String sql = "select gen_number from generator where gen_name =?";/*** 更新Id维护列表,此方法给此类别的函数调用* @param gen_name* @param current_id* @param conn*/String sql = "update generator set gen_number =? where gen_name = ?";/*** 添加心情* @param userId* @param mood* @return*/String sql = "insert into moodlist values(?,?,?,?);";String sql = "select * from moodlist order by moodId desc limit 20";/*** 加好友* @param args*/String sql = "insert into relationlist values(?,?,?);";String sql = "insert into user values(?,?,?,?);";(3) 客户端接收线程的run()函数:public void run() {while(run1){try {ObjectInputStream ois = new ObjectInputStream(sk.getInputStream());Message mes = (Message)ois.readObject();String messageType = mes.getMessageType();String sender = mes.getSender();String receiver = mes.getReceiver();if(messageType.equals(MessageType.CONTENT) || messageType.equals(MessageType.EXPRESSION)) {// System.out.println(receiver);ChatWindow cw = ChatWinMap.getChatWindow(sender);// System.out.println("来自用户"+cw);if(null == cw){if(null != FriendMap.getFriendData(mes.getSender())) {ReceiverMessage rm = new ReceiverMessage(mes);Thread th = new Thread(rm);th.start();}} else {cw.showMessage(mes);}} else if(messageType.equals(MessageType.ON_LINE)) {System.out.println("更新在线好友");String []all_online_ip = mes.getAll_online_id().split(",");ChatMainMap.getChatMain(mes.getReceiver()).getJp_center().changeOnlineState(all_onl ine_ip);Online_message on_mes = new Online_message(mes.getSender());Thread th = new Thread(on_mes);th.start();} else if(messageType.equals(MessageType.SHAKE_WIN)) {ChatWindow cw = ChatWinMap.getChatWindow(sender);Thread th = new Thread(cw);th.start();cw.showMessage(mes);} else if(messageType.equals(MessageType.REQUEST)){//把该好友的资料丛数据库中取出并保存在客户端程序中ReceiverRequestMessage rsm = new ReceiverRequestMessage(mes);Thread th = new Thread(rsm);th.start();} else if(messageType.equals(MessageType.REQUEST_CONFIRM)) {//把双边的关系加入数据库UserManager.getInstance().addFriend(mes.getSender(),mes.getReceiver());System.out.println("保存好友:"+mes.getSender());System.out.println(mes.getReceiver());UserManager.getInstance().addFriend(mes.getReceiver(),mes.getSender());//把该好友资料从数据库中取得并保存在客户端程序中String []fds = UserManager.getInstance().checkUser(mes.getSender());FriendData fd = new FriendData();fd.setFriendId(fds[0]);fd.setFriendName(fds[1]);fd.setFriendPic(fds[2]);FriendList.getFriendList().add(fd);FriendMap.addFriendData(fds[0], fd);//更新好友列表String all_ip = mes.getAll_online_id();ChatMainMap.getChatMain(PersonalData.getUserId()).updataCenter(all_ip);ConfirmRequestMessage rm = new ConfirmRequestMessage(mes);Thread th = new Thread(rm);th.start();} else if(messageType.equals(MessageType.REQUEST_REFUSE)){ConfirmRequestMessage rm = new ConfirmRequestMessage(mes);Thread th = new Thread(rm);th.start();} else if(messageType.equals(MessageType.NOT_ONLINE)) {MessageBox msb = new MessageBox("对方不在线");Thread th = new Thread(msb);th.start();} else if(messageType.equals(MessageType.OFF_LINE)) {System.out.println("有人下线了");//更新好友列表if(sender.equals(PersonalData.getUserId())) {break;}String all_ip = mes.getAll_online_id();System.out.println("当前在线好友:"+mes.getAll_online_id());ChatMainMap.getChatMain(PersonalData.getUserId()).updataCenter(all_ip);} else if(messageType.equals(MessageType.FILE_TRAN)) {ReceiverFileTransMessage rftm = new ReceiverFileTransMessage(mes);Thread th = new Thread(rftm);th.start();} else if(messageType.equals(MessageType.FILE_TRAN_CONFIRM)) {ConfirmRequestMessage rm = new ConfirmRequestMessage(mes);Thread th = new Thread(rm);th.start();} else if(messageType.equals(MessageType.FILE_TRAN_REFUSE)) {ConfirmRequestMessage rm = new ConfirmRequestMessage(mes);Thread th = new Thread(rm);th.start();}}catch (Exception e) {e.printStackTrace();}}}(4) 接收文件的客户端run()函数public void run() {Socket server;try {server = new Socket(msg.getFileTranMes().getServerIp(), Integer.parseInt(msg.getFileTranMes().getServerPort()));//创建网络接受流接受服务器文件数据InputStream netIn = server.getInputStream();InputStream in = new DataInputStream(new BufferedInputStream(netIn));//创建缓冲区缓冲网络数据// System.out.println("传输文件的长度:"+in.available());byte[] buf = new byte[2048];int num = in.read(buf);while (num != (-1)) {//是否读完所有数据raf.write(buf, 0, num);//将数据写往文件raf.skipBytes(num);//顺序写文件字节num = in.read(buf);//继续从网络中读取文件width = width+1;width_1 = width/size * 180;jl2.setBounds(10,40,(int)(width_1),20);jl2.setText(" "+(int)(width/size*100)+"%");}jl2.setText("传送完成");in.close();raf.close();} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}(5) 发送文件的服务器run()函数public void run() {//创建网络服务器接受客户请求ServerSocket ss;Socket client = null;try {ss = new ServerSocket(5678);client = ss.accept();} catch (IOException e) {// TODO Auto-generated catch block// e.printStackTrace();}//创建网络输出流并提供数据包装器OutputStream netOut;try {netOut = client.getOutputStream();OutputStream doc = new DataOutputStream(new BufferedOutputStream(netOut));//创建文件读取缓冲区byte[] buf = new byte[2048];int num = fos.read(buf);while (num != (-1)) {//是否读完文件doc.write(buf, 0, num);//把文件数据写出网络缓冲区doc.flush();//刷新缓冲区把数据写往客户端num = fos.read(buf);//继续从文件中读取数据width = width+1;width_1 = width/size * 180;jl2.setBounds(10,40,(int)(width_1),20);jl2.setText(" "+(int)(width/size*100)+"%");}jl2.setText("传送完成");fos.close();doc.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}(6) 客户端登录验证的函数public boolean CheckUser (Message msg) {boolean check = false;try {sk = new Socket(ip,port);System.out.println("获取socket");} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}try {ObjectOutputStream oos = new ObjectOutputStream(sk.getOutputStream());oos.writeObject(msg);ObjectInputStream ois=new ObjectInputStream(sk.getInputStream());Message mss=(Message)ois.readObject();if(mss.getMessageType().equals(MessageType.ON_LINE)){ClientConnServerThread ccst = new ClientConnServerThread(sk);System.out.println("赋给ClietThreadMap的id:" + mss.getUser().getUserId());ClientThreadMap.setClientThreadHm(mss.getUser().getUserId(), ccst);ccst.start();User u = mss.getUser();//在这里查询数据库中用户的信息,并保存在客户端程序中UserManager.getInstance().checkPersonalData(u.getUserId());PersonalData.setMood(UserManager.getInstance().checkMood(u.getUserId()));UserManager.getInstance().checkAllFriend(u.getUserId());ChatMain cm = new ChatMain(u,mss);ChatMainMap.addChatMain(u.getUserId(), cm);check = true;} else if(mss.getMessageType().equals(MessageType.ON_LINE_FAIL)) {// JOptionPane.showMessageDialog(null, "用户名或密码错误");MessageBox msgb = new MessageBox("用户名或密码错误!");Thread th = new Thread(msgb);th.start();ois.close();oos.close();sk.close();}} catch (Exception e) {e.printStackTrace();}return check;}(7) 连接数据库的函数public static Connection getConnection() {Connection conn = null;try {Class.forName("com.mysql.jdbc.Driver");conn = DriverManager.getConnection("jdbc:mysql://localhost/chatdata?user=user1&password=m1 23");} catch (Exception ex) {ex.printStackTrace();}return conn;}(8) 发送消息的响应事件:if(e.getSource() == jb_send) {if(cardNo == 0) {Date time = new Date();SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss");String sendtime = sdf.format(time);Document doc = jta.getDocument();try {doc.insertString(jta.getDocument().getLength(),PersonalData.getUserName()+"("+ erId+") "+sendtime+"\n", null);doc.insertString(jta.getDocument().getLength()," "+jta_send.getText()+"\n", null);} catch (BadLocationException e2) {// TODO Auto-generated catch blocke2.printStackTrace();}String sendMes = jta_send.getText();jta_send.setText("");Message mes = new Message();mes.setSender(erId);mes.setReceiver(this.receiveId);// System.out.println("发送前receiverId的值:"+receiveId);mes.setContent(sendMes);mes.setSendtime(sendtime);mes.setPic_no(PersonalData.getPicNo());mes.setMessageType(MessageType.CONTENT);try {ObjectOutputStream oos = new ObjectOutputStream(ClientThreadMap.getClientThreadHm(erId).getSocket().getOutp utStream());oos.writeObject(mes);} catch (Exception e1) {e1.printStackTrace();}} else {Date time = new Date();SimpleDateFormat sdf = new SimpleDateFormat("MM-DD hh:mm:ss");String sendtime = sdf.format(time);Document doc = jta.getDocument();try {doc.insertString(jta.getDocument().getLength(),PersonalData.getUserName()+"("+ erId+") "+sendtime+"\n", null);doc.insertString(jta.getDocument().getLength(), " ", null);jta.setCaretPosition(doc.getLength());jta.insertIcon(new ImageIcon("images/"+faceNo+".gif"));doc.insertString(jta.getDocument().getLength(), "\n", null);} catch (BadLocationException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}System.out.println("send picture:"+faceNo);String sendMes = faceNo;Message mes = new Message();mes.setSender(erId);mes.setReceiver(this.receiveId);mes.setContent(sendMes);mes.setSendtime(sendtime);mes.setMessageType(MessageType.EXPRESSION);try {// System.out.println("==============准备发送消息================");ObjectOutputStream oos = new ObjectOutputStream(ClientThreadMap.getClientThreadHm(erId).getSocket().getOutp utStream());// System.out.println(oos+":"+mes.getMessageType());oos.writeObject(mes);} catch (Exception e1) {e1.printStackTrace();}}}(9) 显示消息的函数:public void showMessage(Message ms) {try {Document doc = chat_window.jta.getDocument();doc.insertString(chat_window.jta.getDocument().getLength(),FriendMap.getFriendData(t his.receiveId).getFriendName()+"("+ms.getSender()+") "+ms.getSendtime()+"\n", null);if(ms.getMessageType().equals(MessageType.CONTENT)){doc.insertString(chat_window.jta.getDocument().getLength(),""+ms.getContent()+"\n", null);} else if(ms.getMessageType().equals(MessageType.EXPRESSION)){//插入图片doc.insertString(chat_window.jta.getDocument().getLength(), " ", null);chat_window.jta.setCaretPosition(doc.getLength());chat_window.jta.insertIcon(new ImageIcon("images/"+ms.getContent()+".gif"));doc.insertString(chat_window.jta.getDocument().getLength(), "\n", null);} else if(ms.getMessageType().equals(MessageType.SHAKE_WIN)){doc.insertString(chat_window.jta.getDocument().getLength(),""+ms.getContent()+"\n", null);}} catch (BadLocationException e) {e.printStackTrace();}}(10) 服务器端等待和验证客户端信息函数public void run() {while (true) {try {System.out.println("服务器正在等待客户端的连接");Socket sk = ssk.accept();ObjectInputStream ois=new ObjectInputStream(sk.getInputStream());Message ms = (Message)ois.readObject();User u = ms.getUser();String password = UserManager.getInstance().checkPersonalData(u.getUserId());if(null != password){if(u.getPassword().equals(password)) {System.out.println("验证密码");ServerConnClientThread sct = new ServerConnClientThread(sk);sct.start();ThreadMap.addThread(u.getUserId(), sct);/*验证成功后,把所有在线用户返回给所有的用户*/Iterator it = ThreadMap.hm.entrySet().iterator();String all_id = "";while(it.hasNext()){Entry entry = (Entry) it.next();all_id+=entry.getKey();if(it.hasNext()){all_id+=",";}// System.out.println(all_id);}ms.setAll_online_id(all_id);Iterator it2 = ThreadMap.hm.entrySet().iterator();while(it2.hasNext()) {Entry entry = (Entry) it2.next();ServerConnClientThread st = (ServerConnClientThread) entry.getValue();ObjectOutputStream oos = new ObjectOutputStream(st.sk.getOutputStream());ms.setReceiver(entry.getKey()+"");oos.writeObject(ms);}} else {//密码错误Message mss = new Message();mss.setMessageType(MessageType.ON_LINE_FAIL);mss.setContent("用户密码错误!");ObjectOutputStream oos=new ObjectOutputStream(sk.getOutputStream());oos.writeObject(mss);sk.close();}} else {//用户不存在Message mss = new Message();mss.setMessageType(MessageType.ON_LINE_FAIL);mss.setContent("该用户不存在");ObjectOutputStream oos=new ObjectOutputStream(sk.getOutputStream());oos.writeObject(mss);sk.close();}} catch (Exception e) {e.printStackTrace();}}}(11) 服务器转发消息函数public void run() {boolean run = true;Message m = null;while(true){try {ObjectInputStream ois = new ObjectInputStream(sk.getInputStream());m=(Message)ois.readObject();System.out.println("开始接收数据");String messageType = m.getMessageType();String sender = m.getSender();String receiver = m.getReceiver();if(m.getMessageType().equals(MessageType.OFF_LINE)) {//重新获取在线IDIterator it = ThreadMap.hm.entrySet().iterator();String all_id = "";while(it.hasNext()){Entry entry = (Entry) it.next();if(!(entry.getKey().toString().equals(sender))){all_id+=entry.getKey();if(it.hasNext()){all_id+=",";}}}String all_id2 = all_id.substring(0, all_id.length());System.out.println(all_id2);//把消息传给每个人Iterator it2 = ThreadMap.hm.entrySet().iterator();ObjectOutputStream oos = null;ServerConnClientThread scct = null;while(it2.hasNext()){Entry entry = (Entry) it2.next();scct = (ServerConnClientThread) entry.getValue();oos = new ObjectOutputStream(scct.sk.getOutputStream());m.setAll_online_id(all_id2);oos.writeObject(m);}ThreadMap.hm.remove(sender);break;} else {if(messageType.equals(MessageType.REQUEST)||messageType.equals(MessageType.RE QUEST_CONFIRM)) {Iterator it = ThreadMap.hm.entrySet().iterator();String all_id = "";while(it.hasNext()){Entry entry = (Entry) it.next();all_id+=entry.getKey();if(it.hasNext()){all_id+=",";}// System.out.println(all_id);}m.setAll_online_id(all_id);}ObjectOutputStream oos = new ObjectOutputStream(ThreadMap.getThread(receiver).sk.getOutputStream());System.out.println("开始转发数据");oos.writeObject(m);}}catch(Exception ex){ex.printStackTrace();}}}4.程序结果(1)服务器端的运行结果附:效果图运行ServerWindow.java类,点击(3)客户端的运行结果附所有功能的效果图运行ChatLogin.java 类,用户注册:在登录界面点击快速注册,弹出注册向导如下图,输入注册资料;点击提交,结果如下图:注:号码10007是按顺序生成,先从10000开始生成,以此类推登录:在登录界面输入刚才注册的帐号跟密码:点击登录,显示界面如下图:修改昵称:点击主窗体右边的按键:输入新昵称跟密码:点击修改按键:更新心情:点击主窗体右边的按键:在文本框内输入心情,点击发表:查找并添加好友:点击主窗体右边的按键,并输入所要查找好友的帐号,点击查找:点击添加,出现以下提示窗口:同时,登录10006用户,这时屏幕右下角会出现如下提示窗口:用户10006点击同意,用户10007会出现如下提示窗口:用户拒绝添加申请的效果图如下:基本文字聊天:用户10007打开与用户10006的聊天窗口并发送文字信息:同时用户10006收到消息提示如下图:文件传送:点击聊天窗口中传送文件的按键,出现如下图的窗口,选择要传送的文件:点击打开,电脑桌面右下角将出现如下消息窗口:点击接收:点击拒绝:发送图片:窗口抖动:用户10007向用户10006发送一个窗口抖动:(通过产生随机数改变窗体的位置)保存跟读取聊天记录:点击保存按键:重新打开聊天窗口,点击读取按键:四、设计心得通过这次的Java课程设计,设计了一个聊天软件,主要的收获就是:(1) 更加熟悉的Java语言的特性;(2) 更熟悉的使用Java的界面库设计好的界面;(3) 对多线程有了更深刻的理解;(4) 数据库的相关处理存在的不足:(1)界面的某些布局不够合理,导致使用时有点不方便;(2)由于之前对多线程理解的不够深刻,导致在编写的过程中处理这些错误花了很多的时间;(3)有些实现思路不够简洁,每个用到更加合理的设计方法。

java聊天软件课课程设计

java聊天软件课课程设计

java聊天软件课课程设计一、教学目标本课程的学习目标包括以下三个方面:1.知识目标:学生需要掌握Java编程语言的基本语法、面向对象编程思想、常用数据结构和算法,以及JavaFX等图形用户界面开发技术,从而能够独立设计和开发简单的聊天软件。

2.技能目标:学生能够熟练使用Java开发工具和环境,具备查找和解决编程问题的能力,能够独立完成聊天软件的设计、编码、调试和测试工作。

3.情感态度价值观目标:通过本课程的学习,学生能够培养对编程和软件开发的兴趣和热情,认识软件开发对社会和科学的重要性,形成良好的学习态度和合作精神。

二、教学内容本课程的教学内容主要包括以下几个部分:1.Java编程基础:Java语言的基本语法、数据类型、运算符、控制结构、数组、字符串等。

2.面向对象编程:类和对象的概念、构造方法、成员变量、继承、多态、接口等。

3.常用数据结构和算法:数组、链表、栈、队列、排序、查找等。

4.JavaFX图形用户界面开发:窗口、控件、布局、事件处理等。

5.聊天软件设计与开发:设计模式、网络编程、多线程、消息传递机制等。

三、教学方法本课程的教学方法包括以下几种:1.讲授法:用于向学生传授基本概念、原理和方法。

2.案例分析法:通过分析典型聊天软件的案例,使学生更好地理解和掌握相关知识。

3.实验法:让学生动手编写代码,实际操作聊天软件的开发过程,培养实际编程能力。

4.讨论法:学生进行小组讨论,分享学习心得和解决问题的方法,提高合作和沟通能力。

四、教学资源本课程的教学资源包括以下几种:1.教材:《Java编程基础》、《JavaFX教程》、《Java网络编程》等。

2.参考书:为学生提供丰富的课外阅读材料,加深对课程内容的理解。

3.多媒体资料:教学PPT、视频教程、网络资源等,丰富教学手段,提高学习兴趣。

4.实验设备:计算机、网络设备等,为学生提供实际操作环境,培养实际编程能力。

五、教学评估本课程的评估方式包括以下几个方面:1.平时表现:通过课堂参与、提问、讨论等环节,评估学生的学习态度和积极性。

JAVA编写QQ聊天系统指导书

JAVA编写QQ聊天系统指导书

JAVA编写QQ聊天系统指导书一、QQ聊天系统简介1、模拟聊天系统包含两个方面,服务器端和客户端。

2、服务器端任务:建立一个ServerSocket,与客户端建立通信通道,不断侦听是否有客户端连接或者断开连接。

服务器端是一个信息转发中心,所有客户端的信息都传到服务器端,由服务器端根据要求分发信息。

3、客户端任务:建立一个Socket,与服务器端建立通信通道,向服务器端发送信息,并接收来自服务器的信息。

二、QQ聊天系统测试1、教师机新建一个java project,命名为QQchat,将“QQ聊天系统素材”下服务器端解压,将解压后的两个包com,client复制到QQchat/src下,运行Server.java。

弹出如图1-1所示图形界面,点击“开始”,将弹出如图1-2所示图形界面,服务器即打开。

图1-1 图1-22、指导学生新建一个java project,命名为QQchat,在“QQ聊天系统素材”下载客户端,将客户端下载解压,将解压后的两个包com,client复制到QQchat/src下,运行Client.java,将弹出如图1-3所示图形界面,输入服务器的ip,port,以及帐户名(自已姓名)登录,将弹出如图1-4所示图形界面。

点击如图1-5所示图形界面的下拉列表,在发送框中输入信息发送,就可以进行群聊或私聊。

图1-3 图1-4 图1-54、指导同学们下载服务器端,同学们轮流运行服务器程序,其它同学通过某个同学的服务器程序进行聊天。

不同的服务器以IP地址区别。

需要提醒学生注意的是:只有登录同一个服务器的客户端才能相互聊天,测试时服务器端只能有一个,学生们需要轮流做服务器,而客户端可以有多个,没有限制。

三、QQ聊天系统设计与实现操作步骤。

任务一目的:通过网络编程,让同学们与老师互通字节信息。

老师做服务器,学生做客户端。

具体操作步骤:教师与学生都新建一个java project,命名如zhangsanQQchat(以本人姓名+QQchat为文件名),在src下新建一个other包,教师在other包下新建Server.java 类并运行。

java课程设计报告(java聊天室)

java课程设计报告(java聊天室)

Java聊天室课程设计一、需求分析1.1开发背景在信息化社会的今天,网络飞速发展,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,类似MSN、QQ,网络聊天时一类的聊天系统的发展日新月异,因此产生了制作一个类似QQ的网络聊天工具的想法,且通过制作该程序还能更好的学习网络软件编程知识。

网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯。

网编程中有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。

在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机。

而TCP层则提供面向应用的可靠的或非可靠的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的。

目前较为流行的网络编程模型是客户机/服务器(C/S)结构。

即通信双方一方作为服务器等待客户提出请求并予以响应。

客户则在需要服务时向服务器提出申请。

服务器一般作为守护进程始终运行,监听网络端口,一旦有客户请求,就会启动一个服务进程来响应该客户,同时自己继续监听服务端口,使后来的客户也得到响应的服务。

1.2设计要求本课程设计的目标是利用套接字socket()设计一个聊天程序,该程序基于C/S模式,客户机器向服务器发聊天请求,服务器应答并能显示客户机发过来的信息。

1.3设计目的通过设计一个网络聊天程序,对套接字、数据报通讯、URL、与URLConnectiom的相关知识有详细的了解和充分的认识。

能将相关的只是运用到相关的实践中去。

1.4功能实现服务器的主要功能有1)在特定端口上进行侦听,等待客户连接2)用户可以配置服务器的真挺端口3)向已经连接服务器的客户发送系统消息4)统计在线人数5)当停止服务时,断开所有用户的连接客户端的主要功能1)连接到已经开启聊天服务的服务端2)用户可以配置要连接服务器端的ip地址和端口号3)用户可以配置连接后显示的用户名4)当服务器开启时。

QQ聊天程序设计报告

QQ聊天程序设计报告

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

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

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

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

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

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

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

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

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

java聊天程序实验报告

java聊天程序实验报告

java聊天程序实验报告Java聊天程序实验报告一、引言随着互联网的快速发展,人们之间的交流方式也在不断改变。

聊天程序作为一种实时通信工具,已经成为人们日常生活中必不可少的一部分。

本实验旨在通过使用Java编程语言,设计并实现一个简单的聊天程序,以探索实时通信的原理和机制。

二、实验目的1. 学习和掌握Java编程语言的基本语法和面向对象的编程思想;2. 了解Socket编程的基本原理和实现方式;3. 设计并实现一个简单的聊天程序,实现用户之间的实时通信。

三、实验过程1. 确定程序的基本功能和界面设计。

聊天程序需要实现用户之间的即时通信,并提供简单的用户界面用于输入和显示聊天内容。

2. 使用Java编程语言,创建一个服务器端程序和多个客户端程序。

服务器端程序负责接收和转发客户端的消息,客户端程序负责发送和接收消息。

3. 使用Socket编程,建立服务器和客户端之间的连接。

服务器端程序监听指定的端口,等待客户端的连接请求;客户端程序通过指定服务器的IP地址和端口号,连接到服务器。

4. 实现消息的发送和接收功能。

客户端程序可以通过输入框输入消息,并通过Socket将消息发送到服务器;服务器端程序接收到消息后,将消息转发给其他客户端。

5. 实现消息的显示功能。

客户端程序通过界面显示接收到的消息,并可以将消息保存到本地。

四、实验结果经过实验,我们成功地实现了一个简单的Java聊天程序。

用户可以通过输入框输入消息,并通过服务器端进行消息的转发。

其他客户端可以接收到转发的消息,并在界面上进行显示。

同时,我们还实现了消息的保存功能,用户可以将接收到的消息保存到本地文件中。

五、实验总结通过本次实验,我们深入了解了Java编程语言的基本语法和面向对象的编程思想。

同时,我们也学习了Socket编程的原理和实现方式。

通过实践,我们掌握了如何使用Java编写一个简单的聊天程序,实现用户之间的实时通信。

然而,本实验只是一个简单的聊天程序,还有很多可以改进和扩展的地方。

java聊天程序实验报告

java聊天程序实验报告

java聊天程序实验报告《Java聊天程序实验报告》摘要:本实验报告旨在介绍和分析我们设计并实现的基于Java的聊天程序。

通过该程序,用户可以在网络上进行实时的文字交流,实现了简单的聊天功能。

我们将介绍程序的设计思路、实现过程、功能特点以及存在的问题和改进方向。

一、设计思路我们的聊天程序采用了客户端-服务器架构,通过Socket通信实现了用户之间的数据传输。

客户端和服务器端分别使用了Java的Socket和ServerSocket类来建立连接和进行通信。

客户端可以向服务器发送消息并接收其他用户的消息,服务器负责转发消息给其他在线用户。

二、实现过程在实现过程中,我们首先设计了程序的基本框架,包括客户端和服务器端的代码结构。

然后,我们使用Socket和ServerSocket类来建立连接和进行数据传输。

客户端和服务器端分别使用了多线程来处理连接请求和消息转发,以保证程序的稳定性和并发性。

三、功能特点我们的聊天程序具有以下功能特点:1. 用户注册和登录:用户可以注册新账号并登录到服务器,实现了用户身份的识别和管理。

2. 实时聊天:用户可以在聊天室中实时发送和接收消息,与其他在线用户进行文字交流。

3. 离线消息:服务器可以保存用户的离线消息,并在用户上线时进行推送,确保用户不会错过重要消息。

四、存在的问题和改进方向在实验过程中,我们发现了一些问题和改进方向:1. 安全性问题:目前我们的程序还没有实现用户身份验证和消息加密等安全机制,存在一定的安全风险。

2. 用户体验:目前用户界面较为简陋,可以进一步优化界面设计和交互体验。

3. 功能扩展:可以考虑增加文件传输、群聊等功能,丰富程序的功能特点。

结论:通过本次实验,我们成功设计并实现了基于Java的聊天程序,实现了简单的聊天功能。

在未来,我们将继续改进程序,提高安全性和用户体验,丰富功能特点,使程序更加完善和实用。

JavaQQ设计报告

JavaQQ设计报告

JavaQQ设计报告课题名称: 即时通讯系统设计(淮信QQ)姓名:班级:学号:即时通讯系统设计(淮信QQ)⼀、⼈员组成及组员分⼯1、⼈员组成张圣筛,赵华祥,李军,朱稼霖2、组员分⼯(1)框架的构建:赵华祥此模块包括CientMain ServerMain 的编写及其启动流程ClientProcessor ServerProcessor 处理器线程的编写及其流程以及包括服务器窗体的编写(2)登录、注册、注册信息的编写:朱稼霖包括LoginFrame RegistFrame RegistInfoFrame 的编写及其服务器的响应登录时服务器的处理包括检测⽤户合法性、登记在线⽤户、将好友发给登录⽤户以及通知好友上线等流程(3)SinChatRoom 的编写:李军包括发送聊天消息的流程服务器接受聊天消息并转发的流程对⽅客户端的接受流程包括客户端发送服务器接受客户端接受该模块还包括窗⼝抖动要求发送端和接收端窗体都要抖动⼀共4个流程(4)ListFrame的编写:张圣筛成员列表窗⼝的编写。

包括渲染器的改写,上线、下线的编写及其流程,在服务器端可捕获下线异常。

⼆、分组模块详细设计3、模块功能概述:我负责的是第⼀模块,框架的构建,此模块包括CientMain ServerMain 的编写及其启动流程,ClientProcessor ServerProcessor 处理器线程的编写及其流程,以及包括服务器窗体的编写(1)ServerMain:设置外观感觉,读取配置⽂件,连接到数据库,并显⽰服务器窗体(2)ServerManage:服务器窗体,通过窗体界⾯,对服务器端进⾏操作,和反馈相关信息(3)ServerProcessor:服务器处理器线程,接受客户端和服务器端的请求,并进⾏处理与反馈(4)CientMain:初始化套接字I/O流,初始化登录界⾯并显⽰(5)ClientProcessor:客户端处理器线程,连接到服务器,并显⽰客户端窗体4、系统设计流程图:(1)ServerMain:Java课程设计(2)ServerManage:2即时通讯系统设计(淮信QQ)(3)CientMain:5、运⾏效果及关键代码(1)ServerServerMain:try{//配置⽂件读取Java课程设计SAXReader saxReader = new SAXReader();Document docXML = saxReader.read("config.data");Element root = docXML.getRootElement();Element serverInfo = root.element("server-info");Element serverIP = serverInfo.element("ip");Element serverPort = serverInfo.element("port");ServerData.setPORT(Integer.parseInt(serverPort.getText()));}catch(Exception e){JOptionPane.showMessageDialog(null, "配置⽂件读取异常", "错误信息", JOptionPane.ERROR_MESSAGE); }ServerData.serverFrame=new ServerManager();ServerData.serverFrame.setVisible(true);ServerManager:if(ServerData.serverSocket==null){try{ServerData.serverSocket=new ServerSocket(ServerData.PORT);}catch(Exception e){e.printStackTrace();}this.getjTextInfo().append("服务器启动,监听端⼝"+ServerData.PORT+"\n");}new Thread(new Runnable(){while(true){try{Socket s=ServerData.serverSocket.accept();//阻塞,监听,后服务器线程new Thread(new ServerProcessor(s)).start();//启动线程}catch(Exception e){e.printStackTrace();}}}}).start();this.jButton1.setEnabled(false);ServerProcessor:int uid;//⽤户的数据库ID号ObjectOutputStream oos = null;ObjectInputStream ois = null;User user = null;4即时通讯系统设计(淮信QQ)V ector friendUser = null;V ector groups = null;String rand = null;ImageIcon imageIcon = null;rand = ServerUtil.randString();imageIcon = ServerUtil.getCheckImageIcon(rand);System.out.println("随机数"+rand);try{ois = new ObjectInputStream(socket.getInputStream());oos = new ObjectOutputStream(socket.getOutputStream()); TCPResponse checkImageResponse = new TCPResponse(); checkImageResponse.setrType(ResponseType.CHECKIMAGE); checkImageResponse.getAttributeMap().put("image", imageIcon); oos.writeObject(checkImageResponse);TCPRequest tcpRequest = null;while((tcpRequest = (TCPRequest)ois.readObject()) != null)RequestType requestType = tcpRequest.getrType();switch(requestType){case ASKFORCHECKIMAGE:{}break;case LOGIN:{String name=(String)tcpRequest.getAttribute("username");String pass=(String)tcpRequest.getAttribute("userpass");System.out.println(name+" "+pass);V ectorvv=ServerData.smaDao.DBQuery("select*from QQUser where uID='"+name+"'AND uPass='"+pass+"'");if(vv.size()>0){user =User.getUser(name);ServerData.serverFrame.getjTextInfo().append("⽤户"+name+"上线("+")("+socket.getInetAddress().getHostAddress()+")\n"); user.setStatus(1);//注册在线⽤户ServerData.SOCKETS.put(user, socket);ServerData.OOSMAP.put(user, oos);ServerData.OISMAP.put(user, ois);intid=Integer.parseInt(vv.elementAt(0).elementAt(0).toString());uid=id;//获取⽤户好友,并初始化frinendUserfriendUser=ServerUtil.getFreind(uid,user);System.out.println(friendUser);Java课程设计TCPResponse response=new TCPResponse();response.setrType(ResponseType.LOGINOK);response.setAttribute("frienduser", friendUser);oos.writeObject(response);oos.flush();ServerUtil.tellOnline(friendUser,user);//通知好友其上线了}else{System.out.println("⾮法⽤户");}break;case REGIST:{//客户端注册信息User registuser=(User)tcpRequest.getAttribute("ruser"); String pass=(String)tcpRequest.getAttribute("password"); System.out.println(registuser+pass);registuser.setPass(pass);System.out.println(registuser+pass);ServerUtil.registUser(registuser);if(ServerUtil.registUser(registuser)>0){System.out.println("⽤户注册成功"+registuser); TCPResponse response=new TCPResponse(); response.setrType(ResponseType.REGISTOK); response.setAttribute("user", registuser);response.setAttribute("pass", registuser);try{oos.writeObject(response);oos.flush();}catch(Exception e){e.printStackTrace();}}}break;case SINTEXT:{User touser=(User) tcpRequest.getAttribute("touser"); String message=(String) tcpRequest.getAttribute("message"); TCPResponse response=new TCPResponse(); response.setrType(ResponseType.SINTEXT); response.setAttribute("fromuser",user);response.setAttribute("message",message);try{if(ServerData.OOSMAP.get(touser)!=null)ServerData.OOSMAP.get(touser).writeObject(response);}catch(Exception e){6e.printStackTrace();}}break;case MULTEXT:{}break;case SHAKEFRAME:{User sf= (User)tcpRequest.getAttribute("shakefriend");if(ServerData.OOSMAP.get(sf)!=null){TCPResponse response=new TCPResponse();response.setrType(ResponseType.SHAKEFRAME);response.setAttribute("friend", user);ServerData.OOSMAP.get(sf).writeObject(response);ServerData.OOSMAP.get(sf).flush();}(2)Client:public class ClientMain{public static void main(String[] args){ClientLookFeel.setLoginLookFeel();try{//根据IP和POR T初始化套接字System.out.println("其次运⾏初始化套接字I/O流");ClientData.clientSeocket = newJava课程设计Socket(ClientData.ip,Integer.parseInt(ClientData.port));ClientData.oos = new ObjectOutputStream(ClientData.clientSeocket.getOutputStream()); ClientData.ois = new ObjectInputStream(ClientData.clientSeocket.getInputStream());}catch(Exception e){e.printStackTrace();System.out.println("服务器连接失败!");ClientData.clientSeocket = null;ClientData.oos = null;}System.out.println("开始初始化登录界⾯并显⽰");if(ClientData.clientSeocket != null && ClientData.oos!=null && ClientData.ois!=null){ Thread t = new Thread(new ClientProcessor());ClientData.tMain = t;t.start();}System.out.println("客户端启动...");ClientData.loginFrame=new LoginFrame();ClientData.loginFrame.setVisible(true);}}ClientProcessor:try{TCPResponse tcpResponse = null;while((tcpResponse = (TCPResponse)ois.readObject()) != null){switch(tcpResponse.getrType()){case LOGINOK:{V ectorfriend=(V ector)tcpResponse.getAttribute("frienduser");System.out.println("客户端接收信息"+friend);/* 对公共字段的好友向量设置*/ClientData.friend=friend;//先初始化公共字段中的列表模型和渲染器ClientData.ulm=new UserListModel();ClientData.ulr=new UserListRender();if(ClientData.listFrame==null){ClientData.listFrame=new ListFrame();ClientData.listFrame.setV isible(true);8即时通讯系统设计(淮信QQ)ClientData.loginFrame.dispose();}}break;case REGISTOK:{User u=(User)tcpResponse.getAttribute("user");User pass=(User)tcpResponse.getAttribute("pass");ClientData.registFrame.dispose();if(ClientData.registInfoFrame==null){ClientData.registInfoFrame=new RegistInfoFrame();}ClientData.registInfoFrame.getjLabelInfo().setText("注册成功,请记住你的ID号"); ClientData.registInfoFrame.getjTextArea1().append("QQ号:"+u.getId()+"\n"); ClientData.registInfoFrame.getjTextArea1().append("密码:"+pass.getuPass()+"."); ClientData.registInfoFrame.setVisible(true);}break;case REGISTFAIL:{}break;case SINTEXT:{String message=(String)tcpResponse.getAttribute("message");User fuser=(User)tcpResponse.getAttribute("fromuser");if(ClientData.sinFrameMap.get(fuser)==null){SinChatRoom sRoom=new SinChatRoom(fuser);ClientData.sinFrameMap.put(fuser, sRoom);}ClientData.sinFrameMap.get(fuser).getjTextReceive().append(message); ClientData.sinFrameMap.get(fuser).setV isible(true);ClientData.sinFrameMap.get(fuser).toFront();//将窗⼝弹⾄最上}break;case MULTEXT:{}break;case CHECKIMAGE:{}break;/**验证码错误*/case CHECKWRONG:{Java课程设计}break;User friend=(User)tcpResponse.getAttribute("friend");//获取上线好友int indx=ClientData.friend.indexOf(friend);//获取该上线好友向量中的序列号ClientData.friend.elementAt(ClientData.friend.indexOf(friend)).setStatus(1);//修改好友状态在线UserListModel.regroupUsers();//重新排序好友ClientData.ulm.fireAllData();//通知数据源以改变,重新绘制列表}break;case FRIENDOFFLINE:{User friend=(User)tcpResponse.getAttribute("friend");//获取下线好友int indx=ClientData.friend.indexOf(friend);//获取该上线好友向量中的序列号ClientData.friend.elementAt(ClientData.friend.indexOf(friend)).setStatus(0);//修改好友状态离线UserListModel.regroupUsers();//重新排序好友ClientData.ulm.fireAllData();//通知数据源以改变,重新绘制列表}break;catch(Exception e){e.printStackTrace();JOptionPane.showMessageDialog(null, "与服务器连接已中断", "账号异常信息", RMA TION_MESSAGE); System.exit(0);三、总结为期两个礼拜的JAVA实训结束了,从本次实训中学习到了很多平时上课不能学习到的东西,从原来什么都不懂,到现在已经懂了很多。

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

河南工业大学课程设计课程设计名称: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、输入输出流的选择也不是很清楚,有可能会产生乱码,其次。

相关文档
最新文档