JAVA课程设计实验资料报告材料 “聊天室”资料报告材料

合集下载

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课程设计报告__利用java实现简单聊天室(可编辑)

java课程设计报告_-_利用JAVA实现简单聊天室利用JAVA实现简单聊天室1.课程设计目的在当今的信息时代,越来越多的聊天工具被应用,Java语言是当今流行的网络编程语言,它具有面向对象、与平台无关、安全、多线程等特点。

使用Java 语言不仅可以实现大型企业级的分布式应用系统,还能够为小型的、嵌入式设备进行应用程序的开发Java语言的重要概念及其面向对象的特性,锻炼我们熟练的应用面向对象的思想和设计方法解决实际问题的能力,开设了Java程序设计课程设计。

此次课程设计的题目为简单的聊天室,通过做巩固所学Java语言基本知识,增进Java语言编辑基本功,掌握JDK、JCreator等开发工具的运用,拓宽常用类库的应用。

使我们通过该教学环节与手段,把所学课程及相关知识加以融会贯通,全面掌握Java语言的编程思想及面向对象程序设计的方法,为今后从事实际工作打下坚实的基础。

2.设计方案论证2.1设计思路Java是一种简单的,面对象的,分布式的,解释的,键壮的安全的,结构中立的,可移植的,性能很优异的多线程的,动态的语言Java去掉了C++语言的许多功能,如:指针运算、结构、typedefs、#define让Java的语言功能很精炼,并增加了一些很有用的功能,如自动收集碎片。

这将减少平常出错的50%。

而且,Java很小,整个解释器只需215K的RAM。

Java简单聊天室,它是图形界面、线程、流与文件等技术的综合应用其界面主要采用了包程序实现了的基本功能有:Pentium 2.8GHz以上内存:256MB以上硬盘空间:80G以上操作系统:Windows XP运行环境:JDK,JCreator 2.5 程序功能图及程序相关说明主功能框图图1 程序基本框图表1 聊天室基本功能表序号文件名主要功能1ServerHost被服务器调用2Client显示聊天室3ClientUser被客户端调用4LogIn注册登陆5Objecting连接服务器6Server启动服务器程序代码是说明程序中引入的包:package Chat;import .*;import java.awt.*;import t.*;import javax.swing.*;import java.util.*;import java.io.*;(1)服务器端代码中用户自定义类:类名:Server作用:服务器启动继承的接口名:ActionListenerpublic class Server implements ActionListener定义的对象:count //记录点机关闭按钮次数2次关闭soconly //只有SOCKET,用于群发sockets //所有客户的SOCKETsocket_thread //Socket所在的线乘,用于退出;frame // 定义主窗体panel//定义面板start,stop //启动和停止按钮主要成员方法:public void center //定义小程序查看器的位置public void actionPerformed //定义处理异常机制定义子类:serverRun,Details继承的父类名:Threadclass serverRun extends Thread //启线乘用于接收连入的Socket class Details extends Thread //具体处理消息的线乘,只管发送消息创建一个ServerSocket 对象,用于接受指定端口客户端的信息ServerSocket server new ServerSocket "1234" ;接受请求时候,通过accept 方法,得到一个socket对象。

Java聊天室程序设计报告

Java聊天室程序设计报告

《Java之聊天室制作》总结报告姓名 __赵其国___________________学号 __2_____________班级 __嵌入式一班__ _____________二〇一二年十二月二十日一,设计目的为了更好的巩固输入输出流,窗体设计,多线程运用,网络通信设计方面的知识。

把所学的课程及相关知识加以融会贯通。

二,设计内容设计的聊天室能实现用户登录,显示登录用户列表,以及发送聊天信息和显示聊天信息的功能。

并可以选择接收信息的用户进行单发或群发的功能,运行程序,登录服务器后,可以从列表中选择单个或多个用户进行聊天,它是图形界面,线程,流和文件系统等技术的综合使用。

三,概要设计实现的功能:1,启动服务器端,接收客户端发来的信息,并在服务器端窗体显示客户端聊天信息,再吧信息返给在线用户,窗体背景色为粉色2,启动客户端窗体,窗体背景色为粉色3,用户名编辑框输入用户名,设置字体显红色,单击登录按钮,在显示在线用户列表内显示用户名,同时用户名编辑框不能编辑4,发送编辑框输入发送内容,单击发送按钮,启动输出流,把信息发送出去,同时把发出的信息追加到聊天内容文本域内,显示用户名,时间和发送内容。

5,单击退出按钮,运用File类和JfileChooser类实现聊天信息的保存6,聊天信息文本域,在线用户显示域和发送信息的文本域加了滚动条,其中聊天信息文本域,发送信息的文本域的文字能自动换行。

7,别的客户端发来信息是通过输入流读取信息,并截取发来信息的用户名及信息,用户名加到在线用户列表上显示在线,信息追加到聊天内容文本域内,显示用户名,时间和发送内容。

功能不足之处:1,保存聊天信息保存为text格式的有黑块。

保存为Doc格式的要转码不能直接打开2,用户在线显示,只能在用户发送信息时别的用户才能得到在线的用户名,然后再加到在线用户列表中,显示用户在线。

3,聊天室只适合群聊,没有实现技能群聊又能和单个人聊天的功能4,用户输出“退出”后在线用户列表中就会把用户删除,不过没有实现没找到错误出在哪里。

java课程设计实验报告样例(一)

java课程设计实验报告样例(一)

java课程设计实验报告样例(一)Java课程设计实验报告样例引言:本篇实验报告主要介绍Java课程设计中所涉及的实验内容、实验过程及实验结果,旨在帮助同学们更好地理解Java编程的基本知识和应用。

一、实验内容:本实验的具体任务是编写一个java程序,实现对一个文本文件中的单词进行统计,包括出现次数、平均长度、以及排序输出出现频率较高的单词。

其中,单词包含字母和数字,大小写敏感,在解析时必须分离出来。

二、实验过程:在编写程序之前,我们首先要了解实验要求及限制,才能确定需要使用什么类型的数据结构、算法和方法等。

接着,我们通过分析题目要求,将问题划分为三部分:分离单词、统计出现次数、以及排序输出。

根据这样的思路,我们开发了如下的实验流程图:[IMG]file:///C:/Users/Administrator/AppData/Local/Temp/msohtm lclip1/01/clip_image002.png[/IMG]具体实现细节如下:1、读取文件,使用StringTokenizer类将文件中的每个单词分离出来;2、定义一个HashMap,以单词作为键值,单词出现次数为value,并依次统计每个单词出现次数;3、遍历HashMap,计算平均单词长度,并保存出现次数较高的单词及其出现次数,同时将HashMap重新排序输出。

三、实验结果:通过我们这样的一个实验流程,我们得到了:[IMG]file:///C:/Users/Administrator/AppData/Local/Temp/msohtm lclip1/01/clip_image004.png[/IMG]分析如下:1、统计了单词总数、平均长度,并输出;2、按出现次数由高到低输出出现频率较高的单词及其出现次数。

四、思考和总结:通过这次实验,我深刻地认识到了实践和理论的重要性,正如听取课程学习Java,与实际操作大有不同一样,是因为它们有不同的目的和方法。

java课程设计报告__利用java实现简单聊天室(可编辑)

java课程设计报告__利用java实现简单聊天室(可编辑)

java课程设计报告_-_利用JAVA实现简单聊天室利用JAVA实现简单聊天室1.课程设计目的在当今的信息时代,越来越多的聊天工具被应用,Java语言是当今流行的网络编程语言,它具有面向对象、与平台无关、安全、多线程等特点。

使用Java 语言不仅可以实现大型企业级的分布式应用系统,还能够为小型的、嵌入式设备进行应用程序的开发Java语言的重要概念及其面向对象的特性,锻炼我们熟练的应用面向对象的思想和设计方法解决实际问题的能力,开设了Java程序设计课程设计。

此次课程设计的题目为简单的聊天室,通过做巩固所学Java语言基本知识,增进Java语言编辑基本功,掌握JDK、JCreator等开发工具的运用,拓宽常用类库的应用。

使我们通过该教学环节与手段,把所学课程及相关知识加以融会贯通,全面掌握Java语言的编程思想及面向对象程序设计的方法,为今后从事实际工作打下坚实的基础。

2.设计方案论证2.1设计思路Java是一种简单的,面对象的,分布式的,解释的,键壮的安全的,结构中立的,可移植的,性能很优异的多线程的,动态的语言Java去掉了C++语言的许多功能,如:指针运算、结构、typedefs、#define让Java的语言功能很精炼,并增加了一些很有用的功能,如自动收集碎片。

这将减少平常出错的50%。

而且,Java很小,整个解释器只需215K的RAM。

Java简单聊天室,它是图形界面、线程、流与文件等技术的综合应用其界面主要采用了包程序实现了的基本功能有:Pentium 2.8GHz以上内存:256MB以上硬盘空间:80G以上操作系统:Windows XP运行环境:JDK,JCreator 2.5 程序功能图及程序相关说明主功能框图图1 程序基本框图表1 聊天室基本功能表序号文件名主要功能1ServerHost被服务器调用2Client显示聊天室3ClientUser被客户端调用4LogIn注册登陆5Objecting连接服务器6Server启动服务器程序代码是说明程序中引入的包:package Chat;import .*;import java.awt.*;import t.*;import javax.swing.*;import java.util.*;import java.io.*;(1)服务器端代码中用户自定义类:类名:Server作用:服务器启动继承的接口名:ActionListenerpublic class Server implements ActionListener定义的对象:count //记录点机关闭按钮次数2次关闭soconly //只有SOCKET,用于群发sockets //所有客户的SOCKETsocket_thread //Socket所在的线乘,用于退出;frame // 定义主窗体panel//定义面板start,stop //启动和停止按钮主要成员方法:public void center //定义小程序查看器的位置public void actionPerformed //定义处理异常机制定义子类:serverRun,Details继承的父类名:Threadclass serverRun extends Thread //启线乘用于接收连入的Socket class Details extends Thread //具体处理消息的线乘,只管发送消息创建一个ServerSocket 对象,用于接受指定端口客户端的信息ServerSocket server new ServerSocket "1234" ;接受请求时候,通过accept 方法,得到一个socket对象。

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聊天室系统程序设计实验报告

Java聊天室系统程序设计实验报告院(系):信息与通信工程系专业:计算机应用技术班级:学号:姓名:指导老师:2013/6/8目录第一部分:系统设计总述............................................................................1.设计目的:......................................................................................2.设计总体要求:..................................................................................3.实现目的:...................................................................................... 第二部分:系统需求分析............................................................................1.系统任务描述....................................................................................2.系统功能分析....................................................................................3.系统可行性分析.................................................................................. 第三部分:系统设计................................................................................1.系统总体结构设计................................................................................2.系统主体的处理流程..............................................................................3.系统流程逻辑.................................................................................... 第四部分:代码分析................................................................................1.服务器端部分代码................................................................................2.客户端部分代码.................................................................................. 第五部分:系统的具体实现..........................................................................界面设计.......................................................................................... 第六部分:小结.................................................................................... 第七部分:参考文献................................................................................ 第一部分:系统设计总述1.设计目的:1.在开发技术和过程中,能够充分学习和使用JAVA的技术,进一步培养学生面向对象程序设计的思想,加深对面向对象程序设计特性的理解。

java网络聊天室课程设计报告(内附代码)

课程设计网络聊天室院(系) 别信电学院班级计算102学号姓名指导教师时间 2013-4-18—2013-5-10 课程设计任务书题目网络聊天室课程设计系 (部) 信电学院专业计算机科学与技术班级计算102学生姓名学号4 月 18 日至5 月 10 日共 4 周指导教师(签字)系主任(签字)年月日成绩评定表目录课程设计概述 (3)1.1问题描述 (3)1.2功能需求分析 (3)1.3环境需求分析 (3)学生信息管理系统软件总体设计 (4)2.1整体思路 (4)2.2总体设计流程图 (5)学生信息管理软件详细设计 (6)3.1.界面设计 (6)3.2通信功能实现方法 (9)参考文献 (45)摘要私達の実践の能力を高めるため、学んだ知識を運用することができて行って更に創造して、学校は特に2週間手配して、私達にVisual C++の課程の設計の実習を行わせます.このファイルの詳しい説明はVisual C++6.0環境の下で、1つのソフトウェアの過程を設計して、このソフトウェアは各種のデータの個数を統計したのです。

このソフトウェアの機能は、ユーザーは1段の文字を入力して、ソフトウェアは文字の中の各類のデータの数を記録して、英文のデータの数、数字のデータの数、空欄のデータの数とそれのタイプのデータの数を含んで、そしてそれらを明らかに示します.以下、課程を通して説明を設計して、データはソフトウェアの説明を統計して、プログラムは説明を調整して、総括などの方面を開発して、詳しくこのプログラムの製作の過程を説明して、作用、各種の実行することができる操作.关键字:データの統計,VC++6.0, ヘッドファイル课程设计概述1.1问题描述`随着计算机网络日新月异的发展,人们的交流方式越来越多,传统的交流方式,如:信件、电报、电话等已经难以满足人们的交流要求,在互联网上即时的和好友取得联系,已经成为当今社会人们主流的联系方式。

JAVA实训报告--聊天室

《Java实训》设计报告电子信息工程学院专业:软件技术班级:1班实训:聊天室系统总体设计1、设计思路聊天系统的设计跟普通网站设计有着许多不同的地方,普通网站设计所考虑的因素,例如,普通网站需要对布局进入大量美化以及动画设计等等,而聊天室只要提供满足访客双方直接实时聊天即可。

因此,在设计聊天系统的过程中,必须要考虑好以下几个设计要点:在Internet上的聊天程序一般都是以服务器提供服务端连接响应,使用者通过客户端程序登录到服务器,就可以与登录在同一服务器上的用户交谈,这是一个面向连接的通信过程。

因此,程序要在TCP/IP环境下,实现服务器端和客户端两部分程序。

1.首先通过继承JFrame类构造服务器界面。

2.设计客户端程序使其能够完成正常的通信功能。

3.设计监听程序,使其显示登录的ip地址端口号,以及用户昵称,通过侦听按钮可以调用客户端程序,实现聊天功能。

2、各个模块详细的功能描述。

1、服务器端功能描述:启动服务器端。

2、客户端功能描述:启动客户端;显示登录昵称:显示聊天记录:发送信息;退出聊天室。

系统详细设计1、界面设计主要由类ChatRoom来实现,界面实际总体如下:输入昵称的文本框,输入IP地址的文本框以及输入端口的文本框;连接的按钮;退出按钮;接受消息的文本域;发送消息文本框;发送按钮。

项目设计在设计聊天室时,编写3个Java源文件:Client.java、Frame1.java、ServerThread.java;分别放在两个包中,一个是client,放Client.java、Frame1.java;一个是server,放ServerThread.java;聊天室除了上述Java源文件所给出的类外,还需要Java系统提供的一些重要类,如JButton,JTextField等。

下面是Java源文件的总体设计。

Client(主类)客户端Client类负责创建聊天室客户端的主窗口,该类含有main方法,计算器从该类开始执行。

JAVA课程设计实验报告-“聊天室”报告

网上查阅资料
第二章 聊天室的设计
2.1聊天室的粗略设计分析
聊天系统平台应有两个部分组成:服务端和客户端。服务端主要完成用户信息的存储、客户端命令的接受与响应以及发送系统消息、信息转发、踢人等服务端应有的功能。客户端主要完成聊天信息的发送与接受、登录、注销等功能。
此c/s系统使用的是TCP/IP协议,应用了如下通讯模式:
如果用户名和密码正确的话,则登录聊天室主界面;如果已经在线,则输出已经在线;否则输出用户名和密码错误,需要重新登录或者注册。
在线用户列表
用户登录之后,需要知道系统中,有哪些用户在线,这样可以方便用户选择与个别用户私聊和传送文件,也可以进行公聊。
用户公聊
用户输入的用户名和密码都正确后,则进入聊天室。聊天主界面主要由四大版块组成:公聊的聊天信息、在线用户列表、好友列表,系统消息和聊天的一些操作。
1.2聊天室的基本功能-------------------------------------------------------------3
1.3设计所用参考资料-------------------------------------------------------------6
第二章 聊天室的设计-------------------------------------------6
由于Client使用了流套接字,所以服务程序也要使用流套接字。这就要创建一个ServerSocket对象,接下来服务程序进入无限循环之中,无限循环从调用ServerSocket的accept()方法开始,在调用开始后accept()方法将导致调用线程阻塞直到连接建立。在建立连接后accept()返回一个最近创建的Socket对象,该Socket对象绑定了客户程序的IP地址或端口号。由于存在单个服务程序与多个客户程序通讯的可能,服务程序循环检测是否有客户连接到服务器上,如果有,则创建一个线程来服务这个客户,以此完成对客户端的监听。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

中南大学《面向对象》课程设计题目“聊天室”课程设计(java语言)学生学生学号专业班级指导教师完成时间目录第一章聊天室的描述-------------------------------------------31.1聊天室的设计要求-------------------------------------------------------------3 1.2聊天室的基本功能-------------------------------------------------------------3 1.3设计所用参考资料-------------------------------------------------------------6第二章聊天室的设计-------------------------------------------62.1聊天室的粗略设计分析-------------------------------------------------------6 2.2聊天室的具体设计分析-------------------------------------------------------7第三章聊天室的实现-------------------------------------------103.1聊天室所使用的类及功能的实现-----------------------------------------10 第四章聊天室的运行-------------------------------------------30第五章课程设计总结---------------------------------------------31 5.1开发中所遇到的问题-----------------------------------------------------------31 5.2问题分析与解决方法-----------------------------------------------------------32 5.3经验与教训------------------------------------------------------------------------32第一章聊天室的描述1 .1聊天室的设要求当今社会,网络技术越来越发展,可以说,二十一世纪就是网络的世纪。

网络迅猛发展,势不可挡。

为了实现资源共享,各式各样的发展迅速,各种各样的聊天工具不断更新。

某公司希望通过一个聊天工具加强员工和客户之间的沟通和交流。

所以制作一个聊天室势在必行。

为了实现一个更好的网络交互平台,各用户之间能够实时方便的传递信息,按照用户对系统的要求不同,可以在聊天室里实现公共聊天,也可以邀几个私交好友私聊,同时提供了两个用户之间能够传送文件。

本系统是基于方便用户聊天,传递信息,共享资源,所以系统的功能主要是从以上几个模块着手。

本项目主要是利用JA V A语言制作一个聊天室,采用的是客户/服务器。

二层的C/S结构是指以单一的服务器和局域网为核心,能通过客户端与用户进行直接对话。

主要有二大功能:一是它用于检查用户从键盘等输入的数据,显示应用输出的数据。

为使用户能直观地进行操作,一般要使用图形用户接口(GUI),操作简单、易学易用。

在变更用户接口时,只需改写显示控制和数据检查程序,而不影响其他。

检查的容也只限于数据的形式和值的围,不包括有关业务本身的处理逻辑。

典型的C/S结构有以下特点:1、服务器负责数据管理及程序处理。

2、客户机负责界面描述和界面显示。

3、客户机向服务器提出处理要求。

4、服务器响应将处理结果返回客户机。

5、使网络数据流量最少。

1.2聊天室的基本功能1.用户注册2.用户登录3.在线用户列表4.用户公聊5.用户私聊6.好友信息维护7.私聊信息的维护8.登录日志的维护9.用户注销扩展功能(如果完整实现一个扩展功能,适当加分):1.可以切换不同的界面风格2.用户可以更改个人资料,寻找密码3.表情聊天4.文件传递5.公聊信息的维护⏹用户注册第一次用户需要提供个人注册信息,注册的用户名不能重复,密码长度不能少于6位,个人信息必须提供完整,并且存储在数据库中。

⏹用户登录用户输入用户名和密码,提交给将服务器端的确认,根据从服务器中传过来的确认信息,判断用户登录的情况。

并且把此次登录的时间及登录的IP记录在服务器。

如果用户名和密码正确的话,则登录聊天室主界面;如果已经在线,则输出已经在线;否则输出用户名和密码错误,需要重新登录或者注册。

⏹在线用户列表用户登录之后,需要知道系统中,有哪些用户在线,这样可以方便用户选择与个别用户私聊和传送文件,也可以进行公聊。

⏹用户公聊用户输入的用户名和密码都正确后,则进入聊天室。

聊天主界面主要由四大版块组成:公聊的聊天信息、在线用户列表、好友列表,系统消息和聊天的一些操作。

聊天信息版块设计思想:一种就是将客户的聊天信息写入数据库,一种是将其写入向量中。

在本次项目中,要求学员把客户的聊天信息写入数据库中。

⏹用户私聊如果两个人聊的话题比较隐秘,不想被其他人看到,就要使用私聊。

在这里,如果说话对象是所有人的话,不能选择私聊;从当前好友列表中选择了一个用户之后,则私聊对话框应该弹出来。

⏹文件传递两个用户在聊天过程中,可能需要相互间传送文件。

象用户聊天信息和在线用户这样一些信息都是保存在服务器端,然后每个客户读取服务器端向量中的容,此时服务器与客户端的联系是一对多的,而传送文件是一对一的。

所以直接传送,不需要经过服务器端保存。

⏹好友信息维护在聊天过程中,用户可以选择聊天室的用户加为自己的好友。

对于加为好友的用户,可以选择与其进行私聊。

私聊的信息用文件保存在客户端。

该模块应该包括:✓添加好友✓删除好友⏹私聊信息的维护如果两个人聊的话题比较隐秘,不想被其他人看到,就要使用私聊。

而且只有好友之间才能进行私聊。

要与某用户进行私聊,必须把对方加为好友。

与好友之间的聊天信息,应该以文件的方式存储在客户端,不显示在公聊的版面上。

⏹登录日志的维护用户每次登录之后,都记录下用户的登录信息,如登录的时间日期,登陆的IP等。

方便用户发现是否被盗用。

⏹用户注销用户可以注销其身份,对于注销后的用户必须在数据库中删除其相应的信息。

1.3设计所用参考资料Java编程思想(第四版)(机械工业)Java程序设计与问题解决(人民邮电)Java语言最新使用案例教程(清华大学)Java2应用开发指南(第二版)(电子工业)JDK-API-1.5中文版网上查阅资料第二章聊天室的设计2 . 1聊天室的粗略设计分析聊天系统平台应有两个部分组成:服务端和客户端。

服务端主要完成用户信息的存储、客户端命令的接受与响应以及发送系统消息、信息转发、踢人等服务端应有的功能。

客户端主要完成聊天信息的发送与接受、登录、注销等功能。

此c/s系统使用的是TCP/IP协议,应用了如下通讯模式:2 .2聊天室的具体设计分析根据课程设计的要求及项目的需求分析,聊天程序应实现以下几项功能:登录、注册、公聊、私聊、系统消息、踢人、文件传送、注销等。

当客户程序需要与服务器程序通讯的时候,客户程序在客户机创建一个socket对象。

创建了一个Socket对象后,那么它可以通过调用Socket的getInputStream()方法从服务程序获得输入流读传送来的信息,也可以通过调用Socket的getOutputStream()方法获得输出流来发送消息。

由于Client使用了流套接字,所以服务程序也要使用流套接字。

这就要创建一个ServerSocket对象,接下来服务程序进入无限循环之中,无限循环从调用ServerSocket的accept()方法开始,在调用开始后accept()方法将导致调用线程阻塞直到连接建立。

在建立连接后accept()返回一个最近创建的Socket对象,该Socket对象绑定了客户程序的IP地址或端口号。

由于存在单个服务程序与多个客户程序通讯的可能,服务程序循环检测是否有客户连接到服务器上,如果有,则创建一个线程来服务这个客户,以此完成对客户端的监听。

具体流程如下图所示:未注册用户:已注册用户:第三章聊天室的实现3.1聊天室所使用的类及功能的实现客户端:序列化后用来传递用户信息的类:class User implements Serializable{String Name;//用户名String Password;//密码String Email;//String Age;//年龄String sex;// 性别String Message;//要传递的信息String Command; //命令标识Vector vectorUserList;//在线用户列表}这个经过序列化后可以用ObjectOutputStream和ObjectInputStream流来传递信息,而不用一行一行的读取信息。

登录界面类:public class Login extends JFrame implements ActionListener{....//界面组件及其他变量声明public Login() {.....//界面组件初始化try{FileInputStream fsread=new FileInputStream("c:\\ServerIPaddress.txt");InputStreamReader inputread=new InputStreamReader(fsread);BufferedReader bfread=new BufferedReader(inputread);ServerIPaddress=bfread.readLine();fsread.close();toServer=new Socket(ServerIPaddress,1207);}catch(IOException e){} //服务器IP地址读取及连接的建立public void actionPerformed(ActionEvent e) {if(e.getSource()==button1){dispose();new Checkin(toServer);}if(e.getActionCommand().equals("登陆")){if(textField1.getText().equals("")){JOptionPane.showMessageDialog(null,"用户名不能为空!");}else {try{User user=new User();User userlogin=new User();=textField1.getText();user.Password=textField2.getText();mand="Enter";streamToServer=newObjectOutputStream(toServer.getOutputStream());streamFromServer=newObjectInputStream(toServer.getInputStream());streamToServer.writeObject((User)user);streamToServer.flush();userlogin=(User)streamFromServer.readObject();if(mand.equals("Enter")){new MainFrame(toServer,);dispose();}else JOptionPane.showMessageDialog(null,"用户名或密码错误!");textField1.setText("");textField2.setText("");}catch(Exception ee){JOptionPane.showMessageDialog(null,"连接错误!");}}try{streamToServer.close();streamFromServer.close();}catch(Exception ee){}}} //按钮动作及对服务器命令的响应public static void main(String args[]) {JFrame.setDefaultLookAndFeelDecorated(true);Font font =new Font("JFrame",Font.PLAIN,14);Enumeration keys=UIManager.getLookAndFeelDefaults().keys();while(keys.hasMoreElements()){Object key=keys.nextElement();if(UIManager.get(key) instanceof Font )UIManager.put(key,font);}new Login();} //main方法}注册界面类:public class Checkin extends JFrame implements ActionListener{...... //界面组件及其他变量声明public Checkin(Socket toServer) {.....//界面组件初始化try{ ToServer=toServer;streamToServer = new ObjectOutputStream(ToServer.getOutputStream());streamFromServer=new ObjectInputStream(ToServer.getInputStream());}catch(Exception e){}this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);} //将Login中建立的socket做参数传递给Checkin public void actionPerformed(ActionEvent e) {if(e.getActionCommand().equals("注册")){for(int t=0;t==0;){if(textField1.getText().equals("")){JOptionPane.showMessageDialog(null,"用户名不能为空!");t=1;}else if(textField3.getText().equals(textField2.getText())==false){JOptionPane.showMessageDialog(null,"密码不一致!");t=1;}else{User user=new User();=textField1.getText();user.Password=textField2.getText();user.Age=textField4.getText();user.Email=textField5.getText();user.sex=(String)checkboxGroup1.getSelectedCheckbox().getLabel();mand="Login";try{streamToServer.writeObject((User)user);fromServerMessage=(User)streamFromServer.readObject();}catch(Exception ee){JOptionPane.showMessageDialog(null,"数据发送错误!");}if(mand.equals("Login")){dispose();new MainFrame(ToServer,);}if(mand.equals("Repeat")){JOptionPane.showMessageDialog(null,"用户名已存在!");t=1;}}}}if(e.getActionCommand().equals("取消")){dispose();new Login();}} //按钮动作的添加及对服务器的信息传//递和响应}主界面类:public class MainFrame extends JFrame implements ActionListener,Runnable{.....//界面组件及其他变量声明public MainFrame(Socket toServer,String name) {MainFrame1(toServer,name); //构造函数,其中toServer、name为参数}public void MainFrame1(Socket toServer,String name) {....try{ToServer=toServer;streamToServer = new ObjectOutputStream(ToServer.getOutputStream());streamFromServer = new ObjectInputStream(ToServer.getInputStream());fromServerMessage=(User)streamFromServer.readObject();streamToServer.flush();vectorUserList1=(Vector)fromServerMessage.vectorUserList;vectorUserList.setListData(vectorUserList1);}catch(Exception ee){JOptionPane.showMessageDialog(null,"3");}Thread thread = new Thread(this);thread.start();} //建立连接并启动监听线程public void run(){try{for(int t=1;;){User commandFromServer=(User)streamFromServer.readObject();String command=mand;if(command.equals("PublicChat")){textArea2.append(+"对大家说:"+commandFromServer.Message);}if(command.equals("PrivateChat")){textArea2.append(+"对你说:"+commandFromServer.Message);}if(command.equals("add")||command.equals("lessen")){textArea2.append(+"对大家说:大家好!我来了");vectorUserList.setListData(vectorUserList1);}if(command.equals("kick")){lessen();}if(command.equals("SystemMessage")){textArea2.append("系统消息:"+commandFromServer.Message);}JOptionPane.showMessageDialog(null,"用户名不能为空!");t=0;continue;}}catch(Exception e){}} //监听线程对服务器信息的处理及响应public void actionPerformed(ActionEvent e) {if(e.getActionCommand().equals("公聊"))sendPublicMessage();if(e.getSource()==button2)sendPraviteMessage();if(e.getActionCommand().equals("注销")){lessen();dispose();try{streamToServer.close();streamFromServer.close();ToServer.close();}catch(Exception ee){}new Login();}} //对按钮动作的处理及响应public void sendPublicMessage(){} //发送公聊信息public void sendPraviteMessage(){} //发送私聊信息public void lessen(){} //注销事件服务端:服务端序列化信息类:class User implements Serializable{String Name;//用户名String Password;//密码String Email;//String Age;//年龄String sex;// 性别String Message;//要传递的信息String Command; //命令标识Vector vectorUserList;//在线用户列表}服务器界面类:public class Server extends JFrame{.... //组件及变量的定义public Server(){initComponents(); //构造方法,初始化组件}private void initComponents(){//组件初始化try{//建立InetAddress对象InetAddress intel=InetAddress.getLocalHost();String SerIp=intel.getHostAddress();jLabel3.setText("服务器:"+SerIp);}catch(UnknownHostException e2){System.out.println("发生错误!");}jPanel1.add(jLabel3);jLabel5.setText(" 0个客户");jPanel1.add(jLabel5);jList1.setModel(new AbstractListModel() {String[] strings = {};public int getSize() { return strings.length; }public Object getElementAt(int i) { return strings[i]; }});jList1.setFont(new Font("Dialog",Font.BOLD | Font.ITALIC, 16)); jList1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); jList1.addMouseListener(new MouseAdapter(){public void mousePressed(MouseEvent evt){if (evt.getClickCount()==1){BlackList=(String)jList1.getSelectedValue();}}});jScrollPane1.setViewportView(jList1);jPanel1.add(jScrollPane1);jPanel1.add(jLabel1);getContentPane().add(jPanel1);commandMenu.setText("选项");msgMenuItem.setText("系统消息");msgMenuItem.setBorder(null);msgMenuItem.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent evt) {msgMenuItemActionPerformed(evt);}});commandMenu.add(msgMenuItem);kickMenuItem.setText("踢人");kickMenuItem.setBorder(null);kickMenuItem.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent evt) {kickMenuItemActionPerformed(evt);}});commandMenu.add(kickMenuItem);menuBar.add(commandMenu);setJMenuBar(menuBar);startServer();pack();}private void msgMenuItemActionPerformed(ActionEvent evt) //系统消息事件{try{User toUserMessage=new User();String Mesage=JOptionPane.showInputDialog(null,"请输入容:","系统消息",RMA TION_MESSAGE);toUserMessage.Message="系统消息:"+Mesage+"\n";mand="SystemMessage";for(int i=0;i<Server.vectorUserList.size();i++){ObjectOutputStreamstreamToUser=(ObjectOutputStream)Server.vectorStreamToUser.elementAt(i);JOptionPane.show MessageDialog(null,"用户名不能为空!4");streamToUser.writeObject((User)toUserMessage);JOptionPane.showMessageDialog(null,"用户名不能为空!5");streamToUser.flush();}}catch(IOException e){}}private void kickMenuItemActionPerformed(ActionEvent evt) //踢人事件{Object obj=evt.getSource();try{if(obj==kickMenuItem){BlackList=JOptionPane.showInputDialog(null,"请输入用户名:","系统消息",RMA TION_MESSAGE);}User toUserMessage=new User();for(int i=0;i<Server.vectorUserList.size();i++){if(BlackList.equals(Server.vectorUserList.elementAt(i))){mand="Kick";toUserMessage.Message="系统消息:对不起!你已被踢出!\n";}else{JOptionPane.showInputDialog(null,"无此用户!");}ObjectOutputStreamstreamToUser=(ObjectOutputStream)Server.vectorStreamToUser.elementAt(i);JOptionPane.show MessageDialog(null,"用户名不能为空!1");streamToUser.writeObject((User)toUserMessage);JOptionPane.showMessageDialog(null,"用户名不能为空!2");streamToUser.flush();JOptionPane.showMessageDialog(null,"用户名不能为空!3");}Server.vectorStreamToUser.removeElementAt(Server.vectorUserList.indexOf(BlackList));Server.vectorUserList.removeElement(BlackList);jLabel5.setText("共有:"+Server.vectorUserList.size()+"个客户在线");BlackList="";}catch(IOException e){}}private void stopServer() //关闭服务器的服务{String Message="服务器即将关闭!";try{User toUserMessage=new User();mand="SystemMessage";toUserMessage.Message=Message;for(int i=0;i<Server.vectorUserList.size();i++){ObjectOutputStreamstreamToUser=(ObjectOutputStream)Server.vectorStreamToUser.elementAt(i);streamToUser.writeObject((User)toUserMessage);streamToUser.flush();}}catch(IOException e){}try{Thread.sleep(5000);}catch(InterruptedException e){}System.exit(0);}private void startServer(){new AppServer();}private void exitForm(WindowEvent evt){stopServer();System.exit(0);}public static void main(String args[]){new Server().show();}class AppServer extends Thread //启动服务器服务,用于监听客//户端的连接及命令{public AppServer(){try{serverSocket = new ServerSocket(1207);InetAddress intel=InetAddress.getLocalHost();String SerIp=intel.getHostAddress();System.out.println("服务器:"+SerIp);}catch(IOException e){System.out.println("Could not start server"+"."+e);}System.out.println("服务端已启动......");this.start();}public void run(){try{while(true){Socket UserSocket = serverSocket.accept();connection con = new connection(UserSocket);}}catch(IOException e){System.out.println("Not listener"+"."+e);}}}建立连接类:class connection extends Thread{User fromUserMessage=new User();User toUserMessage=new User();Socket netUser;ObjectInputStream streamFromUser;ObjectOutputStream streamToUser;boolean existName,existPassword;String onlineNumber="Immovability";public connection(Socket UserSocket) //建立连接{netUser=UserSocket;try{streamFromUser = new ObjectInputStream(netUser.getInputStream());streamToUser = new ObjectOutputStream(netUser.getOutputStream());}catch(IOException e){try{netUser.close();}catch(IOException e1){System.out.print("Unable to set up stream"+e1);return;}}this.start();}public boolean validateName(String name) //判断用户名是否已存在{boolean validate;String recode,message;FileInputStream fsread;InputStreamReader inputread;BufferedReader bfread;validate=false;try{fsread=new FileInputStream("c:\\User.txt");inputread=new InputStreamReader(fsread);bfread=new BufferedReader(inputread);while((recode=bfread.readLine()) != null){StringTokenizer st = new StringTokenizer(recode,":");while (st.hasMoreTokens()){message=st.nextToken();if(message.equals(name)){validate=true;break;}break;}}}catch(FileNotFoundException e){System.out.println("数据存储文件读取错误!");}catch(IOException e){System.out.println("Error performing IO Operation");}return validate;}public boolean validatePassword(String password) //判断密码是否正确{boolean validate;String recode,message;FileInputStream fsread;InputStreamReader inputread;BufferedReader bfread;validate=false;try{fsread=new FileInputStream("c:\\User.txt");inputread=new InputStreamReader(fsread);bfread=new BufferedReader(inputread);while((recode=bfread.readLine()) != null){StringTokenizer st = new StringTokenizer(recode,":");while (st.hasMoreTokens()){message=st.nextToken();message=st.nextToken();if(message.equals(password)){validate=true;break;}break;}}}catch(FileNotFoundException e){System.out.println("数据存储文件读取错误!");}catch(IOException e){System.out.println("数据存储文件读取错误!");}return validate;}public void run() // 监听客户端信息{try{for(;;){String ButtonMessage;fromUserMessage=(User)streamFromUser.readObject();ButtonMessage=mand;existName=validateName();existPassword=validatePassword(fromUserMessage.Password);if(ButtonMessage.equals("Login")){Login1(); //注册}if(ButtonMessage.equals("Enter")){Enter1(); //登陆}if(ButtonMessage.equals("Leave")){Leave1(); //注销}if(!onlineNumber.equals("Immovability")){Updating1(); //用户改变}if(ButtonMessage.equals("PublicChat") || ButtonMessage.equals("PrivateChat")){Message1(); //发送信息}continue;}}catch(IOException e){}catch(ClassNotFoundException e){}try{streamFromUser.close();streamToUser.close();netUser.close();}catch(IOException e){}}public void Login1() //注册事件{try{if(existName){mand="Repeat";streamToUser.writeObject((User)toUserMessage);streamToUser.flush();}else{RandomAccessFile UserObj=new RandomAccessFile("c:\\User.txt","rw");UserObj.seek(UserObj.length());UserObj.writeBytes(+":"+fromUserMessage.Password+":"+fromUserMessage.sex+":"+fromUserMessage.Email+":"+fromUserMessage.Age+"\n");onlineNumber="add";mand="Login";=;toUserMessage.Message="系统消息:大家欢迎"++"加入!"+"\n";Server.vectorUserList.addElement();toUserMessage.vectorUserList=Server.vectorUserList;streamToUser.writeObject((User)toUserMessage);streamToUser.flush();Server.vectorStreamToUser.addElement(streamToUser);jLabel5.setText(" "+Server.vectorUserList.size()+"个客户");jList1.setListData(Server.vectorUserList);}}catch(IOException e){JOptionPane.showMessageDialog(null,"server");}}public void Enter1() //登陆事件{try{if(existName && existPassword){onlineNumber="add";mand="Enter";=;toUserMessage.Message="系统消息:大家欢迎"++"加入!"+"\n";Server.vectorUserList.addElement();toUserMessage.vectorUserList=Server.vectorUserList;streamToUser.writeObject((User)toUserMessage);streamToUser.flush();Server.vectorStreamToUser.addElement(streamToUser);jLabel5.setText(" "+Server.vectorUserList.size()+"个客户");jList1.setListData(Server.vectorUserList);}}catch(IOException e){}}public void Leave1() //注销事件{String name=;Server.vectorStreamToUser.removeElementAt(Server.vectorUserList.indexOf(name));Server.vectorUserList.removeElement(name);onlineNumber="lessen";Updating1(name);}public void Updating1(String name)//更新用户列表{try{if(onlineNumber.equals("add")){User toUserMessage=new User();mand="add";=name;toUserMessage.Message="系统消息:大家欢迎"+name+"加入!!"+"\n";for(int i=1;i<Server.vectorStreamToUser.size();i++){ObjectOutputStream newUserStream;newUserStream=(ObjectOutputStream)Server.vectorStreamToUser.elementAt(i-1);newUserStream.writeObject((User)toUserMessage);newUserStream.flush();}}if(onlineNumber.equalsIgnoreCase("lessen")){User toUserMessage=new User();mand="lessen";=name;toUserMessage.Message="系统消息:"+name+"走了!!!"+"\n";for(int i=0;i<Server.vectorStreamToUser.size();i++){ObjectOutputStream newUserStream;newUserStream=(ObjectOutputStream)Server.vectorStreamToUser.elementAt(i);newUserStream.writeObject((User)toUserMessage);newUserStream.flush();}}jLabel5.setText(" "+Server.vectorUserList.size()+"个客户");jList1.setListData(Server.vectorUserList);onlineNumber="Immovability";}catch(IOException e){}}public void Message1() //信息发送事件{User toUserMessage=new User();try{toUserMessage.Message=fromUserMessage.Message;if(mand.equals("PublicChat")){for(int i=0;i<Server.vectorUserList.size();i++){if(!(.equals(Server.vectorUserList.elementAt(i)))){mand="PublicChat";streamToUser=(ObjectOutputStream)Server.vectorStreamToUser.elementAt(i);streamToUser.writeObject((User)toUserMessage);streamToUser.flush();}}}if(mand.equals("PrivateChat")){for(int i=0;i<Server.vectorUserList.size();i++){if(.equals(Server.vectorUserList.elementAt(i))){mand="PrivateChat";streamToUser=(ObjectOutputStream)Server.vectorStreamToUser.elementAt(i);streamToUser.writeObject((User)toUserMessage);streamToUser.flush();}}}}catch(IOException e){}}}}第四章聊天室的调试登录界面:注册界面:主界面:服务器界面:第五章课程设计总结5.1开发中遇到的问题我在通讯录系统程序设计过程中,遇到的问题大体可分为两类:A.知道但不会。

相关文档
最新文档