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实训结束了,从本次实训中学习到了很多平时上课不能学习到的东西,从原来什么都不懂,到现在已经懂了很多。

JAVA课程设计报告聊天室

JAVA课程设计报告聊天室

JAVA课程设计报告聊天室一、课程目标知识目标:1. 学生能理解网络编程的基本概念,掌握JAVA Socket编程的基础知识。

2. 学生能运用面向对象编程思想,设计并实现聊天室客户端与服务器的数据传输功能。

3. 学生了解并掌握多线程技术在网络编程中的应用。

技能目标:1. 学生能运用所学知识,独立编写并调试简单的聊天室程序。

2. 学生具备分析问题、解决问题的能力,能针对聊天室程序进行优化和改进。

3. 学生能在团队协作中发挥自己的作用,与他人共同完成一个完整的网络编程项目。

情感态度价值观目标:1. 学生培养对计算机编程的兴趣,增强学习JAVA的自信心。

2. 学生认识到团队合作的重要性,培养良好的团队协作精神。

3. 学生通过编程实践,体验创新与创造的乐趣,培养积极向上的学习态度。

本课程针对高年级学生,结合课本内容,注重理论与实践相结合,以提高学生的实际编程能力为主要目标。

课程要求学生在掌握基本知识的基础上,能够独立完成实际项目,培养其分析问题、解决问题的能力。

同时,课程强调团队协作,使学生学会与他人共同进步,共同成长。

通过本课程的学习,使学生达到知识、技能和情感态度价值观的全面提升。

二、教学内容1. 网络编程基础理论:介绍网络编程的基本概念,包括IP地址、端口号、协议等,使学生理解网络通信的基本原理。

- 教材章节:第三章 网络编程基础2. JAVA Socket编程:讲解Socket编程的原理,指导学生掌握客户端与服务器之间的数据传输方法。

- 教材章节:第四章 Socket编程3. 面向对象编程:运用面向对象编程思想,设计聊天室程序,包括类的定义、封装、继承与多态。

- 教材章节:第二章 面向对象编程基础4. 多线程技术:介绍多线程编程的概念,分析在聊天室程序中如何实现多用户并发通信。

- 教材章节:第五章 多线程编程5. 聊天室程序设计与实现:指导学生完成聊天室客户端与服务器的编写,实现基本的功能需求。

java课程设计--聊天软件(带源码)(可编辑修改word版)

java课程设计--聊天软件(带源码)(可编辑修改word版)

5. 实验方法与步骤:这个软件从0.1 到1.3 一共13 个版本。

0.1 到0.4 版本为客户端界面设计,第0.5 到1.2 版本为服务器端设计以及客户端与服务器端通信连接的设计实现。

1.3 版为完善之前版本的缺陷并添加登陆界面。

最终版本1.3 版中一共三个类(如图一所示)源代码如下://客户端import java.awt.*;import java.awt.event.*;import java.io.IOException;import .*;import java.io.*;public class ChatClient extends Frame{ Socket s = null;DataOutputStream dos = null;DataInputStream dis = null;private boolean bConnected = false;private static final long serialVersionUID = 1L;TextField tfTxt = new TextField();TextArea taContent = new TextArea();public static void main(String[] args) {// TODO Auto-generated method stubnew Login();}public void launchFrame(){ setLocation(400, 300);this.setSize(300, 300);add(tfTxt, BorderLayout.SOUTH);add(taContent, BorderLayout.NORTH);pack();this.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e){ disconnect();System.exit(0);}});tfTxt.addActionListener(new TFListener());setVisible(true);connect();new Thread(new RecvThead()).start();}public void connect() {try {s = new Socket("127.0.0.1", 8888);dos = new DataOutputStream(s.getOutputStream());dis = new DataInputStream(s.getInputStream());System.out.print("lian jie shang le ");bConnected = true;} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void disconnect() {try {public void run() {try {while (bConnected){ String str;str = dis.readUTF();taContent.setText(taContent.getText()+str+'\n');System.out.print(str);}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}//服务器端import java.io.DataInputStream;import java.io.EOFException;import java.io.IOException;import java.io.*;import .*;import java.util.*;public class ChatServer{ boolean started =false; ServerSocket ss =null;List<Client>clients=new ArrayList<Client>();public static void main(String[] args) {// Socket s=null;// DataInputStream dis =null;new ChatServer().start();}public void start(){ try {ss = new ServerSocket(8888);started = true;} catch (BindException e){ System.out.print("端口使用中!\n");System.out.print("请关闭相关程序重新运行程序!\n");System.exit(0);} catch (IOException e){ e.printStackTrace();}try {while (started) {// oolean bConnected=false;// s=ss.accept();Socket s = ss.accept();Client c = new Client(s);System.out.print("已连接!\n");new Thread(c).start();clients.add(c);}// dis.close();} catch (IOException e){ e.printStackTrace();} finally{ try {ss.close();} catch (IOException e1){ e1.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(Stringstr){ try {dos.writeUTF(str);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void run(){ try {while (bConnected) {String str = dis.readUTF();System.out.print(str + "\n");for (inti=0;i<clients.size();i++){ Client c=clients.get(i);c.send(str);}}} catch (EOFException e){ System.out.print("客户端断开连接!\n");} catch (IOException e) {e.printStackTrace();} finally{ try {dis.close();btnLogin.addActionListener(this);btnExit.addActionListener(this);// P.setBounds(0,0,315,120);// pnlLogin.add(P);pnlLogin.setBackground(Color.WHITE);lblUserName.setBounds(10,125,90,25);txtUserName.setBounds(120,125,180,25);lblPassword.setBounds(10,155,90,25);pwdPassword.setBounds(120,155,180,25);btnLogin.setBounds(20,185,80,25);btnExit.setBounds(220,185,80,25);lblUserName.setForeground(Color.BLACK);lblUserName.setBackground(Color.WHITE);lblPassword.setForeground(Color.BLACK);lblPassword.setBackground(Color.WHITE);pnlLogin.add(lblUserName);pnlLogin.add(txtUserName);pnlLogin.add(lblPassword);pnlLogin.add(pwdPassword);pnlLogin.add(btnLogin);pnlLogin.add(btnExit);setResizable(false);setSize(315,245);setVisible(true);dsSize=toolkit.getScreenSize();setLocation(dsSize.width/2-this.getWidth()/2,dsSize.height/2- this.getHeight()/2);}@Overridepublic void actionPerformed(ActionEvent ae){if(ae.getSource()==btnLogin){String jusername =txtUserName.getText().trim();char[] s = pwdPassword.getPassword();String jpassword = new String(s);if (jusername.equals("") || jpassword.equals(""))}登陆失败登陆成功多个客户端登陆聊天,一个发起聊天在线的全部能收到6.实验总结:这个实验的主要技术是 包中的是socket 使用。

java实训聊天系统报告总结

java实训聊天系统报告总结

java实训聊天系统报告总结在Java实训中,我们成功地设计和实现了一个聊天系统。

该系统具有以下功能:用户注册、登录、加好友、发送消息等。

在设计这个系统之前,我们进行了许多需求分析的工作,确定了系统的具体功能和要求。

然后,我们设计了系统的架构,包括前端界面和后端数据库的设计。

在开发过程中,我们采用了Spring Boot框架,使用了MySQL作为后端数据库。

由于我们的系统需要进行实时通信,因此我们还使用了基于WebSocket的技术。

在实际的开发过程中,我们首先完成了用户注册和登录的功能。

用户可以通过输入用户名和密码进行注册,并在登录页面输入正确的用户名和密码进行登录。

如果登录成功,系统将会跳转到聊天界面。

如果没有注册或者用户名密码输入错误,系统会给出相应的提示信息。

接下来,我们实现了添加好友的功能。

用户可以通过输入好友的用户名来添加好友。

当用户输入好友的用户名并点击添加按钮时,系统会检查数据库中是否存在该用户。

如果存在,则将该用户添加到当前用户的好友列表中;如果不存在,则给出相应的提示信息。

我们实现了发送消息的功能。

用户可以在输入框中输入消息,并点击发送按钮来发送消息。

在点击发送按钮后,用户的好友列表中的用户会收到消息。

用户可以选择查看已发送和已接受的消息。

在整个开发过程中,我们遇到了许多问题,并从中学到了许多经验。

我们学会了如何进行需求分析,如何将需求转化为具体的功能和要求。

我们学会了如何设计系统的架构,并根据架构来进行具体的开发工作。

我们学会了如何解决问题和调试程序,在遇到问题时能够快速找到解决方法。

通过这个实训项目,我们不仅学到了Java语言和Spring Boot框架的相关知识,还学会了团队合作和项目管理的技巧。

我们在与团队成员的合作中学会了沟通和协调的重要性,以及如何高效地分工合作。

在整个项目过程中,我们对实际的软件开发流程有了更深入的了解,提高了我们的编程能力和解决问题的能力。

实验报告java聊天程序

实验报告java聊天程序

实验报告java聊天程序实验报告:Java聊天程序引言:随着互联网的高速发展,聊天已经成为人们生活中不可或缺的一部分。

为了更好地理解和应用Java语言,我们进行了一项关于Java聊天程序的实验。

本实验报告将介绍实验目的、实验环境、实验内容、实验结果以及实验总结等相关内容。

一、实验目的:本实验的主要目的是通过编写Java程序实现一个简单的聊天程序,通过网络连接两个客户端,使客户端之间可以实现文字的交互。

通过实验,我们可以更好地理解网络通信的基本概念和Java语言的网络编程。

二、实验环境:1. 操作系统:Windows 102. 开发工具:Eclipse IDE3. Java版本:Java 84. 网络环境:局域网环境三、实验内容:本实验主要包括三个部分:客户端程序、服务器程序和网络通信。

1. 客户端程序:客户端程序主要负责向服务器发送消息并接收服务器发送的消息。

在客户端程序中,我们使用Java的Socket类进行网络通信,并使用多线程实现客户端的并发访问。

2. 服务器程序:服务器程序主要负责接收客户端发送的消息,并将消息广播给其他连接的客户端。

在服务器程序中,我们使用Java的ServerSocket类进行网络通信,并使用多线程实现服务器的并发处理。

3. 网络通信:通过网络通信,实现客户端和服务器之间的消息传输。

在本实验中,我们使用Java的Socket类和ServerSocket类进行网络通信,并使用TCP/IP协议建立可靠连接。

四、实验步骤:1. 客户端程序编写:首先,我们编写客户端程序。

在客户端程序中,我们创建一个Socket对象,通过该对象与服务器建立连接。

然后,我们使用输入输出流读写数据,并使用多线程实现客户端的并发处理。

2. 服务器程序编写:其次,我们编写服务器程序。

在服务器程序中,我们创建一个ServerSocket对象,通过该对象监听指定端口的连接请求。

当有客户端连接到服务器时,我们创建一个新的线程处理该连接,接收客户端发送的消息并转发给其他连接的客户端。

课程设计qq聊天系统源代码

课程设计qq聊天系统源代码

课程设计qq聊天系统源代码一、课程目标知识目标:1. 让学生掌握QQ聊天系统的基础知识,包括网络通信原理、客户端与服务器间的交互过程。

2. 学习并理解QQ聊天系统源代码的结构和功能,掌握相关编程语法和逻辑。

技能目标:1. 培养学生运用所学知识,独立编写和修改QQ聊天系统源代码的能力。

2. 提高学生的问题解决能力,使其能够分析和解决在开发QQ聊天系统过程中遇到的技术难题。

情感态度价值观目标:1. 激发学生对计算机编程和网络通信的兴趣,培养其探索精神和创新意识。

2. 培养学生的团队协作精神,使其在项目开发过程中学会与他人沟通与协作。

3. 引导学生认识到网络通信技术在社会发展中的重要性,激发其社会责任感和使命感。

课程性质:本课程为实践性较强的课程,以项目驱动的方式进行教学,使学生能够将所学理论知识应用于实际项目中。

学生特点:学生具备一定的编程基础和网络通信知识,对新鲜事物充满好奇心,喜欢动手实践。

教学要求:教师需注重理论与实践相结合,关注学生的个体差异,提供针对性的指导,以提高学生的学习兴趣和自信心。

同时,注重培养学生的团队协作能力和解决问题的能力。

在教学过程中,将课程目标分解为具体的学习成果,以便进行有效的教学设计和评估。

二、教学内容1. 网络通信原理:讲解TCP/IP协议、客户端与服务器模型、端口号等基本概念,为学生编写QQ聊天系统源代码打下理论基础。

2. 编程语言:介绍QQ聊天系统源代码所使用的编程语言(如Java、C#等),复习相关语法知识,强调面向对象编程思想。

3. QQ聊天系统架构:分析QQ聊天系统的整体架构,包括客户端、服务器端的模块划分和功能描述,使学生了解整个系统的运行机制。

4. 源代码解析:详细讲解QQ聊天系统源代码的结构、关键函数和功能模块,指导学生阅读和分析源代码,掌握其工作原理。

5. 编写与调试:教授学生如何编写和修改QQ聊天系统源代码,进行功能拓展和优化,并通过调试工具进行问题排查和修复。

java课程设计qq

java课程设计qq

java课程设计 qq一、课程目标知识目标:1. 让学生掌握Java编程语言中面向对象编程的基本概念,特别是类与对象的关系、封装、继承和多态。

2. 使学生了解并运用QQ聊天软件中的基本功能实现原理,如用户登录、添加好友、发送消息等。

3. 帮助学生理解事件处理机制,学会使用Java编写图形用户界面(GUI)。

技能目标:1. 培养学生运用Java语言设计并实现一个简易QQ聊天软件的能力。

2. 提高学生分析问题、解决问题的能力,使其能够运用所学知识解决实际编程问题。

3. 培养学生团队协作能力,通过分组合作完成课程设计任务。

情感态度价值观目标:1. 激发学生对计算机编程的兴趣,培养其主动学习和探究的精神。

2. 培养学生面对编程难题时,具备勇于尝试、克服困难的精神。

3. 引导学生认识到编程在生活中的实际应用,提高其社会责任感。

本课程针对高年级学生,他们已经具备了一定的Java编程基础。

课程性质为实践性较强的课程设计,要求学生将所学知识运用到实际项目中。

通过分解课程目标为具体学习成果,教师可以更好地进行教学设计和评估,确保学生在完成课程设计任务的同时,达到预定的教学目标。

二、教学内容1. 面向对象编程基础:- 类与对象的关系- 封装、继承和多态- Java异常处理2. Java图形用户界面(GUI)编程:- Swing组件的使用- 事件处理机制- 布局管理器3. 网络编程基础:- Socket编程原理- TCP/IP协议简介- 多线程编程4. 简易QQ聊天软件实现:- 用户登录功能实现- 好友列表管理- 消息发送与接收- 聊天窗口设计教学内容参考教材相关章节,结合课程目标进行选择和组织。

教学大纲安排如下:第1周:面向对象编程基础复习第2周:Java图形用户界面编程第3周:网络编程基础第4周:简易QQ聊天软件功能分析与设计第5周:简易QQ聊天软件实现与调试第6周:课程设计总结与展示教学内容确保科学性和系统性,让学生在实践中掌握Java编程知识,提高编程能力。

基于java的QQ聊天系统毕业设计说明书

基于java的QQ聊天系统毕业设计说明书

基于java的QQ聊天系统第一章.绪论1.1 课题背景随着互联网逐步普及,人们的生活和工作也越来越离不开信息网络的支持,而聊天室是人们最常见,最直接的网上交流的方式。

本聊天系统以聊天交流为主,为广大用户提供一个借助网络进行人际交往的平台,也是网络与现实最贴近的实用型网站。

本文所介绍的网络聊天系统是基于开放的JA V A应用程序开发设计的,其主要特性是能动态、实时的完成信息的传递,且具有高效的交互性,更有效的处理客户请求,易于维护和更新,其运行所需环境及其工作流程和各个功能控件的工作原理将在本文依次介绍,并且文中提供了部分程序源代码。

1.2 课题研究的目的和意义即时通讯系统的最大特点是在网上进行信息的实时交流。

即时通讯系统的发展使得人们可以进行网上社交,获得社会的尊重,实现自我需求,这同时也为了网络即时通讯软件发展的驱动力。

而物质文明的日益发达所带来的副作用,有使得人们习惯与周围的人保持距离。

以致人们更愿意对陌生人敞开心扉。

与传统通讯方式相比,即时通讯系统具有快捷,廉价,隐秘性高的特点,在网络中可以跨年龄,身份,行业,地域的限制,达到人与人,人与信息之间的零交流。

从这点上讲,网络即时通讯的出现改变人们的沟通方式和交友文化,大大拓展了个人生活交流的空间。

1.3 国内外概况目前国内外做聊天系统的很多,产品也是琳琅满目,国内有诸如腾讯QQ与新浪UC网易泡泡等,国外著名的有MSN以及跨平台GAIM等.本人取最具有代表性的QQ和MSN进行了一些研究,为我毕业设计聊天系统做了充分的准备.腾讯无疑使国内即时通讯市场的霸主,自从99年进入即时通讯领域并迅速占领市场之后,其在国内用户数量始终高居榜首,即时近几年面对微软MSN的强大攻势,腾讯QQ的市场占有率依然稳步增长.参考了许多资料,以及自己通过观察腾讯QQ运行时的各种细节.可以确定腾讯QQ是以多服务器提供服务,服务器总控客户端客户端之间UDP直连通信的.并且在两个客户端之间不能建立直接的情况下,才由服务器进行中转通信.第2章.系统设计方案的研究2.1 系统的设计方案聊天系统的设计跟普通网站设计有着许多不同的地方,普通网站设计所考虑的因素,例如,普通网站需要对布局进入大量美化以及动画设计等等,而聊天室只要提供满足访客双方直接实时聊天即可。

java简易qq设计课程设计

java简易qq设计课程设计

java简易qq设计课程设计一、课程目标知识目标:1. 掌握Java面向对象编程的基本概念,包括类、对象、继承、封装等;2. 学会使用Java编写简单的图形用户界面(GUI),并了解事件处理机制;3. 了解网络编程的基本原理,掌握TCP/IP协议,实现简易的客户端与服务器的通信;4. 掌握文件读写操作,实现用户信息的持久化存储。

技能目标:1. 能够运用所学知识,独立设计并实现一个简易的QQ聊天程序;2. 培养问题分析、解决问题的能力,通过编程实践,提高逻辑思维能力;3. 学会使用调试工具,优化程序性能,提高代码质量。

情感态度价值观目标:1. 培养学生积极的学习态度,激发对计算机编程的兴趣和热情;2. 培养学生的团队协作精神,学会在项目中分工合作,共同完成任务;3. 培养学生的创新意识,鼓励尝试新方法解决问题,勇于挑战自我。

课程性质:本课程为信息技术学科的一门实践性课程,旨在让学生在掌握Java 编程基础的前提下,通过实际项目的设计与实现,提高编程能力和实践能力。

学生特点:学生处于高中年级,具备一定的编程基础,对实际项目开发有一定兴趣,喜欢探索新知识,希望通过课程学习,提高自己的编程技能。

教学要求:注重理论与实践相结合,强调学生的动手实践能力,培养学生解决实际问题的能力。

在教学过程中,关注学生的个体差异,提供针对性的指导,确保每位学生都能达到课程目标。

将课程目标分解为具体的学习成果,以便在教学设计和评估中,准确把握学生的学习进度和成果。

二、教学内容1. Java面向对象编程基础:- 类的定义、对象创建、构造方法- 继承、封装、多态性2. Java图形用户界面(GUI)设计:- Swing组件的使用,如JFrame、JButton、JTextField等- 事件处理机制,如addActionListener、鼠标事件等3. 网络编程基础:- 网络通信原理,TCP/IP协议介绍- Socket编程,客户端/服务器通信实现4. 文件读写操作:- File类、InputStream、OutputStream的使用- 用户信息的持久化存储5. 简易QQ设计:- 客户端功能设计:登录、注册、添加好友、发送消息等- 服务器端功能设计:处理客户端请求、转发消息、管理用户信息等6. 项目实践:- 分组进行项目开发,分工合作,完成简易QQ的设计与实现- 使用调试工具,优化程序性能,提高代码质量教学内容根据课程目标进行选择和组织,确保科学性和系统性。

(完整word版)JavaQQ聊天界面实验报告

(完整word版)JavaQQ聊天界面实验报告

Java语言实验报告实验环境:Eclipse 6。

0环境实验目的:1、了解文件和流的概念,字节的输入输出,掌握文件的操作;2、了解网络通信,掌握TCP Socket通信和TCP Socket的工作方式.实验原理:1、采用TCP Socket通信是实现的点对点聊天,ChatServer类提供服务端的TCP的链接服务,SingleTalkClient类与SingleTalkServer类实现客户端与服务端的TCP Socket通信以及两者的图形界面;2、Socket对象用于在服务端和客户端的TCP链接之间进行发送和接受的双向数据通信,从Socket对象中能够获得字节输入流和字节输出流。

实验内容:实现一对一的聊天程序1、分析需求,确定程序主要框架、所需要的编程语言、以及开发环境;2、研究一对一聊天程序的原理及主要功能;3、根据实验要求编写聊天界面及聊天程序;4、完成编码,进行测试;5、完成测试,完善代码.实验步骤:一、创建客户端界面package jiemian;import java。

io。

*;import java。

net。

*;import javax。

swing。

*;import java.awt.event.*;import java。

awt.*;/*** 用户界面SingleTalkClient*/public class SingleTalkClient extends JFrame {private static final long serialVersionUID = 3774711323397279594L;JTextArea mainArea;JTextArea sendArea;ChatClient client;JTextField ipArea;JTextField nameArea;JButton buttonLink;public void setClient(ChatClient client){this。

Java网络QQ聊天室课程

Java网络QQ聊天室课程

完成时间:2010年6月—2010年7月计算机科学系制说明一、课程设计写作框架(仅供参考)摘要目录正文1、基本设计任务及要求、所用仪器设备;2、总体设计方案及主要设计原理;3、实现技术及源程序代码;4、测试及分析;5、结束语(心得体会、改进方向)。

参考文献二、写作要求:课程设计写作要求论点明确、论据充分、说明透彻,语言准确恰当,书面整洁,字迹工整。

课程设计的篇幅本科一般为4000字左右,专科一般为3000字左右。

课程设计任务书及成绩评定摘要通过此项目实训——JAVA聊天室的设计,实践、总结、回顾了网络编程思想以及编程方法,并通过编写程序来掌握Java语言编程技巧,将学习到的知识融会贯通,同时提高调试程序的能力,养成良好的编程习惯,并增强对程序设计整体思路的把握,理论与时间相结合。

本文的主要工作集中在:该课程基于C/S模式,客户机向服务器发聊天请求,服务器应答并能显示客户机发过来的信息。

当用户聊天时,将当前用户名、聊天对象、聊天,内容、聊天语气和是否私聊进行封装,然后与服务器建立Socket 连接,再用对象输出流包装Socket的输出流将聊天信息对象发送给服务器端。

当用户发送聊天信息时,服务端将会收到客户端用Socket传输过来的聊天信息对象,然后将其强制转换为Chat对象,接收用户的聊天信息是由多线程技术实现的,因为客户端必须时时关注更新服务器上是否有最新消息,当每次用户接收到聊天信息后将会开始分析聊天信息然后将适合自己的信息人性化地显示在聊天信息界面上。

关键字:java;QQ聊天室,eclipseJAVA 聊天室课程设计前言:随着计算机网络日新月异的发展,人们的交流方式越来越多,传统的交流方式,如:信件、电报、电话等已经难以满足人们的交流要求,在互联网上即时的和好友取得联系,已经成为当今社会人们主流的联系方式。

因此,两台计算机之间进行即时通讯、发送文件等交流方式已经成为必然潮流。

因此出现了QQ等聊天工具,然而QQ等聊天工具虽然方便、实用,但是,娱乐功能太多,有很多吸引人的娱乐功能,从一定程度上来说,是一种娱乐工具,不能作为用于即时通讯、文件共享的专用工具。

  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、输入输出流的选择也不是很清楚,有可能会产生乱码,其次。

相关文档
最新文档