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课程设计报告(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的相关知识有详细的了解和充分的认识。

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

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

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

java实训聊天系统报告总结

java实训聊天系统报告总结

java实训聊天系统报告总结一、项目背景随着互联网的快速发展,人们在日常生活和工作中越来越依赖于网络。

在线聊天成为了人们日常交流的重要方式。

为了满足不同用户对聊天系统的需求,本次实训项目选择开发一款功能完善的Java聊天系统。

二、项目目标1. 设计一款用户界面友好,操作简单的聊天系统。

2. 实现用户的注册和登录功能,保障系统的安全性。

3. 提供实时聊天功能,用户可以通过系统进行文字、图片的交流。

4. 支持多人群聊、私聊的功能。

5. 实现聊天记录的存储和查看。

三、系统架构1. 前端设计本次项目的前端开发使用Java的Swing库进行界面设计,保障用户操作的友好性和系统的易用性。

2. 后端开发后端使用Java语言进行开发,使用Socket实现实时通讯功能,使用MySQL进行用户数据的存储和管理。

四、功能实现1. 用户注册和登录功能用户可以通过系统注册新账号,并使用已有账号进行登录。

系统会对用户输入的信息进行验证,保障系统的安全性。

2. 实时聊天用户可以通过系统进行实时的文字、图片交流,确保用户之间的沟通顺畅和效率。

3. 多人群聊、私聊功能系统支持多人同时进行群聊,同时也支持用户进行私聊。

用户可以根据自己的需求选择不同的聊天方式。

4. 聊天记录存储和查看系统会将用户的聊天记录进行存储,并提供查看功能,用户可以随时查看自己的聊天记录。

3. 数据库设计设计数据库存储用户的基本信息、聊天记录等数据,确保数据的安全性和完整性。

4. 功能实现实现用户注册、登录、实时聊天、群聊、私聊等功能,并保障系统的稳定性和安全性。

六、总结本次实训项目成功设计并开发了一款功能完善的Java聊天系统,满足了用户对聊天系统的基本需求。

通过本次项目的实训,加深了我们对Java语言、数据库设计和网络通讯的理解和实践能力,为我们以后的开发工作积累了丰富的经验。

七、展望在今后的工作中,我们还可以进一步完善系统功能,例如增加语音、视频通话功能,优化系统的性能和用户体验,使系统更加满足用户的需求。

java网络聊天软件课程设计

java网络聊天软件课程设计

《面向对象程序设计课程设计》报告基于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聊天室课程设计报告

UML课程设计题目网络聊天程序开发设计与实现学号:*************名:***指导教师:完成时间:2017年 12月目录1.摘要 (2)2.绪论 02.开发环境 03.需求分析 (1)3.1程序简介 (1)3.2程序功能 (1)4.系统设计 (2)4.1概要设计 (2)4.2详细设计 (2)5.测试 (7)6.结论 (9)参考文献 (10)摘要本次训练主要是考查了对JA V A程序设计的综合运用,设计一个Socket 通信的聊天程序,用户可以通过程序进行聊天通信,但不支持用户自定义表情及图片的发送。

本程序设计也用到了一些相关的标准Java的类,给程序设计带来了许多的方便,但用那些要切记加相应的类的包,还有一些构造方法和个别接口方法。

本程序可以实现用户之间的一些简单的交互,虽然功能较少,但是我想通过这次程序设计来熟悉并且学习更多关于JA V A编程的东西,来便于以后可以使用。

关键词:java聊天1.绪论对于一个选择网络编程的人来说,必须要有足够的细心和耐心,因为编程一般来说是很枯燥的乏味的,而且程序会越来越复杂,它所用到的符号、标记很多,所以不能出点小错误的。

还有,我们不能只是看程序,要学会把自己学的自己拿去实践,自己去编一些程序,培养自己的动手能力,掌握一些编程技巧,熟练运用自己学到的理论知识,这样在以后才能开发出属于自己的东西。

如今,随着科学技术的发展,计算机已成为了我们生活中必不可少的设备了,而掌握计算机知识和运用,又成了我们每一个人的目标了。

现在IT行业的飞速发展,无不应正了以前、现在、将来计算机行业都是科学发展的主导行业。

而这些基本上都建立在程序上的,所以程序员对计算机行业来说,可想而知有多么的重要了,他们所付出的每一滴汗水都将推动这个行业的发展。

现在我就用JA V A语言编写一个简单的程序——Java聊天程序。

将所学的基本知识用到其中去,这里包括了构造方法,创建图形界面,引用类等等。

java实现的基于UDP的聊天系统课设报告

java实现的基于UDP的聊天系统课设报告

沈阳理工大学课程设计专用纸课程设计任务书目录1 协议介绍和使用说明 (2)1.1 协议内容 (2)1.2 关键技术 (3)1.2.1 服务器端Socket的实现 (3)1.2.2 通信的建立 (4)2 程序设计 (4)2.1系统结构 (4)2.2主程序设计 (5)2.2.1 服务器端程序 (5)2.2.2 客户端程序 (5)2.3.2客户端之间发送消息 (6)2.4.2 界面的功能 (7)2.5 实现代码 (7)2.6 程序调试及运行结果 (12)2.6.1 调试前的准备 (12)2.6.2 程序调试过程 (12)2.6.3 程序运行结果 (12)2.6.4 出错分析 (14)3. 课设体会 (15)参考文献 (15)1 协议介绍和使用说明1.1 协议内容本课程设计主要是基于UDP的并用Java实现的简单的聊天程序。

UDP 用户数据报是在运输层的端到端抽象的逻辑信道中传送的。

UDP 在传送数据之前不需要先建立连接。

对方的运输层在收到UDP 报文后,不需要给出任何确认。

虽然UDP 不提供可靠交付,但在某些情况下UDP 是一种最有效的工作方式。

虽然UDP 用户数据报只能提供不可靠的交付,但UDP 在某些方面有其特殊的优点,它有即时通信的功能。

比如说,使用聊天程序聊天的时候,省去的了跟对方通信的时候的链接的麻烦,直接进行通信。

UDP 只在IP 的数据报服务之上增加了很少一点的功能,即端口的功能和差错检测的功能。

UDP 使用尽最大努力交付,即不保证可靠交付,同时也不使用拥塞控制。

UDP 是面向报文的。

UDP 没有拥塞控制,很适合多媒体通信的要求。

UDP 支持一对一、一对多、多对一和多对多的交互通信。

发送方UDP 对应用程序交下来的报文,在添加首部后就向下交付IP 层。

UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。

应用层交给UDP 多长的报文,UDP 就照样发送,即一次发送一个报文。

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实训聊天系统报告总结

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对象,通过该对象监听指定端口的连接请求。

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

Java课程设计聊天室(含代码)【范本模板】

Java课程设计聊天室(含代码)【范本模板】

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桥访问数据库.本系统建立在JAVA平台上,系统的设计使用了面向对象技术和面向对象的设计原则.系统采用C/S结构,客户端与客户端以及客户端与服务器端之间通过Socket传送消息。

java实训聊天系统报告总结3篇

java实训聊天系统报告总结3篇

java实训聊天系统报告总结3篇Report summary of java training chat system汇报人:JinTai Collegejava实训聊天系统报告总结3篇前言:报告是按照上级部署或工作计划,每完成一项任务,一般都要向上级写报告,反映工作中的基本情况、工作中取得的经验教训、存在的问题以及今后工作设想等,以取得上级领导部门的指导。

本文档根据申请报告内容要求展开说明,具有实践指导意义,便于学习和使用,本文档下载后内容可按需编辑修改及打印。

本文简要目录如下:【下载该文档后使用Word打开,按住键盘Ctrl键且鼠标单击目录内容即可跳转到对应篇章】1、篇章1:java实训聊天系统报告总结2、篇章2:java实训聊天系统报告总结3、篇章3:java实训聊天系统报告总结篇章1:java实训聊天系统报告总结经过三个星期的学习,我们终于把这个图书馆管理系统做出来了,虽然做得不是很完美,但是却是我们这个小组的每一个成员辛苦了三个星期的成果,我们为此感到开心。

说实话,我们这一组的JAVA都学得不是很好,上课也听得不是很明白,所以在刚开始做的时候,我们每一个人都认为这是一个不可能完成的任务,刚开始我们也想过要放弃,想想这么难怎么可能完成呢!可是后来看到其他组都在认真的做任务,我们想想也不能这样放弃,至少也得试试,如果不会的话,再去请教会的人,学习不就是从不会到会的!于是第一个星期我们把任务分配好了,但是这一周我们把大部分的时间浪费了,也没有做出来什么,只是把一个简单的界面做好了。

不过我们也很开心了,因为至少是我们自己做出来的,虽然没有太完善。

第二个星期我们开始做每一个版块的功能模块,一共要完成三个版块,我们六个人分成两组我们这组要完成最近一个系统维护版块,这个版块包括两大模块,更改密码和用户管理,而我个人主要负责的是用户管理这个版块。

在实训的过程中我们还学到了JAVA的图形化界面。

这让我们很轻松的就能把一个界面弄出来,而不需要让我们打很我繁琐的程序代码,当然我的这个模块的界面我花了半天就做出来了,做出来之后,接下来就是接监听,这对我来说是一个难点,起初我是一点也不会的,自己看书也只是看得懂,但也编不出来,当时我很着急,看到人家都做出来了。

java课程设计报告利用java实现简单聊天室

java课程设计报告利用java实现简单聊天室
(3)客户端:
创建一个socket对象,用于连接服务器。
用socket创建流。
通过流和服务器进行交互。
交互完毕,将流和socket关闭。
(4)聊天室:
类名:Client
作用:实现发送即时信息。
继承的接口名:ActionListener
public class Server implements ActionListener{
定义的对象:
count//记录点机关闭按钮次数2次关闭
soconly//只有SOCKET,用于群发
sockets//所有客户的SOCKET
socket_thread//Socket所在的线乘,用于退出;
程序中引入的包:
package Chat;
import .*;
import java.awt.*;
import ;
import javax.swing.*;
import java.util.*;
import java.io.*;
(1)服务器端代码中用户自定义类:
类名:Server
作用:服务器启动
接受请求时候,通过accept()方法,得到一个socket对象。
Socket socket = server.accept();
通过socket创建流(输入,输出)。
BufferedReaderbr=newBufferedReader(newInputStreamReader
(socket.getInputStream()))
类名:LogIn
作用:用户注册登录
继承的接口名:ActionListener
public class LogIn implements ActionListener

java实现聊天系统(计算机网络课程设计报告)

java实现聊天系统(计算机网络课程设计报告)

计算机网络课程设计报告学生姓名学号班级指导教师设计时间目录第一章系统描述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系统功能分析本系统可以通过网络进行聊天,采用客户端服务器模式,所以程序简介清晰易懂,而且用户都是在客户端进行活动,方便对用户的管理,也使得程序运行与差错简单起来。

Java聊天系统实训报告

Java聊天系统实训报告

Java聊天系统实训报告一、实训目的:1、理解C/S模式的软件系统结构,掌握网络编程的基本概念;2、了解Java 的多线程机制,掌握Java多线程技术的应用;3、熟练掌握基于TCP协议的Socket编程;4、熟练掌握基于UDP协议的Socket编程;5、了解Socket编程的协议约定以及信息交互方法;二、实训要求:使用JBuilder提供的组件及网络包,开发一个实用的C/S模式聊天室系统。

(1)功能要求要求该系统由客户端及服务器端两部分组成。

(2)系统界面要求:要求系统具有友好的用户界面,界面简洁、操作方便;本程序客户端主要完成了:1. 客户端发送信息可以广播客户。

2. 广播客户,则将信息转发到所有客户端。

服务器主要完成了:客户-服务器之间信息的交互。

例如hello发送信息到服务器,服务器将信息转发到所有与之连接的客户(hello、boy),通过这种形式,就可以实现客户之间的信息广播。

本程序可以实现发送信息广播,只要进入客户端都可以看到消息,本程序采用了流的概念,java多线程,Socket应用程序中用到的代码如下客户端代码:import java.awt.*;import java.awt.event.*;import java.io.*;import .*;public class Login implements ActionListener{private static final ActionListener WindowAdapter = null;private Frame f;private TextField tf;private Label l;private String tfContent="";public Login(){f = new Frame("欢迎登陆本程序...按enter键直接登录");l = new Label("请输入你的名字");tf = new TextField(20);f.setLayout(new FlowLayout());f.add(l);f.add(tf);f.pack();f.show();tf.addActionListener(this);f.addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e){System.exit(0);}});}public void actionPerformed(ActionEvent e){System.out.println ("ft clicked");tfContent = tf.getText();ClientFrame cf = new ClientFrame(tfContent);f.dispose();}public static void main(String[] args){new Login();}}class ClientFrame extends Thread implements ActionListener{private Frame f;private TextField tf;private Button btn;TextArea ta;private Panel pup;String data;BufferedReader InputS;PrintStream OutputS;String name;ClientFrame(String str){name = str;Socket client;try {client = new Socket("localhost",6000);InputS = new BufferedReader(new InputStreamReader(client.getInputStream()));OutputS = new PrintStream(client.getOutputStream(),true);}catch (Exception ex) {ex.printStackTrace();}OutputS.println("欢迎" + name + "光临");f = new Frame("客户端");tf = new TextField(30);tf.addActionListener(this);btn = new Button("发送");ta = new TextArea();pup = new Panel();f.setLayout(new BorderLayout());f.add(pup,BorderLayout.NORTH);pup.add(tf);pup.add(btn);f.add(ta);f.pack();f.setSize(400,300);f.addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e){OutputS.println(name + "已经离开");System.exit(0);}});btn.addActionListener(this);f. show();this.start();}public void run(){try {while(true){System.out.println ("正在监听端口...");OutputS.println("\u0001");ta.setText(InputS.readLine().replaceAll("\u0001","\n"));Thread.sleep(1000);}}catch (Exception ex) {ex.printStackTrace();}}public void actionPerformed(ActionEvent e){String cmd = e.getActionCommand();if (cmd.equals("发送")){System.out.println ("发送clicked");data = tf.getText();try {OutputS.println(name + "说:" + data);ta.setText(InputS.readLine().replaceAll("\u0001","\n"));}catch (Exception ex) {ex.printStackTrace();}tf.setText("");}else{System.out.println ("发送clicked");data = tf.getText();try {OutputS.println(name + "说:" + data);ta.setText(InputS.readLine().replaceAll("\u0001","\n"));}catch (Exception ex) {ex.printStackTrace();}tf.setText("");}}}运行结果如下图:服务器代码如下:import java.io.*;import java.awt.*;import java.awt.event.*;import .*;import java.util.ArrayList;public class ServerFrame implements ActionListener{private Frame f;private TextArea ta;private MenuBar mb;private MenuItem start;private Menu m;boolean isStop;static ArrayList clients;ServerFrame() {f = new Frame("java聊天系统服务器");ta = new TextArea();mb = new MenuBar();m = new Menu("服务器管理");start = new MenuItem("启动服务器");mb.add(m);m.add(start);start.addActionListener(this);f.setMenuBar(mb);f.add(ta);f.setSize(260, 60);f.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {System.exit(0);}});f.show();}public void actionPerformed(ActionEvent e)//该方法用来对发生在按钮上的事件进行处理{String cmd = e.getActionCommand();if (cmd.equals("启动服务器")) {System.out.println("初始化中...");try {System.out.println("服务器已经启动");ServerSocket server = new ServerSocket(6000);while(!isStop){Socket Client = server.accept();Service ss = new Service(Client);}}catch (Exception ex) {ex.printStackTrace();}}}public static void main(String[] args) {new ServerFrame();}}class Service extends Thread{String data;BufferedReader InputS;PrintStream OutputS;Socket Client;static String Content="";public Service(Socket ClientSocket) throws Exception{Client = ClientSocket;try {InputS = new BufferedReader(new InputStreamReader(Client.getInputStream()));OutputS = new PrintStream( Client.getOutputStream(),true);}catch (Exception ex) {System.out.println("不能连接客户端!");return;}this.start();}public void run() {System.out.println (this);try {while(true){data = InputS.readLine();if(data.equals("\u0001")){OutputS.println(Content);}else{Content = data +"\u0001"+ Content;System.out.println (Content);if (Content==null) break;else{OutputS.println(Content);System.out.println("From Client: " + Content);}}}Client.close();}catch (Exception ex) {ex.printStackTrace();}try {Client.close();}catch (Exception ex) {ex.printStackTrace();}}}运行结果如下图:实验中遇到的问题:1、图形用户界面设计按钮和文本框设计中的按钮上的事件处理问题2、输入流输出流的问题3、监听端口的问题解决:1、通过java语言程序设计(第2版)中第五章中的5.2事件和事件处理知道了具体事件的处理是使用事件对应的监听者接口中所提供的抽象方法,这些方法需要重新定义,例如本程序中public void actionPerformed(ActionEvent e),该方法用来对对发生在按钮上事件的处理。

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

计算机网络课程设计报告学生姓名学号班级指导教师设计时间目录第一章系统描述设计目的 (3)系统设计任务 (3)系统设计分析 (3)系统功能分析 (4)第二章功能模块结构模块划分 (5)模块结构图 (5)模块功能 (5)第三章模块算法实现服务器实现 (6)客户端实现 (9)第四章运行结果 (13)第五章课程设计总结 (17)第六章附录参考文献 (19)源代码 (19)第一章系统描述设计目的1.学习网络编程的知识,掌握网络编程的方法。

2.进一步掌握编程思想与编程技巧,做到模块化程序设计,3. 强化语言学习,尤其是Java的图形界面与多线程,需反复练习,熟练掌握。

系统设计任务聊天室软件的设计与开发:基本要求可以完成群聊、私人聊天,实时发送和显示聊天信息,完成好友列表;进一步要求带表情,附件发送,聊天信息的加密传送,设置黑名单等。

学习通信编程Socket接口编程,使用TCP或UDP接口完成信息传送,利用多线程技术实现服务器端的多个TCP连接的建立。

系统设计分析一.实现网络聊天室编程,关键在于Socket通信,程序的功能都是在Socket的基础上一层一层增加的。

实现Socket通信的基本方法为以下4个步骤。

在客户端与服务器端创建相应的ServerSockot/Socket实例。

打开连接到Socket的输入输出流利用输入输出流,按照一定的协议(TCP协议)对Socket进行读写操作关闭输入输出流和Socket我们要实现的功能都是在第3步对Socket的输入输出流做相应的操作二.因为是多客户端,所以必须用线程进行控制,不同的处理线程为不同的客户服务,主线程只负责循环等待,处理线程负责网络连接,接受客户输入的信息,再做相应的处理。

系统功能分析本系统可以通过网络进行聊天,采用客户端服务器模式,所以程序简介清晰易懂,而且用户都是在客户端进行活动,方便对用户的管理,也使得程序运行与差错简单起来。

采用了多线程技术,可以做到多人同时在线,提高了系统的性能,增强了系统的实用性。

有简单的客户端界面,方便用户使用。

采用的是TCP 协议,这是可靠的,稳定的协议,这样不会丢失任何包,也就不会丢失任何信息。

本系统实现的功能有: 用户名字登录 用户之间的群聊 用户之间的私聊动态刷新并显示好友列表 显示在线人数服务器可以显示用户在线状态 能够退出处理 用户上下线提醒第二章 功能模块结构模块划分服务器:Server 类模块,ServerHanderson 模块,sendallclient 模块,sendclientlist 模块 客户端:Client 类模块, ServiceFrame 窗口界面模块模块结构图模块功能服务器:Server类模块:与客户端建立连接,通过套接字获得名字,在控制端显示提示信息ServerHander模块:提供线程管理,实现多用户的管理。

针对每一个用户发过来的消息,进行相应处理,再转发给客户。

Sendallclient模块:给每个用户发送消息。

Sendclientlist模块:每当有用户上线,更新每个用户的用户列表。

客户端:Client类模块:与服务端建立连接,用户登录,实现消息的群聊,私聊,用户列表的更新等功能。

ServiceFrame窗口界面模块:客户端窗口界面,实现用户友好,方便用户使用,在窗口上有消息显示,用户列表,在线人数等视图信息。

第三章模块算法实现服务器实现1.Server类模块:创建ServerSocket,在指定端口监听,当有用户登录,接受套接字输入流,显示其登录信息,调用ServerHander线程进行管理。

public Server(int port) throws IOException{ServerSocket server=new ServerSocket(port);while(true){Socket conn=(); Sendallclient模块:把msg消息发送给每一个用户。

其中allclients是ServerHander的枚举类型,可以指向每一个用户。

protected static void sendallclient(String msg){synchronized (clientlist){Enumeration <ServerHander> allclients=();while()){ServerHander serh=(ServerHander)();try{}catch(IOException exc){();}}}}模块:更新用户列表,当有新用户上线时,对以前的用户的好友列表,加上这个新用户名字,对于这个新用户,加上所有用户的名字。

实现方法是在名字信息后面加上“$”关键字,这样客户端接收到这个关键字时,做相应处理。

public static synchronized void sendclientlist(){for(int j=0;j<();j++){ServerHander allclients1=(j);if(j==()-1) rim(); 务器控制台显示并记录登录,退出信息。

2.在客户端控制台输入名字进入聊天室。

3.聊天界面显示客户端名字,好友列表,在线人数等信息。

4.私聊,群聊显示,若选择所有人则为群聊,选择某一个人,则为私聊。

如下图,群聊消息,在所有客户端都显示,私聊信息只会在发送者与接受者中显示。

5.人数动态刷新。

第五章课程设计总结从收到题目的茫然无措,不知从何下手,到最后交出的成果,真的让我学到了很多,可能比一学期的JAVA和网络课程设计中学到的关于TCP协议的知识还要多,所以很感谢这次课程设计,有效果也很有意义,某种程度上比上课效果还好。

说说完成课程设计的整个过程吧。

刚看到可以选择的六个题目时,犹如晴天霹雳,别说用代码实现了,连题目要求都不理解,上课恍惚听老师提到过这个知识点,可是重要的内容却一点也不知道,而且,由于要做图形界面,所以用JAVA会更简单点,但JAVA也忘得差不多了,所以只能从头来过,刚开始的3周,一点有关课程设计的代码都没写,拿着一本《从零开始学JAVA》把JAVA基础知识,尤其是关于网络编程,线程,图形界面的知识,狠狠地补了一把,终于更看懂一些程序结构清晰,没有反射,泛型等高端用法的程序了。

在这过程中发现,做一个普通的网络聊天室,似乎不要用太多网络知识,懂得Socokt和TCP的使用即可,于是开始慢慢敲代码了。

先把服务器与客户端搭建起来,只能实现连接上的作用,但什么功能都没有,那时,以为能连接上了,那实现一些私聊,群聊的功能应该很简单,但现实确是,只能脑中想象,真的用代码实现,却总是错误百出,做的心灰意冷,尤其是私聊功能的实现,刚开始,想让服务器直接向接受者与发送者发送消息,但总是不如人意,折腾了大概一星期,才意识到TCP协议就是用自己定义的一些规则,在服务器与客户端之间传递消息,可以添加关键字,再解析。

于是才解决私聊问题,然后添加好友列表与更新好友的功能也在跌跌撞撞中实现了。

窗口的布局,刚开始想用网格包布局,但用的很不熟练,导致布局不理想,无奈,只能用最基本的布局了,所以界面看上去很普通。

想发送图片,却发现文本区域根本不能显示图片,能用JEditorPane实现,但有BUG,不知如何调试,书上,网上也没找到能解决的办法,只能放弃了。

课程设计在这种不断学习与摸索中差不多完成了,说说这次课程设计的不足吧。

学过的知识不牢固,所以花费了大量时间用来学习基础知识,那些应该在以前就掌握的。

程序界面很普通,像老师说的一样,是最最古老的聊天系统,没有什么花哨。

没能实现附加功能,像加密传输,文件传送等功能。

其实,挺遗憾的,因为以前选修过密码学,应该能够实现简单的DES加密的。

没有用到JDBC,把用户信息存储到数据库表中,实行账号密码登录,提高系统的安全性。

做了这么多的课程设计,最大的体会就是用心去做,用心去学,你一定能学到很多知识,而且这是对学过的知识的应用,所以比单一的上课更有意思。

对于自己能独立的完成课程设计,还是颇为满意的,至少努力没有白费,学到的知识也非常多,最重要的应该是理解了TCP协议的原理,并学会了简单的应用,JAVA编程水平得到了一定的提高,面向对象的思想比以往更清晰了。

第六章附录参考文献《从零开始学JAVA》王发波中国铁道出版社《Java 2实用教程》耿祥文清华大学出版社源代码服务器代码:package service;import .*;import .*;import .*;public class Server {public Server(int port) throws IOException{ServerSocket server=new ServerSocket(port);while(true){Socket conn=(); ;import .*;import .*;import.*;public class Client {public ServiceFrame sf;private Socket csocket;private DataInputStream in;private DataOutputStream out;public static void main(String []args){BufferedReader in = new BufferedReader(new InputStreamReader);"请输入一个名字: ");String who=" ";try{who=().trim(); //控制台获得名字}catch(IOException e){();}new Client(who,"",9992);}public Client(String who,String server,int port){s f=new ServiceFrame(who+" 的客户端");S tring str1 = null;ActListener(this,sf));(new ExitListener(this));t ry{csocket =new Socket(server,port);in=new DataInputStream(new BufferedInputStream()));out=new DataOutputStream(new BufferedOutputStream()));(who);(); //名字发给服务器while(true){s tr1 = (); //重点!!!,服务器端发来的消息i f("$")) //若以$结尾,则增添用户{int index = ("$");String str2 = (0,index);}e lse if("@")) //以@结尾为私聊信息{str1=(0,()-1);if(who))"-- "+str1+"\n");}e lse{if("下线")) //用户下线,删除此用户{int index = ("下线");String str2 = (0,index);}"-- "+str1+"\n");}"在线人数:"+ //动态更新在线人数}}c atch(Exception e){"Server Error");();(0);}}protected void send(String msg){ //发送消息给服务器的方法t ry{(msg);();}c atch(Exception e){}}protected void close(){t ry{();();();();}catch(IOException ex){}}}class ServiceFrame extends Frame{JTextArea showAT;JTextField sendFD;JComboBox friendlist;JButton but;JLabel showCount;JScrollPane textAreaScrollPane;JPanel textFieldPanel = new JPanel();public ServiceFrame (String winname){super(winname); //继承父类的名字setSize(500,400);(new FlowLayout(0,10,10));showAT = new JTextArea(400,400);(false);textAreaScrollPane = new JScrollPane(showAT);add(textAreaScrollPane, ;add(textFieldPanel, ;friendlist = new JComboBox();("所有人");(friendlist);sendFD = new JTextField(20);(sendFD);but = new JButton("发送");;(but);showCount = new JLabel("在线人数:1");(showCount);show();}}class ActListener implements ActionListener{Client client;ServiceFrame sframe;public ActListener(Client c,ServiceFrame sf){client=c;sframe=sf;}public void actionPerformed(ActionEvent e){ //发送信息,并以@作为私聊标记"@"+ " ");}}class ExitListener extends WindowAdapter{Client client;public ExitListener(Client c){client=c;}public void windowClosing(WindowEvent e){();(0);}}。

相关文档
最新文档