java聊天小程序课程设计
- 格式:docx
- 大小:24.65 KB
- 文档页数:16
Java聊天系统设计课程设计说明书(源程序)java聊天系统详细设计1引言1.1撰写目的聊天系统详细设计是设计的第三个阶段,这个阶段的主要任务是在聊天概要设计的基础上,对概要设计中产生的功能模块进行过程描述,设计功能模块的内部细节,包括数据结构和算法,为编写源代码提供必要的说明。
概述设计化解了软件系统总体设计问题,包含整体软件系统的结构,功能模块的分割,模块功能和模块间的联系等,详细设计则就是必须化解如何同时实现各个模块的内部功能,及模块设计,具体内容的说道,模块设计就是为已经产生的聊天系统各个子系统设计详尽的算法,但这并不等同于系统同时实现阶段用具体内容语言编码,它只是对同时实现细节搞准确的叙述,这样编码阶段就可以将详尽中对功能同时实现的叙述,轻易译者,转变为用某种程序设计语言写下的程序。
1.2背景根据山东科技大学教学要求,同时实现理论与课堂教学结合的办学理念,培育21世纪高素质人才,校方精心安排了与操作系统课程有关的课程设计。
1.3定义1.项目名称:java聊天系统2.项目明确提出者:山东科技大学3.项目开发者:三个臭皮匠小组4.用户:聊天群5.运行环境:xp,win7,win8unix操作平台6.开发平台:eclipse、java7.eclipse:软件开发工具,j2ee可视化研发平台。
8.java:面向对象研发语言。
1.4参考资料[1]《软件工程实验指导书》清华大学出版社2021[2]王珊,萨师煊编著《数据库系统概论》高等教育出版社2021[3]钱乐秋编著《软件工程》清华大学出版社2021[4]张海藩编著《软件工程导论》清华大学出版社2021[5]汤子瀛编著《计算机操作系统》第三版西安电子科技大学出版社20212.总体设计2.1需求概要(1)用户注册模块:(2)客户端下载模块:(3)用记进占模块:用打开sisi聊天工具,会看到简洁美观的登陆界面,界面是有本聊天工具的log并提示用户输入已经注册成功的账号和密码,输入完成后只需要点击下方的“确认”按钮即可成功登陆本聊天软件。
Java 程序课程设计任务书JAVA 聊天室的系统的设计与开发主要内容:用 JAVA 实现基于C/S 模式的聊天室系统。
聊天室分为服务器端和客户端两部分,服务器端程序主要负责侦听客户端发来的信息,客户端需要登陆到服务器端才可以实现正常的聊天功能。
2.具体要求(包括技术要求等):系统的功能要求:A.服务器端主要功能如下:1.在特定端口上进行侦听,等待客户端连接。
2.用户可以配置服务器端的侦听端口,默认端口为8888 。
3.向已经连接到服务器端的用户发送系统消息。
4.统计在线人数。
5.当停止服务时,断开所有的用户连接。
B.客户端的主要功能如下:1.连接到已经开启聊天服务的服务器端。
2.用户可以配置要连接的服务器端的IP 地址和端口号。
3.用户可以配置连接后显示的用户名。
4.当服务器端开启的话,用户可以随时登录和注销。
5.用户可以向所有人或某一个人发送消息。
学习并掌握一下技术:Java JavaBean等熟练使用一下开发工具:Eclipse, JCreator 等实现系统上诉的功能。
3.进度安排:12 月 28 日~ 12 月 29 日:课程设计选题,查找参考资料12 月 30 日~ 1 月 1 日:完成系统设计1 月2 日~ 1 月 5 日:完成程序代码的编写1 月 6 日:系统测试与完善1 月 7 日:完成课程设计报告,准备答辩主要参考文献:[1]. 张广彬孟红蕊张永宝.Java课程设计(案例精编)[M]. 清华大学出版社.2007 年版摘要在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,例如,国外的ICQ、国内腾讯公司开发的OICQ。
基于 Java 网络编程的强大功能,本次毕业设计使用Java 编写一个聊天系统。
一般来说,聊天工具大多数由客户端程序和服务器程序外加服务器端用于存放客户数据的数据库组成,本系统采用客户机/ 服务器架构模式通过Java 提供的 Soket 类来连接客户机和服务器并使客户机和服务器之间相互通信,由于聊天是多点对多点的而Java 提供的多线程功能用多线程可完成多点对多点的聊天,数据库管理系统用 SQL Server2000 完成并通过 JDBC-ODBC桥访问数据库。
javaweb小程序课程设计一、课程目标知识目标:1. 让学生掌握Java Web开发的基础知识,包括Servlet、JSP和JavaBean的使用;2. 使学生了解Web应用程序的运行原理和HTTP协议的基本概念;3. 帮助学生掌握HTML、CSS和JavaScript等前端技术,实现与后端的交互。
技能目标:1. 培养学生具备独立设计并实现简单Java Web小程序的能力;2. 让学生学会使用常用的Java Web开发工具和调试技巧;3. 提高学生分析问题、解决问题的能力,培养良好的编程习惯。
情感态度价值观目标:1. 培养学生对Java Web开发的兴趣和热情,激发学习积极性;2. 引导学生树立团队协作意识,学会与他人共同解决问题;3. 培养学生严谨、踏实的科学态度,养成良好的学习习惯。
课程性质:本课程为实践性较强的课程,侧重于培养学生的动手能力和实际开发经验。
学生特点:学生具备一定的Java基础,对Web开发感兴趣,但可能缺乏实际项目经验。
教学要求:结合课本内容,采用案例教学、任务驱动等方法,引导学生动手实践,注重理论与实践相结合。
通过本课程的学习,使学生能够达到上述课程目标,为后续深入学习Java Web开发打下坚实基础。
二、教学内容1. Java Web基础- Servlet的生命周期、请求和响应处理- JSP的页面指令、脚本语言、标准标签库- JavaBean的使用及其在Web应用中的作用2. 前端技术- HTML的基本结构、常用标签和属性- CSS的语法、选择器、盒模型和布局- JavaScript的基本语法、事件处理和DOM操作3. 数据库访问- JDBC的使用,连接数据库,执行SQL语句- 数据库连接池技术,提高数据库访问效率- 在Web应用中实现用户登录、数据查询等操作4. 小程序实战- 设计并实现一个简单的博客系统,包括文章发布、评论等功能- 使用前端技术实现页面布局和交互效果- 使用Java Web技术实现后端逻辑,处理用户请求教学内容安排和进度:第1周:Java Web基础,Servlet和JSP的学习第2周:前端技术,HTML、CSS和JavaScript的学习第3周:数据库访问技术,JDBC和连接池的使用第4周:综合实战,设计和开发一个小程序本教学内容根据课程目标制定,注重科学性和系统性。
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聊天室课程设计一、需求分析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)当服务器开启时。
Java程序课程设计任务书JAVA聊天室的系统的设计与开发1.主要内容:用JA V A实现基于C/S模式的聊天室系统。
聊天室分为服务器端和客户端两部分,服务器端程序主要负责侦听客户端发来的信息,客户端需要登陆到服务器端才可以实现正常的聊天功能。
2.具体要求(包括技术要求等):系统的功能要求:A.服务器端主要功能如下:1.在特定端口上进行侦听,等待客户端连接。
2.用户可以配置服务器端的侦听端口,默认端口为8888。
3.向已经连接到服务器端的用户发送系统消息。
4.统计在线人数。
5.当停止服务时,断开所有的用户连接。
B.客户端的主要功能如下:1.连接到已经开启聊天服务的服务器端。
2.用户可以配置要连接的服务器端的IP地址和端口号。
3.用户可以配置连接后显示的用户名。
4.当服务器端开启的话,用户可以随时登录和注销。
5.用户可以向所有人或某一个人发送消息。
学习并掌握一下技术:Java JavaBean 等熟练使用一下开发工具:Eclipse,JCreator 等实现系统上诉的功能。
3.进度安排:12月28日~ 12月29日:课程设计选题,查找参考资料12月30日~ 1月1日:完成系统设计1月2日~ 1月5日:完成程序代码的编写1月6日:系统测试与完善1月7日:完成课程设计报告,准备答辩4.主要参考文献:[1].张广彬孟红蕊张永宝.Java课程设计(案例精编)[M].清华大学出版社.2007年版摘要在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,例如,国外的ICQ、国内腾讯公司开发的OICQ。
基于Java网络编程的强大功能,本次毕业设计使用Java编写一个聊天系统。
一般来说,聊天工具大多数由客户端程序和服务器程序外加服务器端用于存放客户数据的数据库组成,本系统采用客户机/服务器架构模式通过Java提供的Soket类来连接客户机和服务器并使客户机和服务器之间相互通信,由于聊天是多点对多点的而Java提供的多线程功能用多线程可完成多点对多点的聊天,数据库管理系统用SQL Server2000完成并通过JDBC-ODBC桥访问数据库。
计算机网络课程设计报告学生姓名学号班级指导教师设计时间目录第一章系统描述1.1设计目的 (3)1.2系统设计任务 (3)1.3系统设计分析 (3)1.4系统功能分析 (4)第二章功能模块结构2.1模块划分 (5)2.2模块结构图 (5)2.1模块功能 (5)第三章模块算法实现3.1 服务器实现 (6)3.2 客户端实现 (9)第四章运行结果 (13)第五章课程设计总结 (17)第六章附录6.1 参考文献 (19)6.2 源代码 (19)第一章系统描述1.1设计目的1.学习网络编程的知识,掌握网络编程的方法。
2.进一步掌握编程思想与编程技巧,做到模块化程序设计,3. 强化语言学习,尤其是Java的图形界面与多线程,需反复练习,熟练掌握。
1.2系统设计任务聊天室软件的设计与开发:基本要求可以完成群聊、私人聊天,实时发送和显示聊天信息,完成好友列表;进一步要求带表情,附件发送,聊天信息的加密传送,设置黑名单等。
学习通信编程Socket接口编程,使用TCP或UDP接口完成信息传送,利用多线程技术实现服务器端的多个TCP连接的建立。
1.3系统设计分析一.实现网络聊天室编程,关键在于Socket通信,程序的功能都是在Socket 的基础上一层一层增加的。
实现Socket通信的基本方法为以下4个步骤。
(1)在客户端与服务器端创建相应的ServerSockot/Socket实例。
(2)打开连接到Socket的输入输出流(3)利用输入输出流,按照一定的协议(TCP协议)对Socket进行读写操作(4)关闭输入输出流和Socket我们要实现的功能都是在第3步对Socket的输入输出流做相应的操作二.因为是多客户端,所以必须用线程进行控制,不同的处理线程为不同的客户服务,主线程只负责循环等待,处理线程负责网络连接,接受客户输入的信息,再做相应的处理。
1.4系统功能分析本系统可以通过网络进行聊天,采用客户端服务器模式,所以程序简介清晰易懂,而且用户都是在客户端进行活动,方便对用户的管理,也使得程序运行与差错简单起来。
《面向对象程序设计课程设计》报告基于C/S结构的网络聊天室姓名:学院:信息技术学院专业:班级:学号:Eastern Liaoning University目录目录 (1)一、需求分析 (2)二、系统设计 (3)1、服务器端功能 (3)2、客户端功能 (3)3、通讯流程 (4)三、系统实现 (5)(一)总体设计 (5)1.服务器端设计 (5)2.客户端设计 (5)(二)代码思路 (6)1.定义服务端类Serverly继承Frame类 (6)2.定义Cliently类继承Frame类 (6)四.具体设计 (8)五、系统测试 (12)六、总结 (13)一、需求分析电信服务离不开网络编程,资料的传输离不开网络编程,还有很多很多,人们的生活已经离不开网络。
为了能迎合人们的需要,本小组决定利用java stocker编程开发一种可以在多操作系统中运行的聊天室软件,以满足人们业余生活的需要。
本软件采用Client/Server结构,将聊天系统划分为两个子系统:客户端子系统,服务器端子系统。
网络编程中有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。
目前较为流行的网络编程模型是客户机/服务器结构。
即通信双方一方作为服务器等待客户提出请求并予以响应。
客户则在需要服务时向服务器提出申请。
服务器一般作为守护进程始终运行,监听网络端口,一旦有客户请求,就会启动一个服务进程来响应该客户,同时自己继续监听服务端口,使后来的客户也能及时得到服务。
因此,本项目即设计一个网络聊天程序,并根据这个程序说明TCP连接的建立,套接字Socket的使用,以及端口等问题,实现基于C/S模式的聊天室程序。
聊天室共分为服务器端和客户端两部分,服务器端程序主要负责侦听客户端发来的消息,客户端需要登录到服务器端才可以实现正常的聊天功能。
二、系统设计1、服务器端功能◆在特定端口上进行侦听,等待客户端连接。
java_课程设计_聊天窗口JAVA课程设计----------聊天窗口姓名:学号:班级:计科2老师:赵宏宇设计了一个简单的聊天室程序,用于实现聊天室的基本功能,分为了客户端和服务器端,服务器端可以接收多个连接,客户端可以连接服务器。
客户端发送消息给服务器端,服务器接收消息,转发给所有的客户。
一、源程序代码服务器端源代码,ServerTest.javaimport java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.DataInput;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import .ServerSocket;import .Socket;import java.util.Enumeration;import java.util.Vector;import com.sun.corba.se.spi.activation.ServerHeldDown;public class ServerTest {public ServerTest(int port) throws IOException{ServerSocket server=new ServerSocket(port);while(true){Socket conn=server.accept();DataInputStream inputStream = new DataInputStream(conn.getInputStream());String who=inputStream.readUTF();System.out.print("Clinet"+"(IP"+conn.getInetAddress()+")"+ who+"enter!"+"\n");ServerHander cn=new ServerHander(who,conn);cn.start();}}public static void main(String[] args)throws IOException {new ServerTest(9001);// TODO Auto-generated method stub}}class ServerHander extends Thread{Socket socket;DataInputStream in;DataOutputStream out;String who;protected static Vectorclientlist=new Vector();public ServerHander(String name,Socket socket)throws IOExceptionthis.who=name;this.socket=socket;in=new DataInputStream(new BufferedInputStream(socket.getInputStream()));out=new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));}public void run(){try{clientlist.addElement(this);sendallclient("欢迎"+who+"进入聊天室");while(true){String msg=in.readUTF();sendallclient(who+"说:"+msg);}}catch(IOException e){System.out.println("Client exit or error.");}clientlist.removeElement(this);sendallclient(who+"退出!");try{socket.close();}catch (IOException ex)System.out.println("Connection has been closed");}}protected static void sendallclient(String msg){synchronized (clientlist) {Enumerationallclients=clientlist.elements();while(allclients.hasMoreElements()){ServerHander serh=(ServerHander)allclients.nextElement(); try{serh.out.writeUTF(msg);serh.out.flush();}catch(IOException exc){serh.interrupt();}}}}}客户端源程序,ClientTest.javaimport java.awt.BorderLayout;import java.awt.Frame;import java.awt.TextArea;import java.awt.TextField;import java.awt.event.ActionListener;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.BufferedReader;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.io.InputStreamReader;import .Socket;public class ClientT est {public ServiceFrame sf;private Socket csocket;private DataInputStream in;private DataOutputStream out;public static void main(String[] args) {// TODO Auto-generated method stubString who="";BufferedReader in=new BufferedReader(new InputStreamReader(System.in));System.out.print("请输入你的名字");try{who=in.readLine().trim();}catch(IOException e){e.printStackTrace();}new ClientTest(who,"127.0.0.1",9001);}public ClientTest(String who,String server,int port){sf=new ServiceFrame("客户端聊天窗口");sf.sendFD.addKeyListener(new ActListener(this,sf));sf.addWindowListener(new ExitListener(this));try{csocket=new Socket(server,port);in=new DataInputStream(new BufferedInputStream(csocket.getInputStream()));out=new DataOutputStream(new BufferedOutputStream(csocket.getOutputStream()));out.writeUTF(who);out.flush();while(true){sf.showTA.append("--"+in.readUTF()+"\n");}}catch(Exception e){System.out.println("Server error!");this.close();System.exit(0);}}protected void send(String msg){try{out.writeUTF(msg);out.flush();}catch(IOException e){}}protected void close(){try{sf.dispose();out.close();in.close();}catch(IOException ex){}}}class ServiceFrame extends Frame {protected TextArea showTA; protected TextField sendFD;public ServiceFrame(String winnm) {super(winnm);setLayout(new BorderLayout());add("North",showTA=new TextArea()); showTA.setEditable(false);add("South",sendFD=new TextField()); pack();show();sendFD.requestFocus();}}class ActListener extends KeyAdapter{ClientTest client;ServiceFrame sframe;public ActListener(ClientTest c,ServiceFrame sf) {client=c;sframe=sf;}public void keyPressed(KeyEvent e){if(e.getKeyCode()==KeyEvent.VK_ENTER){ client.send(sframe.sendFD.getText()); sframe.sendFD.setText("");}}}class ExitListener extends WindowAdapter {ClientTest client;public ExitListener(ClientTest c){client=c;}public void windowClosing(WindowEvent e) {client.close();System.exit(0);}}二、运行结果截图先运行服务器端,在运行客户端。
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)当服务器开启时。
Java语言程序设计 课程设计 题 目 聊天小程序 (socket编程+多线程) 学 院 商学院 专 业 信息管理与信息系统 班 级 信息111 学 号 8 学生姓名 张语轩 指导教师 余法红 编写日期 目录 一、 需求分析 ............................................ 1 二、 系统概述 ............................................ 2 三、 系统运行环境 ........................................ 3 四、 功能需求描述 ........................................ 3 五、 总体设计 ............................................ 4 六、 系统模块结构图 ...................................... 4 七、 程序模块设计(程序代码设计与分析、运行结果) .......... 4 八、 设计体会 ........................................... 15 九、 参考文献 ........................................... 15 一、 需求分析 当今主流的聊天工具有QQ,UC,MSN Messenger等,国内最热门的当属QQ,腾讯QQ(OICQ)是由深圳市腾讯计算机系统公司开发的,基于Internet的即时聊天工具。您可以使用QQ和好友用户进行交流,信息即时发送,即时回复,收发及时、功能全面。此外QQ还具有BP机网上寻呼、聊天室、传输文件、语音邮件、手机短讯服务等功能,QQ不仅仅是虚拟的网络寻呼机,更可与传统的无线寻呼网、GSM移动电话的短消息系统互联,目前QQ和全国多家寻呼台、移动通信公司有业务合作。是国内不可多得的中文网络寻呼机。QQ支持显示朋友在线信息、即时传送信息、即时交谈、即时发送文件和网址。QQ可以在Win95/98/NT/2000操作系统下运行,是十分灵活的网络寻呼工具。它会自动检查您是否已联网,如果您的电脑已连入Internet,可以搜索网友、显示在线网友,可以根据QQ号、昵称、姓名、email地址等关键词来查找,找到后可加入到通讯录中。当您的通讯录中的网友在线时,QQ中朋友的头像就会显示在线,根据提示就可以发送信息,如果对方登记了寻呼机或开通了GSM手机短消息,即使离线了,您也可及时将信息传递给您的好友。 虽然以上这些软件是免费的,并且功能越来越强大。但是它们的唯一的不足就是必须要联网或者下载到它们的服务端,要不然是没法脱离Intenet使用的。为了能在一个没有连接到Intenet的局域网使用聊天工具,那就必须要有服务器端。 本系统就是包括服务器端与客户端,可以在局域网聊天的一个工具。 二、 系统概述 我们实现的是局域网中的聊天功能,运行服务程序后,服务器创建成功,然后使服务器对某一个设定的端口处于监听状态,当有客户端请求建立连接时,服务器就可接受请求,建立连接!这样服务器和客户端就可相互发送消息,实现聊天功能! 系统的功能要求: A.服务器端主要功能如下: 1.在特定端口上进行侦听,等待客户端连接。 2.用户可以配置服务器端的侦听端口,默认端口为8888。 3.向已经连接到服务器端的用户发送系统消息。 4.统计在线人数。 5.当停止服务时,断开所有的用户连接。 B.客户端的主要功能如下: 1.连接到已经开启聊天服务的服务器端。 2.用户可以配置要连接的服务器端的IP地址和端口号。 3.用户可以配置连接后显示的用户名。 4.当服务器端开启的话,用户可以随时登录和注销。 5.用户可以向所有人或某一个人发送消息。 三、 系统运行环境 本程序基于java和Eclipse开发环境,可以在一般的装有windows系统的主机上运行。 Eclipse是一个开放源代码的软件开发项目,专注于为高度集成的工具开发提供一个全功能的、具有商业品质的工业平台。它主要由Eclipse项目、Eclipse工具项目和Eclipse技术项目三个项目组成,具体包括四个部分组成——Eclipse Platform、JDT、CDT和PDE。JDT支持Java开发、CDT支持C开发、PDE用来支持插件开发,Eclipse Platform则是一个开放的可扩展IDE,提供了一个通用的开发平台。它提供建造块和构造并运行集成软件开发工具的基础。 四、 功能需求描述 本系统针对局域网进行联机聊天。聊天室分为服务器端和客户端两部分,服务器端程序主要负责侦听客户端发来的信息,客户端需要登陆到服务器端才可以实现正常的聊天功能。本系统主要实现如下功能:其界面主要采用了包,包以及包等。程序实现了聊天室的基本功能,其中有: 1、启动服务器。 2、进入客户端界面。 3、登录聊天室。 4、发送信息(实现按回车键发送消息)。 5、关闭服务器。 服务器: 在特定端口上进行侦听,等待客户端连接。 向已经连接到服务器端的用户发送系统消息。 当停止服务时,断开所有的用户连接。 系统运行稳定、安全可靠。 一台主机只能启动一个服务器。 客户端: 连接到已经开启聊天服务的服务器端。 当服务器端开启后,用户可以发表聊天信息。 用户可以向所有人或某一个人发送消息。 系统运行稳定、安全可靠。 五、 总体设计 聊天系统的设计跟普通网站设计有着许多不同的地方,普通网站设计所考虑的因素,例如,普通网站需要对布局进入大量美化以及动画设计等等,而聊天室只要提供满足访客双方直接实时聊天即可。因此,在设计聊天系统的过程中,必须要考虑好以下几个设计要点: 在Internet上的聊天程序一般都是以服务器提供服务端连接响应,使用者通过客户端程序登录到服务器,就可以与登录在同一服务器上的用户交谈,这是一个面向连接的通信过程。因此,程序要在TCP/IP环境下,实现服务器端和客户端两部分程序。 1.首先通过继承JFrame类构造服务器界面。 2.设计客户端程序使其能够完成正常的通信功能 3.设计侦听程序,使其显示登录的ip地址端口号,以及用户昵称,通过侦听按钮可以调用客户端程序,实现聊天功能。 六、 系统模块结构图 主要功能框架如下图所示:
七、 程序模块设计(程序代码设计与分析、运行结果) 代码: (1) package chat; import .*; public class ActionProcess implements Runnable {
下线通服务器 连接服服务器上线通发送消退 出 群 聊 私 聊 用户发送连接退 出
客户端 服务器 客户端A 客户端E 客户端D
客户端C 客户端B private ChatClient client; String name=""; String sendtoname=""; String sendtoID; String filename=""; String filepath=""; public ActionProcess(ChatClient client) { =client; } public void action(ActionEvent e)throws Exception{ if()== { try { else { String addr=("请输入服务器IP:"); InetAddress address=(addr); InetSocketAddress socketAddress=new InetSocketAddress(address,5555); =new Thread(this); } } catch(IOException ee){} } if()== { try { filesendServer filesendserver=new filesendServer(); (); } catch (Exception ee) { (); } } if()=={ try { filesendClient filesendclient=new filesendClient(); (); }catch (Exception ee){} } if()== { try { } catch (IOException e1) { (); } (0); } if ("表情")) { em = ""; } else { em += "着"; } if()== { if(s!=null) { try { } catch(IOException e1){} } } } if()== { sendtoID=("请输入对方ID:"); sendtoname=("请输入对方姓名:"); if(s!=null) { try { } catch(IOException e1){} } } } } public void run() { String s=null; while(true) { try { } catch(IOException e) { try