java课程设计聊天小程序
java课程设计---局域网聊天程序的设计与实现
课程设计报告
设计名称:面向对象课程设计
选题名称:局域网聊天程序的设计与实现姓名:学号:
专业班级:
系(院):
设计时间:
设计地点:
面向对象课程设计报告第7 页,共14 页
面向对象课程设计报告第8 页,共14 页
面向对象课程设计报告第9 页,共14 页
面向对象课程设计报告第10 页,共14 页
面向对象课程设计报告第11 页,共14 页
(2).用户使用说明:
在昵称里输入想要使用的名字,在主机地址写入运行服务器端程序的电脑的ip地址,默认为localhost,代表本机,在端口号中输入和服务器端程序约定好的端口号,默认为4331,如果不一致会导致运行失败,最后选择性别后点击“连接”按钮连接服务器,弹出聊天界面。
进入聊天界面后在公共聊天区会自动显示“欢迎xx”信息。
在用户列表会显示在线的用户,点击某个用户的名字后聊天对象自动变成被电击的用户,默认是所有人。
万一用户列表显示不正确,点击刷新按钮可以从服务器重新获取用户列表。
个性化设置(仅本地有效):四种主题,字体和颜色自定义,自动换行,发送快捷键。
有用户退出会在公共聊天区显示系统信息提示并自动刷新用户列表。
(3).测试结果:
运行程序首先出现的登陆界面。
测试用户:Jarry
连接成功后的聊天界面,公共聊天区显示发给所有人的信息,我的频道显示发给指定人的信息。
界面为红色,颜色为蓝色,字体为楷体,聊天对象为Tom。
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聊天软件课课程设计一、教学目标本课程的学习目标包括以下三个方面:1.知识目标:学生需要掌握Java编程语言的基本语法、面向对象编程思想、常用数据结构和算法,以及JavaFX等图形用户界面开发技术,从而能够独立设计和开发简单的聊天软件。
2.技能目标:学生能够熟练使用Java开发工具和环境,具备查找和解决编程问题的能力,能够独立完成聊天软件的设计、编码、调试和测试工作。
3.情感态度价值观目标:通过本课程的学习,学生能够培养对编程和软件开发的兴趣和热情,认识软件开发对社会和科学的重要性,形成良好的学习态度和合作精神。
二、教学内容本课程的教学内容主要包括以下几个部分:1.Java编程基础:Java语言的基本语法、数据类型、运算符、控制结构、数组、字符串等。
2.面向对象编程:类和对象的概念、构造方法、成员变量、继承、多态、接口等。
3.常用数据结构和算法:数组、链表、栈、队列、排序、查找等。
4.JavaFX图形用户界面开发:窗口、控件、布局、事件处理等。
5.聊天软件设计与开发:设计模式、网络编程、多线程、消息传递机制等。
三、教学方法本课程的教学方法包括以下几种:1.讲授法:用于向学生传授基本概念、原理和方法。
2.案例分析法:通过分析典型聊天软件的案例,使学生更好地理解和掌握相关知识。
3.实验法:让学生动手编写代码,实际操作聊天软件的开发过程,培养实际编程能力。
4.讨论法:学生进行小组讨论,分享学习心得和解决问题的方法,提高合作和沟通能力。
四、教学资源本课程的教学资源包括以下几种:1.教材:《Java编程基础》、《JavaFX教程》、《Java网络编程》等。
2.参考书:为学生提供丰富的课外阅读材料,加深对课程内容的理解。
3.多媒体资料:教学PPT、视频教程、网络资源等,丰富教学手段,提高学习兴趣。
4.实验设备:计算机、网络设备等,为学生提供实际操作环境,培养实际编程能力。
五、教学评估本课程的评估方式包括以下几个方面:1.平时表现:通过课堂参与、提问、讨论等环节,评估学生的学习态度和积极性。
JAVA课程设计--简单的网络聊天程序
}
catch (Exception e)
{
//System.exit(-1);
}
}
public void connect()
{
try
{
s = new Socket("127.0.0.1", 8888); //此IP可以修改,如果要可以达到很远的距离聊天不但需要IP地址,
本 科 课 程 设 计
课程设计题目: 简单的网络聊天程序
课程设计报告
1.设计目的:
课程设计题目:简单的网络聊天程序
目的与任务:Байду номын сангаас
目的:熟悉网络编程的知识和技能,掌握Socket编程的方法。
任务:完成网络聊天程序的编制与调试。
要求:
1.分析聊天程序的功能需求。
2.采用自己熟悉的开发环境和语言完成设计任务,如:Java、C++、Visual Basic、SQL server等。
工作安排:
利用网络程序编程来完成这一次课程设计,并且用到多线程和图形界面处理,最后完成课程设计报告。
提交内容:
每位同学提交书面设计报告一份(每人一份)
程序源代码
批语:
成绩:
2014年9月1日
在当今的信息时代,越来越多的聊天工具被应用 ,Java语言是当今流行的网络编程语言,它具有面向对象、与平台无关、安全、多线程 等特点。使用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聊天室)
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)当服务器开启时。
javaweb聊天软件课程设计
javaweb聊天软件课程设计一、课程目标知识目标:1. 理解Java Web编程基础,掌握Servlet、JSP等核心技术;2. 学会使用数据库存储聊天信息,掌握JDBC连接数据库的方法;3. 掌握HTML、CSS、JavaScript等前端技术,实现用户界面设计;4. 了解网络通信原理,掌握WebSocket技术实现实时聊天功能。
技能目标:1. 能够独立设计并实现一个基于Java Web的聊天软件;2. 能够运用所学知识解决实际开发中遇到的问题,如数据库操作、页面跳转、表单验证等;3. 能够运用前端技术优化用户界面,提高用户体验;4. 能够使用WebSocket实现实时通信,提高聊天软件的互动性。
情感态度价值观目标:1. 培养学生的编程兴趣,提高学习积极性;2. 培养学生的团队协作意识,学会与他人共同解决问题;3. 培养学生的创新精神,敢于尝试新技术和新方法;4. 培养学生遵守网络道德规范,尊重他人隐私,合理使用网络资源。
课程性质:本课程为实践性较强的课程,要求学生在掌握基本理论知识的基础上,动手实践,培养实际开发能力。
学生特点:学生具备一定的Java基础,了解Web编程基本概念,对实际项目开发感兴趣。
教学要求:结合课程性质和学生特点,注重理论与实践相结合,以项目为导向,引导学生自主探究,培养实际开发能力。
在教学过程中,关注学生的学习进度和需求,及时调整教学方法和内容,确保课程目标的实现。
将目标分解为具体的学习成果,便于后续教学设计和评估。
二、教学内容1. Java Web基础回顾:重点复习Servlet、JSP技术,讲解其在聊天软件中的作用及使用方法。
教材章节:第1章 Java Web基础2. 数据库设计与操作:讲解数据库在聊天软件中的应用,学习JDBC连接数据库,实现用户信息、聊天记录的存储和查询。
教材章节:第2章 数据库设计与操作3. 前端界面设计:学习HTML、CSS、JavaScript技术,实现聊天软件的界面设计,提高用户体验。
java课程设计聊天小
java课程设计聊天小一、教学目标本节课的教学目标是让学生掌握Java编程语言的基本语法和面向对象编程思想,通过编写一个简单的聊天小应用程序,培养学生解决实际问题的能力。
具体目标如下:1.知识目标:–掌握Java基本数据类型、运算符、控制结构;–理解面向对象编程的基本概念,如类、对象、封装、继承、多态;–熟悉Java编程语言的常用开发工具和环境。
2.技能目标:–能够运用Java编程语言编写简单的程序;–能够运用面向对象编程思想设计和实现程序;–能够利用Java开发工具进行程序的编译和运行。
3.情感态度价值观目标:–培养学生对编程语言的兴趣和好奇心;–培养学生解决问题的能力和团队合作精神;–培养学生热爱科学、追求创新的精神。
二、教学内容本节课的教学内容主要包括以下几个部分:1.Java基本语法:数据类型、运算符、控制结构;2.面向对象编程:类、对象、封装、继承、多态;3.Java开发工具和环境:Eclipse或IntelliJ IDEA的使用。
通过讲解和示例,让学生了解和掌握Java编程语言的基本语法和面向对象编程思想,最终能够编写一个简单的聊天小应用程序。
三、教学方法为了达到本节课的教学目标,我们将采用以下教学方法:1.讲授法:讲解Java基本语法和面向对象编程思想;2.案例分析法:分析实际编程案例,让学生更好地理解和掌握知识;3.实验法:让学生动手实践,编写聊天小应用程序,提高实际操作能力。
四、教学资源为了支持本节课的教学内容和教学方法的实施,我们将准备以下教学资源:1.教材:《Java编程思想》;2.参考书:《Java核心技术》;3.多媒体资料:教学PPT、视频教程;4.实验设备:计算机、网络环境。
通过以上教学资源的使用,丰富学生的学习体验,提高学习效果。
五、教学评估本节课的教学评估将采用多种方式,以全面、客观、公正地评价学生的学习成果。
评估方式包括:1.平时表现:通过学生在课堂上的参与度、提问回答、小组讨论等表现,评估其对知识的掌握和应用能力。
java课程设计聊天小程序解析
break;
if(i>=clientVector.size()){//昵称不存在则:
nick=msg;//在clientVector中添加本线程信息
msg="#您使用的昵称:"+msg;//并通告所有线程的客户端,本用户进入
noticeAddUser();//以与请求其他有用户信息
clientVector.add(this);
requestAllUser();
firstRead=false;
}
else{
msg="#您输入的昵称已经存在,请重新输入:";//昵称存在,发送系统提示
}
return msg;
}
if(msg.startsWith("!")==true){//若客户端发送密语
关闭Socket结束与当前的拆除连接关闭Socket结束与server的通信
client的通信等待其他的请求
关闭ServerS或程序代码(可以加页):
主要代码:服务端ChatServer
class SocketThread extends Thread{//线程类,用于和每个客户端连接
端口提供监听服务
等待来自chartclient的服务
请求
接受chartclient端的请求用建立连接创建Socket对象向server的监听端
返回的Socket建立连接 口请求
通过向Socket中读写数据来数据通信通过向新的Socket中读写数据来
与chartclient端通信 与server端通信
if(clientVector.get(i).nick.equals(this.nick)==false)
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简易聊天室课程设计一、课程目标知识目标:1. 让学生掌握Java网络编程基础知识,理解TCP/IP协议和Socket通信原理;2. 学会使用Java语言构建简易聊天室程序,了解客户端与服务器之间的数据传输过程;3. 了解多线程编程在聊天室中的应用,掌握线程的创建、同步与通信方法。
技能目标:1. 培养学生运用所学知识解决实际问题的能力,具备独立设计并实现简易聊天室程序的能力;2. 提高学生的编程实践能力,学会使用调试工具分析问题、解决问题;3. 培养学生的团队协作能力,学会在项目开发中分工合作、共同进步。
情感态度价值观目标:1. 培养学生对编程的兴趣和热情,提高学习积极性;2. 培养学生勇于尝试、善于思考、面对问题主动解决的良好习惯;3. 增强学生的网络安全意识,学会在聊天过程中保护个人隐私。
分析课程性质、学生特点和教学要求,本课程旨在通过实际操作,让学生深入了解Java网络编程知识,掌握简易聊天室的设计与实现。
课程目标具体、可衡量,便于学生和教师在教学过程中明确预期成果,为后续教学设计和评估提供依据。
1. Java网络编程基础:讲解TCP/IP协议,Socket通信原理,以及常用类和方法;- 课本章节:第五章 网络编程,第1-2节;- 内容安排:网络通信基本概念,Socket编程,ServerSocket编程。
2. 简易聊天室设计与实现:- 课本章节:第五章 网络编程,第3-4节;- 内容安排:客户端与服务器程序设计,多线程实现,字符串处理,异常处理。
3. 聊天室功能拓展:- 课本章节:第五章 网络编程,第5节;- 内容安排:文件传输,用户列表管理,消息加密与解密。
4. 调试与优化:- 课本章节:第六章 异常处理与调试,第1-2节;- 内容安排:使用调试工具,分析问题,优化代码,提高程序稳定性。
5. 项目实践:- 课本章节:第五章 网络编程,第六章 异常处理与调试;- 内容安排:分组进行项目实践,完成简易聊天室程序设计与实现,进行功能拓展和优化。
聊天室java课程设计
聊天室java课程设计一、课程目标知识目标:1. 理解Java网络编程的基本原理,掌握聊天室程序设计的相关知识;2. 学会使用Java语言中的Socket编程,实现客户端与服务器之间的通信;3. 了解多线程编程在聊天室中的应用,掌握线程的创建和管理方法。
技能目标:1. 能够独立编写一个基于Java的聊天室程序,实现文字信息的发送与接收;2. 学会使用Java异常处理机制,提高程序的稳定性和可靠性;3. 培养良好的编程习惯,提高代码编写质量。
情感态度价值观目标:1. 培养学生对编程的兴趣,激发学习积极性;2. 培养学生的团队协作精神,提高沟通能力;3. 增强学生的网络安全意识,遵守网络道德规范。
课程性质:本课程为实践性较强的课程,要求学生在理解理论知识的基础上,动手实践,完成一个具体的聊天室程序设计。
学生特点:学生处于高年级阶段,已经具备一定的Java编程基础,但网络编程和多线程编程方面可能较为陌生。
教学要求:结合学生特点和课程性质,本课程要求教师以引导为主,注重理论与实践相结合,鼓励学生积极参与讨论和动手实践,提高编程能力。
在教学过程中,关注学生的个体差异,提供针对性的指导和帮助,确保学生能够达到课程目标。
通过本课程的学习,使学生能够掌握聊天室程序设计的相关技能,为后续深入学习网络编程打下坚实基础。
二、教学内容1. Java网络编程基础- 网络编程基本概念- 网络协议与网络模型- InetAddress类和InetSocketAddress类2. Socket编程- Socket和ServerSocket类的作用- 客户端与服务器通信原理- 字节流和字符流的使用3. 多线程编程- 线程的概念与创建方式- 线程的生命周期与控制- 线程同步与线程通信4. 聊天室程序设计- 聊天室功能需求分析- 客户端与服务器端程序设计- 文字消息的发送与接收5. 异常处理与程序优化- Java异常处理机制- 常见异常类型与处理方法- 程序优化与调试技巧6. 网络安全与网络道德- 网络安全基本概念- 网络道德规范- 聊天室中的信息安全教学内容安排与进度:第一周:Java网络编程基础,掌握InetAddress类和InetSocketAddress类的使用;第二周:Socket编程,学习客户端与服务器通信原理,实现简单的回显程序;第三周:多线程编程,了解线程的概念,学会创建和管理线程;第四周:聊天室程序设计,分析需求,编写客户端与服务器端程序;第五周:异常处理与程序优化,学习异常处理机制,对聊天室程序进行优化;第六周:网络安全与网络道德,了解网络安全知识,提高网络道德意识。
java聊天小程序课程设计
java聊天小程序课程设计一、课程目标知识目标:1. 让学生理解Java网络编程的基本原理,掌握Socket编程的基础知识。
2. 使学生掌握多线程编程技术,能够实现简单的聊天功能。
3. 帮助学生了解常用的数据结构和算法在聊天小程序中的应用。
技能目标:1. 培养学生运用所学知识独立设计并实现一个简单的Java聊天小程序的能力。
2. 提高学生的问题分析和解决能力,能够在实际编程过程中遇到问题时进行有效调试和优化。
3. 培养学生团队协作能力,能够与同学共同完成课程设计任务。
情感态度价值观目标:1. 激发学生对计算机编程的兴趣和热情,提高学习积极性。
2. 培养学生的创新意识和实践能力,敢于尝试新技术和新方法。
3. 引导学生树立正确的网络道德观念,遵循网络文明规范,养成良好的网络行为习惯。
课程性质:本课程设计属于实践性较强的课程,旨在让学生在实际操作中掌握Java网络编程知识,提高编程能力。
学生特点:学生已具备一定的Java基础,对网络编程有一定了解,但实际操作经验不足,需要通过实践提高。
教学要求:结合学生特点和课程性质,教师应注重理论与实践相结合,引导学生通过动手实践掌握知识,培养其编程能力和团队协作能力。
在教学过程中,关注学生的学习进度和问题,及时给予指导和帮助。
最终通过课程设计评估学生的学习成果。
二、教学内容1. 理论知识:- 网络编程基础:IP地址、端口、TCP/IP协议。
- Java Socket编程:Socket和ServerSocket类的使用,客户端与服务器通信流程。
- 多线程编程:线程的创建与控制,线程同步与互斥。
- 常用数据结构与算法:链表、队列、栈等在聊天小程序中的应用。
2. 实践操作:- 设计并实现简单的聊天服务器和客户端程序。
- 使用多线程实现多用户聊天功能。
- 数据传输加密与解密技术。
- 聊天界面的设计与实现。
3. 教学大纲:- 第一周:网络编程基础,Java Socket编程。
java课程设计报告--聊天小程序
课程设计说明书课程名称:Java 程序设计专业:班级:设计人:2015年1 月14日课程设计任务书一、课程设计题目:聊天小程序二、设计原始资料:1、雍俊海,《 Java 程序设计教程》,清华大学出版社,2007;2、耿祥义,张跃平,《Java 2实用教程》,清华大学出版社;3、张跃平,耿祥义,《Java 2实验指导》,清华大学出版社;三、设计应解决下列各主要问题:1 、用图形用户界面;(使用socket通信)2、能实现一个聊天室中的多人聊天;3、可以实现两个私聊;四、设计说明书应附有下列图纸:运行结果截图五、小组分工说明:六、命题发出日期:2014.12.29设计完成日期:2015.1.14指导教师评语成绩:指导教师(签章):年月日目录1需求分析说明,,,,,,,,,,,,,,,,,,,,,,11.1 背景, ,, ,, ,,,,,,,,,,,,,,,,,11.2功能要求 ,,,,,,,,,,,,,,,,,,,,,,,11.3运行环境 ,,,,,,,,,,,,,,,,,,,,,,,11. 4 功能实现,,,,,,,,,,,,,,,, ,, ,, ,,1 2概要设计说明,,,,,,,,,,,,,,,,,,,,,,22.1模块调用图 ,,,,,,,,,,,,,,,,,,,,,,,22.2套接字连接示意图 ,,,,,,,,,,,,,,,,,,,,22.3主要函数声明 ,,,,,,,,,,,,,,,,,,,,,,2 3详细设计说明 ,,,,,,,,,,,,,,,,,,,,,,43.1 功能描述,,, ,,,,,,,,,,,,,,,,,,43.2主要功能详述 ,,,,,,,,,,,,,,,,,,,,,43.3主要代码分析 ,,,,,,,,,,,,,,,,,,,,,,5 4调试分析, ,, ,,,,,,,,,,,,,,,,,,,94.1 遇到的问题,, ,,,,,,,,,,,,,,,,,,94.2测试结果分析 ,,,,,,,,,,,,,,,,,,,,,,10 5用户使用说明,,,,,,,,,,,,,,,,,,,,,10 6课程设计总结,,,,,,,,,,,,,,,,,,,,,12 7附录,,,,,, ,,,,,,,,,,,,,,,, 1 31需求分析说明1.1背景在当今的信息时代,越来越多的聊天工具被应用,Java 语言是当今流行的网络编程语言,它具有面向对象、与平台无关、安全、多线程等特点。
聊天小程序java课程设计
聊天小程序java课程设计一、教学目标本课程的目标是让学生掌握Java语言基础,学会使用Java编写简单的聊天小程序。
通过本课程的学习,学生将能够:1.理解Java语言的基本语法和结构;2.掌握Java语言的面向对象编程思想;3.学会使用Java语言编写简单的聊天小程序;4.培养学生的编程兴趣和动手能力。
二、教学内容本课程的教学内容主要包括以下几个部分:1.Java语言基本语法和结构;2.Java语言的面向对象编程思想;3.聊天小程序的设计与实现;4.编程实践和调试技巧。
具体到教材的章节,我们将学习第1-4章的内容。
三、教学方法为了达到上述教学目标,我们将采用以下教学方法:1.讲授法:讲解Java语言的基本语法和结构,以及面向对象编程思想;2.案例分析法:通过分析实际的聊天小程序案例,让学生理解和掌握编程技巧;3.实验法:让学生动手编写和调试聊天小程序,提高编程能力。
四、教学资源为了支持教学内容和教学方法的实施,我们将准备以下教学资源:1.教材:《Java编程思想》;2.参考书:《Java核心技术》;3.多媒体资料:教学PPT、视频教程等;4.实验设备:计算机、网络环境等。
通过以上教学资源的支持,我们将帮助学生更好地学习Java语言,掌握聊天小程序的编写技巧。
五、教学评估本课程的评估方式包括平时表现、作业和考试三个部分,每个部分所占比例分别为30%、30%和40%。
平时表现主要考察学生的课堂参与度和团队合作能力,作业评估主要考察学生的编程能力和理解程度,考试则是对学生整体学习成果的检验。
评估方式将力求客观、公正,全面反映学生的学习成果。
六、教学安排本课程的教学进度共分为12周,每周安排2课时,共计24课时。
教学地点选在学校的计算机实验室,以便学生进行实践操作。
教学安排将紧凑合理,确保在有限的时间内完成教学任务。
同时,教学安排还将考虑学生的实际情况和需要,如学生的作息时间、兴趣爱好等,尽量满足学生的学习需求。
java编写聊天程序课程设计
java编写聊天程序课程设计一、课程目标知识目标:1. 学生能理解网络编程的基本概念,掌握TCP/IP协议和套接字编程的基础知识;2. 学生能运用Java语言编写简单的聊天程序,实现客户端与服务器之间的文字通信;3. 学生了解多线程编程在聊天程序中的应用,并能实现简单的多客户端聊天功能。
技能目标:1. 学生掌握使用Java语言进行网络编程的基本方法,具备编写简单聊天程序的能力;2. 学生能够运用所学知识,解决实际编程过程中遇到的问题,如异常处理、线程同步等;3. 学生具备调试和优化程序的能力,提高聊天程序的稳定性和性能。
情感态度价值观目标:1. 学生通过学习Java聊天程序的开发,培养对编程的兴趣和热情,提高主动学习的意识;2. 学生在团队协作中,学会沟通与交流,增强合作意识,培养解决问题的能力;3. 学生认识到编程在现实生活中的应用价值,激发对信息技术的热爱,为未来的学习和发展奠定基础。
课程性质:本课程为实践性较强的课程,以项目为导向,结合课本知识,让学生在实际操作中掌握Java网络编程技术。
学生特点:学生具备一定的Java基础,对网络编程有一定了解,但实践经验不足。
教学要求:教师需结合课本内容,注重实践操作,引导学生掌握Java网络编程的核心技术,培养解决实际问题的能力。
在教学过程中,关注学生的个体差异,给予个性化指导,确保每位学生都能达到课程目标。
通过课程学习,使学生能够独立完成一个简单的Java聊天程序。
二、教学内容1. 网络编程基础- TCP/IP协议原理及其应用- 套接字编程概念及分类- 网络字节序与主机字节序转换2. Java网络编程- Java Socket编程基础- 客户端与服务器的创建与连接- 字符串传输与编码问题3. 多线程编程- 线程的创建与运行- 线程同步与通信- 多线程服务器的设计与实现4. 聊天程序设计与实现- 客户端界面设计- 服务器端处理多客户端连接- 文字消息的发送与接收5. 程序调试与优化- 异常处理与程序健壮性- 性能分析与优化- 代码规范与重构教学内容安排与进度:第一周:网络编程基础,学习TCP/IP协议及套接字编程;第二周:Java网络编程,实现简单的Socket通信;第三周:多线程编程,掌握线程的创建与同步;第四周:聊天程序设计与实现,完成客户端与服务器端功能;第五周:程序调试与优化,提高聊天程序的稳定性和性能。
java课程设计-聊天程序
学院Java程序设计课程设计题目:聊天程序学生:Puter学号: 6所在院(系):数学与计算机学院专业:网络工程班级:2013级网本指导教师:吴建斌职称:导师2014 年12 月31 日学院本科学生课程设计任务书注:任务书由指导教师填写。
课程设计(论文)指导教师成绩评定表目录摘要 (1)一、需求分析 (1)二、概要设计 (3)三、详细设计............................................4四、调试分析.. (4)五、结论 (14)六、实验分工 (14)七、参考文献 (14)摘要在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,例如,国外的ICQ、国腾讯公司开发的OICQ。
基于Java网络编程的强大功能,本次毕业设计使用Java编写一个聊天系统。
一般来说,聊天工具大多数由客户端程序和服务器程序外加服务器端用于存放客户数据的数据库组成,本系统采用客户机/服务器架构模式通过Java提供的Soket类来连接客户机和服务器并使客户机和服务器之间相互通信,由于聊天是多点对多点的而Java提供的多线程功能用多线程可完成多点对多点的聊天,数据库管理系统用SQL Server2000完成并通过JDBC-ODBC桥访问数据库。
现在的各种聊天工具功能越来越强大,但是它们的唯一的不足就是必须要联网或者下载到它们的服务端,要不然是没法脱离Intenet使用的。
为了能在一个没有连接到Intenet的局域网使用聊天工具,那就必须要有服务器端。
本系统就是包括服务器端与客户端,可以在局域网聊天的一个工具。
建立在JAVA平台上,系统的设计使用了面向对象技术和面向对象的设计原则。
系统采用C/S结构,客户端与客户端以及客户端与服务器端之间通过Socket传送消息。
使用JAVA语言编写,开发工具采用Eclipse。
服务器端设计与实现过程中,采用了多线程技术,可以在单个程序当中同时运行多个不同的线程,执行不同的任务。
用java语言编一个聊天小程序
用java语言编一种聊天小程序规定:使用图形顾客界面。
能实现一种聊天室中多人聊天。
可以两人私聊。
提示: 使用socket通信import java.awt.*;import java.awt.event.*;import javax.swing.*;import .*;import java.io.*;public class test{public static void main(String[] args){EventQueue.invokeLater(new Runnable(){public void run(){DrawFrame frame = new DrawFrame();frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);}});}}class DrawFrame extends JFrame{public DrawFrame(){setLocation(100,100);setTitle("我旳QQ");setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);//添加菜单项……JMenuBar menuBar = new JMenuBar();setJMenuBar(menuBar);JMenu edit = new JMenu("菜单");menuBar.add(edit);JMenuItem sset = new JMenuItem("设立");JMenuItem eexit = new JMenuItem("退出");edit.add(sset);edit.addSeparator();edit.add(eexit);final DrawPanel pan = new DrawPanel();//添加设立对话框sset.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent event) {final JFrame jf = new JFrame("设立");jf.setSize(300,150);jf.setLocation(200,200);jf.setResizable(false);jf.setVisible(true);JPanel jp = new JPanel();final JTextField jt1 = new JTextField(20);final JTextField jt2 = new JTextField(20);final JTextField jt3 = new JTextField(20);jp.add(new JLabel("聊天端口:"));jf.add(jp);jp.add(jt1);jp.add(new JLabel("目旳地址:"));jp.add(jt2);jp.add(new JLabel("文献端口:"));jp.add(jt3);JButton jb1 = new JButton("拟定");JButton jb2 = new JButton("取消");jp.add(jb1);jp.add(jb2);//设立“设立”按钮jb1.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event){ try{int cat1 = Integer.parseInt(jt1.getText());pan.setCat1(cat1);//设立对话端标语int cat2 = Integer.parseInt(jt3.getText());pan.setCat2(cat2);//设立文献传播端标语String s = jt2.getText();pan.setIP(s);//设立IP地址pan.ls();}catch(Exception e){e.printStackTrace();}jf.dispose();//关闭对话框}});jb2.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event){jf.dispose();}});}});eexit.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event){System.exit(0);}});add(pan);pack();}public static final int DEFAULT_WIDTH = 400; public static final int DEFAULT_HEIGHT = 400;}class DrawPanel extends JPanel{DatagramSocket ds;DatagramPacket dp;DatagramSocket ds1;DatagramPacket dp1;Thread thread;Thread thread1;TextArea textArea1 = new TextArea(10,50); TextArea textArea2 = new TextArea(10,50); JTextField textField = new JTextField(50);static int cat1,cat2;static String IP;public void setCat1(int cat){cat1 = cat;}public void setCat2(int cat){cat2 = cat;}public void setIP(String ip){IP=ip;}//重置端标语public void ls(){try{ds = new DatagramSocket(cat1);ds1 = new DatagramSocket(cat2);}catch(Exception e){e.printStackTrace();}thread = new Thread(new Runnable(){public void run(){byte buf[] = new byte[1024];//聊天每次发送文字不能超过1024bDatagramPacket dp = new DatagramPacket(buf,buf.length);while(true){try{ds.receive(dp);textArea1.setText(textArea1.getText()+ new String(buf,0,dp.getLength()) + "\r\n");}catch(Exception e){e.printStackTrace();}}}});thread.start();}public DrawPanel(){setLayout(new BorderLayout());JTabbedPane card = new JTabbedPane();textArea1.setEditable(false);card.add("聊天",textArea1);add(card,BorderLayout.NORTH);JPanel center = new JPanel();center.setLayout(new FlowLayout());center.add(new JLabel("昵称: "));center.add(textField);add(center,BorderLayout.CENTER);JPanel south = new JPanel();south.setLayout(new BorderLayout());south.add(textArea2,BorderLayout.NORTH);JPanel south2 = new JPanel();south2.setLayout(new FlowLayout());JButton sent = new JButton("传送文献");JButton receive = new JButton("接受文献");//receive.setEnabled(false);JButton sentMessage = new JButton("发送");south2.add(sent);south2.add(receive);south2.add(sentMessage);add(south,BorderLayout.SOUTH);south.add(south2,BorderLayout.SOUTH);//发送信息旳按钮旳监听器:sentMessage.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event){textArea1.append(textField.getText()+":"+textArea2.getText()+"\n");String s;try{s = textField.getText() + ":" + textArea2.getText();byte[] buf = s.getBytes();dp = newDatagramPacket(buf,buf.length,InetAddress.getByName(IP),cat1);ds.send(dp);textArea2.setText("");}catch (Exception ex){ex.printStackTrace();}}});//发送文献旳按钮旳监听器sent.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event){JFrame f = new JFrame("打开");f.setSize(400,300);JFileChooser chooser = new JFileChooser();f.add(chooser);int returnVal = chooser.showOpenDialog(f);if(returnVal == JFileChooser.APPROVE_OPTION){textArea1.append("正在传送文献:"+chooser.getCurrentDirectory()+"\\"+chooser.getSelectedFile().getName()+"\n");try{byte[] b = new byte[10248];FileInputStream fis = new FileInputStream(chooser.getSelectedFile());DataInputStream dos =new DataInputStream(fis);dos.read(b);dp1 = newDatagramPacket(b,b.length,InetAddress.getByName(IP),cat2);ds1.send(dp1);}catch (Exception e){e.printStackTrace();}}}});//接受文献旳按钮旳监听器:receive.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event){JFrame f1 = new JFrame("保存");f1.setSize(400,300);byte buf[] = new byte[10248];DatagramPacket dp1 = new DatagramPacket(buf,buf.length);JFileChooser ch = new JFileChooser();f1.add(ch);int a = ch.showSaveDialog(f1);if(a ==JFileChooser.APPROVE_OPTION){String fileName = ch.getSelectedFile().getPath();try{ds1.receive(dp1);FileOutputStream fos = new FileOutputStream(fileName);fos.write(buf);}catch(Exception e){e.printStackTrace();}}}});}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
java课程设计聊天小程序课程设计指导书姓名学号班级一班课程名称Java课程设计课程性质设计时间2010年11月4日——2010年12月31日设计名称聊天小程序设计目的本次课程设计是对前面学过的面向对象的编程思想以及编程方法的一个总结、回顾和实践。
开始设计前学生一定要先回顾以前所学的内容,明确本次设计所要用到的技术点并到网上搜索以及查阅相关的书籍来搜集资料。
通过编写一个基于JA V A的应用系统综合实例,来掌握Java语言编程技巧。
设计要求1、使用图形用户界面。
2、能实现一个聊天室中多人聊天。
3、可以两人私聊。
计划与进度计划在两个月内完成任务,首先在前半个月内(11月4日--11月19日),构思通过网上(图书馆)的知识与课本上的相关内容的了解与认识,确认好选择的课题与怎样设计,基本的思路想好。
十五天(11月19日--12月5日)内参考资料争取完成服务端的程序,在12月5日--12月20日完成客户端的程序设计,在12月20日—12月30日内完成实现报告的填写工作。
在12月31日全面完成整个课题,并上交给老师。
任课教师意见备注课程设计报告课程:学号:姓名:班级教师:时间计算机科学与技术设计名称:聊天小程序日期:2010 年11月 4 日设计内容:设计一个在图形界面下,实现一个聊天室中多人聊天,也可以私聊的聊天小程序设计目的与要求:目的是为了更好的掌握java 这门课程的内容,同时更好的理解与掌握socket 编程,对所有面向对象的编程思想以及编程方法的一个总结、回顾和实践,掌握Java语言编程技巧。
要求使用图形用户界面。
能实现一个聊天室中多人聊天。
可以两人私聊。
(提示:使用socket通信)程序描述清晰准确,思路清晰,程序能够实现相应的功能。
设计环境或器材、原理与说明、主要完成的功能、设计思路和框图:设计环境或者器材:j d k或者j c编辑器,笔记本电脑两台,网线三条,小型交换机一个。
原理与说明:建立服务端与客户端的一个或者多个连接,其中服务器,使用Server Socket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。
客户端,使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。
客户端不需要指定打开的端口,通常临时的、动态的分配一个1024以上的端口。
主要功能:1、实现服务端与客户端的连接,实现两者之间的信息交换。
2、实现了一个服务器可以与多个客户端实现连接,即实现了一个聊天室里面可以多人聊天。
3、亦可以实现私聊的功能。
设计思路与框图:服务器端接受客户端的连接请求,同时启动一个线程处理这个连接,线程不停的读取客户端输入,然后把输入加入队列中,等候处理。
在线程启动的同时将线程加入队列中,以便在需要的时候定位和取出。
大概的框图:chatServer端chatclient端︳创建ServerSocket对象在某端口提供监听服务等待来自chartclient的服务请求接受chartclient端的请求用建立连接创建Socket对象向server的监听端返回的Socket建立连接口请求通过向Socket中读写数据来数据通信通过向新的Socket中读写数据来与chartclient端通信与server端通信关闭Socket结束与当前的拆除连接关闭Socket结束与server的通信client的通信等待其他的请求关闭ServerSocket对象结束监听服务设计过程(步骤)或程序代码(可以加页):主要代码:服务端ChatServerclass SocketThread extends Thread{//线程类,用于和每个客户端连接static Vector<SocketThread> clientVector=new Vector<SocketThread>();//存放每个线程信息private Socket socket; //存放每个线程的Socket对象String nick; //存放每个线程的昵称private boolean firstRead;//用于判断是否为第一次接收数据SocketThread(Socket s){//构造函数socket=s;nick=null;firstRead=true;}private void noticeDelUser(){//通告所有线程的客户端,本用户退出String msg="###"+this.nick;for(int i=0;i<clientVector.size();i++)if(clientVector.get(i).nick.equals(this.nick)==f alse)sendMsg(i,msg);}private void delSocket(){//关闭socketnoticeDelUser(); //通告所有线程的客户端,本用户退出clientVector.remove(this);//从clientVector中移除本线程try{socket.close();System.out.println(socket.getInetAddress()+"断开连接!!");}catch(IOException closeError){}}private void noticeAddUser(){//通告所有线程的客户端,本用户进入String msg="##"+this.nick;for(int i=0;i<clientVector.size();i++)sendMsg(i,msg);}private void requestAllUser(){//本线程请求其他有用户信息int index=0;int i=0;for(i=0;i<clientVector.size();i++)if(clientVector.get(i).nick.equals(this.nick))break;index=i;for(i=0;i<clientVector.size();i++)if(index!=i){Stringmsg="##"+clientVector.get(i).nick;sendMsg(index,msg);}}private String msgForward(String msg){//对接收到的信息转发String name; //存放目的用户昵称String tempMsg; //存放生成的转发数据if(firstRead==true){ //若为第一次收到数据int i;for(i=0;i<clientVector.size();i++)//检查昵称是否存在if(clientVector.get(i).nick.equals(msg)==true)break;if(i>=clientVector.size()){//昵称不存在则:nick=msg; //在clientVector中添加本线程信息msg="#您使用的昵称:"+msg;//并通告所有线程的客户端,本用户进入noticeAddUser(); //以及请求其他有用户信息clientVector.add(this);requestAllUser();firstRead=false;}else{msg="#您输入的昵称已经存在,请重新输入:"; //昵称存在,发送系统提示}return msg;}if(msg.startsWith("!")==true){//若客户端发送密语name=msg.substring(1, msg.indexOf(' ')); //获得目的用户昵称,生成发送信息tempMsg=this.nick+"悄悄对"+name+"说:\r\n\t"+msg.substring(msg.indexOf(' '));}else{tempMsg=this.nick+":\r\n\t"+msg;//若为全体聊天name="610665c2a05631a7bc460993bae36ee6 "; //此name为特殊值,专指全体聊天}if(name.equals("610665c2a05631a7bc460993b ae36ee6")==false){//若为密语int i=0;for(;i<clientVector.size();i++)//查找目的客户线程在clientVector中的位置if(clientVector.get(i).nick.equals(name)==true )break;if(i>=clientVector.size()){//若找不到目的客户线程,则返回系统提示msg="#您所发送的用户名昵称不存在!!";}else{sendMsg(i,tempMsg);//找到目的客户线程并转发}}else{ //为全体聊天,全体转发int i=0;for(;i<clientVector.size();i++)sendMsg(i,tempMsg);}return msg;}private void sendMsg(int index,String msg){ //向特定客户转发,msg为转发信息SockettempSocket=clientVector.get(index).socket;//index为客户在clientVector中位置try{PrintWriter pw=newPrintWriter(tempSocket.getOutputStream(),tru e);pw.println(msg);}catch(IOException printError){}}public void run(){ //建立读写流String msg=null;InputStreamReader isr=null;BufferedReader br=null;try{isr=newInputStreamReader(socket.getInputStream());br=new BufferedReader(isr);}catch(IOException inOutError){System.out.println("无法与客户建立流!!");delSocket();return;}do{try{msg=br.readLine();}catch(IOException readError){System.out.println("读取流数据错误!!");delSocket();return;}System.out.println(msg);msg=msgForward(msg);//处理读取的数据if(msg.startsWith("#")==true){//若有系统提示返回,则返回系统提示try{PrintWriter pw=new PrintWriter(socket.getOutputStream(),true);pw.println(msg);}catch(IOException printError){}}}while(true);}}public class ChatServer {public static void main(String args[]){ServerSocket serverSocket=null;Socket socket=null;SocketThread st;try{serverSocket=new ServerSocket(8324);//监听端口8324System.out.println("服务器启动成功,正在监听8324端口!!");}catch(IOException e){System.out.println("不能使用端口8324,无法启动服务器!!");return;}while(true){try{socket=serverSocket.accept();//获得连接,并建立Socket}catch(IOException e){System.out.println("不能建立连接:"+socket.getInetAddress().toString()+"/"+socket .getPort());}st=new SocketThread(socket);//创建新线程System.out.println("建立连接:"+socket.getInetAddress().toString()+"/"+socket .getPort());st.start(); //开始新线程}}}客户端ChartClient主要代码:package ch02;private void initSocket(){ //对socket的初始化try{transferSocket=newSocket("localhost",8324); //与服务器建立连接ReceiveThread rt=new ReceiveThread(transferSocket,this);rt.start(); //开启新线程用于读取数据流}catch(IOException createError){//出现错误则退出程序welcomeInfo.setText("无法连接服务器!!");try{transferSocket.close();welcomeInfo.setText("与服务器连接已经断开!!");System.exit(0);}catch(IOException closeError){}System.exit(0);} //对输出流的初始化try{socketWriter=newPrintWriter(transferSocket.getOutputStream(),t rue);}catch(IOException streamError){welcomeInfo.setText("流建立错误!!");try{transferSocket.close();welcomeInfo.setText("与服务器连接已经断开!!");System.exit(0);}catch(IOException closeError){}System.exit(0);}}public void addNewMsg(String msg){//向chatRecord中追加数据chatRecord.append(msg+"\r\n");}public void setWelcome(String msg){//改变welcomeInfo值welcomeInfo.setText(msg);}public void windowIconified(WindowEvent e){}public void windowClosed(WindowEvent e){} public void windowDeactivated(WindowEvent e){}public void windowActivated(WindowEvent e){}public void windowClosing(WindowEvent e){//窗体关闭事件System.exit(0);}public void windowDeiconified(WindowEvent e){}public void windowOpened(WindowEvent e){}public void keyPressed(KeyEvent e){//对键盘事件的监视switch(e.getKeyCode()){case KeyEvent.VK_ENTER ://回车键,就发送信息sendMsg(); //向服务器发送信息break;case KeyEvent.VK_CANCEL://esc键则,friendList选中第0项friendList.select(0);transName.setText("发送给:"+friendList.getSelectedItem().toString());break;default :}}public void keyTyped(KeyEvent e){}public void keyReleased(KeyEvent e){} public void itemStateChanged(ItemEvent e){//监视friendList选中项变化if(e.getSource().equals(friendList)){//改变transName值transName.setText("发送给:"+friendList.getSelectedItem().toString());}}public void textValueChanged(TextEvent e){//若chatRecod字符多余100000 if(chatRecord.getText().length()>100000){//则清除部分历史记录,防止占用过大内存chatRecord.setText(chatRecord.getText().subs tring(chatRecord.getText().indexOf("\r\n")+2));}}public void actionPerformed(ActionEvent e){//点击sendButton则发送信息if(e.getSource()==sendButton){sendMsg();}}public void sendMsg(){//向服务器发送信息if(msgEditor!=null){if(friendList.getSelectedIndex()==0){//发送全体聊天信息socketWriter.println(msgEditor.getText());}else{ //发送密语,并回显socketWriter.println("!"+friendList.getSelect edItem().toString()+" "+msgEditor.getText());chatRecord.append(this.nick+"对"+friendList.getSelectedItem().toString()+"悄悄说:\r\n\t"+msgEditor.getText()+"\r\n");}}else //若发送信息为空,则系统提示chatRecord.append("!不能发送空消息\r\n");msgEditor.setText("");//将发送信息栏置空}}class ReceiveThread extends Thread{//监视输入流的类Socket socket; //连接服务器的socketClientWindows clientWindow;//主窗口ReceiveThread(Socket s,ClientWindows cw){//初始化socket=s;clientWindow=cw;}public void run(){String msg=null;BufferedReader br=null;try{ //建立输入流br=new BufferedReader(new InputStreamReader(socket.getInputStream()));}catch(IOException ReadError){clientWindow.setWelcome("读入流建立错误,程序关闭!!");try{socket.close();clientWindow.setWelcome("与服务器连接已经断开!!");System.exit(0);}catch(IOException closeError){}System.exit(0);}while(true){ //读取数据流的信息try{msg=br.readLine(); //获得信息}catch(IOException e){try{socket.close();clientWindow.setWelcome("与服务器连接已经断开!!");System.exit(0);}catch(IOException closeError){}System.exit(0);}msg=msgChange(msg);//转变读取到的信息if(msg!=null)clientWindow.addNewMsg(msg);//向聊天窗口添加新聊天内容}}private String msgChange(String msg){if(msg.startsWith("###")){//删除摸一个用户的信息for(inti=1;i<clientWindow.friendList.getItemCount();i ++){if(clientWindow.friendList.getItem(i).toString ().equals(msg.substring(3)))clientWindow.friendList.remove(i);}clientWindow.friendList.select(0);return null;}else if(msg.startsWith("##")){//增加某一个用户信息clientWindow.friendList.add(msg.substring(2 ));clientWindow.friendList.select(0);return null;}else if(msg.startsWith("#")){ //系统提示msg="!"+msg.substring(1);if(msg.startsWith("!您使用的昵称:"))clientWindow.nick=msg.substring(8);}return msg;}}设计结果与分析(可以加页):运行ChatServer服务端,运行ChatClient端的界面如下图:当打开两个或者多个客户端时:实现多人会话或者一对一的会话,界面如下图私聊即点击想要私聊的用户名即可;设计体会与建议:该实验中运用到了一些以前没有了解的东西:首先是. Accept方法用于产生"阻塞",直到接受到一个连接,并且返回一个客户端的Socket对象实例。