java课程设计报告(java聊天室)

合集下载

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

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

课程设计之迟辟智美创作网络聊天室院(系) 别信电学院班级计算102学号姓名指导教师时间2013-4-18—2013-5-10课程设计任务书题目网络聊天室课程设计系 (部) 信电学院专业计算机科学与技术班级计算102学生姓名学号4月 18 日至 5 月 10 日共 4 周指导教师(签字) 系主任(签字)年月日成绩评定表目录摘要私達の実践の能力を高めるため、学んだ知識を運用することができて行って更に創造して、学校は特に2週間手配して、私達にVisual C++の課程の設計の実習を行わせます.このファイルの詳しい説明はVisual C++6.0環境の下で、1つのソフトウェアの過程を設計して、このソフトウェアは各種のデータの個数を統計したのです.このソフトウェアの機能は、ユーザーは1段の文字を入力して、ソフトウェアは文字の中の各類のデータの数を記録して、英文のデータの数、数字のデータの数、空欄のデータの数とそれのタイプのデータの数を含んで、そしてそれらを明らかに示します.以下、課程を通して説明を設計して、データはソフトウェアの説明を統計して、プログラムは説明を調整して、総括などの方面を開発して、詳しくこのプログラムの製作の過程を説明して、作用、各種の実行することができる把持.关键字:データの統計,VC++6.0, ヘッドファイル课程设计概述`随着计算机网络日新月异的发展,人们的交流方式越来越多,传统的交流方式,如:信件、电报、德律风等已经难以满足人们的交流要求,在互联网上即时的和好友取得联系,已经成为现今社会人们主流的联系方式.因此,两台计算机之间进行即时通讯、发送文件等交流方式已经成为肯定潮水.因此呈现了QQ等聊天工具,然而QQ等聊天工具虽然方便、实用,可是,娱乐功能太多,有很多吸引人的娱乐功能,从一定水平上来说,是一种娱乐工具,不能作为用于即时通讯、文件共享的专用工具.目前,用于实现单一的即时通讯、文件共享的软件实在太少,而且,它们中年夜部份都是绝对的C/S模式,对远程服务器有非常年夜的依赖性,没有完全实现点对点的交流.为此,我决定开发一个专用于实现两台计算机之间即时通讯、文件共享的软件,以方便两台计算机之间信息的交流.防止了服务器忙或与服务器无法连接时,浪费过多时间用于和服务器建立连接.因此,这个软件是极具适应性和实用性的即时通讯软件.实现网络聊天的功能,采纳Windows Socket(或Java Socket)编程,服务器与客户端采纳了TCP/IP连接方式,在设计聊天方案时,可将所有信息发往服务器端,再由服务器进行处置,服务器端是所有信息的中心.服务器端要保管用户信息,可利用数据库来实现这一功能,需要建立用户信息数据库.在客户端可采纳文件系统保管聊天纪录和用户号码.可通过闪动托盘图标和播放分歧的音乐提示信息到来及好友上线等信息.可通过建立消息链表来保管用户接收的各种消息.环境需求分析运行环境:Windows 9x、2000、XP、Windows 7、eclipse开发环境硬件环境:CPU 400MHz以上,内存512MB以上学生信息管理系统软件总体设计该C/S模式的聊天系统,就是服务器来提供服务端连接响应,客户端主动的发起连接请求.当多个用户同时连接到服务器时,经由服务器的接收与转发即可以实现客户之间的通信.对整体系统的流程,也是分为两部份,即客户真个发起请求,服务器响应请求.首先是客户真个登岸,客户端在登岸时,必需设置所想要连接的服务器,然后客户端就会根据设置的服务器IP地址,向服务器发起建立连接请求.而服务器端是始终在监听网络状态的,主要检测到有一个连接请求,那么服务器就会给以后的发起端分配一个服务线程,用于处置它的各种请求.对客户真个各种请求,实际上都是通过在客户发往服务器的各种字符流区分的,具体的方法就是在消息的头部以及尾部添加特殊字符串,从而实现服务器抵消息请求的识别.比如对登岸信息,消息的头部就是“PEOPLO”,而对私聊中的消息,头部就是“SEC”,其他的同理都添加了头部.固然,对客户端来说,这些都是透明的,用户的把持并没有受就任何影响.在服务器端,消息被检测分析后,变回根据具体的目的进行处置,比如是私聊消息,服务器便会根据其尾部的目的信息,向目标端转发该条消息.这里额外要说的是,该系统特另外对用户发来的消息进行了加密处置,即用户的各种具体信息,不单能够防止向第三方的泄漏,而且即使服务器端呈现异常,信息也不会泄漏.对私聊的方式,该系统所采纳的方法类似于QQ的通信方式,由发起方主动连接,当目的方接收到连接请求后,会主动建立一个私聊窗口,从而实现私聊.学生信息管理软件详细设计由于这里界面设计源代码比力简单,这里不再列出.3.1.1 服务器界面设计服务器界面登岸界面注册界面聊天室界面列举部份实现通信功能的主要代码publicclass AppServer extends Thread {private ServerSocket serverSocket;private ServerFrame sFrame;privatestatic Vector userOnline = new Vector(1, 1); privatestatic Vector v = new Vector(1, 1);/*** 创立服务器启动服务监听1001端口**/public AppServer() {sFrame = new ServerFrame();try {serverSocket = new ServerSocket(1001);// 获取服务器的主机名和IP地址InetAddress address = InetAddress.getLocalHost(); sFrame.txtServerName.setText(address.getHostName()); sFrame.txtIP.setText(address.getHostAddress()); sFrame.txtPort.setText("1001");} catch (IOException e) {fail(e, "不能启动服务!");}sFrame.txtStatus.setText("已启动...");this.start(); // 启动线程}/*** 退出服务器** @param e* 异常* @param str* 退出信息*/publicstaticvoid fail(Exception e, String str) {System.out.println(str + " ." + e);}/*** 监听客户的请求,当有用户请求时创立 Connection线程*/publicvoid run() {try {while (true) {// 监听并接受客户的请求Socket client = serverSocket.accept();new Connection(sFrame, client, userOnline, v); // 支持多线程// System.out.println("userLength:"+userLength);}} catch (IOException e) {System.out.println("不能监听");}}/*** 启动服务器*/publicstaticvoid main(String args[]) {new AppServer();}}publicclass ServerFrame extends JFrame implements ActionListener {public JList list;/****/privatestaticfinallong serialVersionUID = -8936397327038098620L;// 服务器信息面板JPanel pnlServer, pnlServerInfo;JLabel lblStatus, lblNumber, lblMax, lblServerName, lblProtocol, lblIP, lblPort, lblLog;public JTextField txtStatus, txtNumber, txtMax, txtServerName, txtProtocol, txtIP,txtPort;JButton btnStop, btnSaveLog;public TextArea taLog;JTabbedPane tpServer;public TextArea taMessage;// 用户信息面板JPanel pnlUser;public JLabel lblMessage, lblUser, lblNotice, lblUserCount;JList lstUser;JScrollPane spUser;JTextField txtNotice;JButton btnSend, btnKick;public String ti = "";public String serverMessage ="";public ServerFrame() {// 服务器窗口super("[HappyChat]聊天服务器");setSize(550, 500);setDefaultClo搜索引擎优化peration(JFrame.EXIT_ON_CLOSE);setResizable(false);Dimension scr = Toolkit.getDefaultToolkit().getScreenSize();// 在屏幕居中显示Dimension fra = this.getSize();if (fra.width > scr.width) {fra.width = scr.width;}if (fra.height > scr.height) {fra.height = scr.height;}this.setLocation((scr.width - fra.width) / 2,(scr.height - fra.height) / 2);// ==========服务器信息面板=========================pnlServer = new JPanel();pnlServer.setLayout(null);pnlServerInfo = new JPanel(new GridLayout(14, 1));pnlServerInfo.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder(""), BorderFactory.createEmptyBorder(1, 1, 1, 1)));lblStatus = new JLabel("以后状态:");txtStatus = new JTextField(10);txtStatus.setEditable(false);lblNumber = new JLabel("以后在线人数:");txtNumber = new JTextField("0 人", 10);txtNumber.setEditable(false);lblMax = new JLabel("最多在线人数:");txtMax = new JTextField("50 人", 10);txtMax.setEditable(false);lblServerName = new JLabel("服务器名称:"); txtServerName = new JTextField(10); txtServerName.setEditable(false);lblProtocol = new JLabel("访问协议:");txtProtocol = new JTextField("HTTP", 10); txtProtocol.setEditable(false);lblIP = new JLabel("服务器IP:");txtIP = new JTextField(10);txtIP.setEditable(false);lblPort = new JLabel("服务器端口:");txtPort = new JTextField("8000", 10);txtPort.setEditable(false);btnStop = new JButton("关闭服务器(C)");btnStop.addActionListener(new ActionListener() { publicvoid actionPerformed(ActionEvent arg0) { closeServer();}});lblLog = new JLabel("[服务器日志]");taLog = new TextArea(20, 50);btnSaveLog = new JButton("保管日志(S)"); btnSaveLog.addActionListener(new ActionListener() { publicvoid actionPerformed(ActionEvent arg0) { saveLog();}});pnlServerInfo.add(lblStatus);pnlServerInfo.add(txtStatus);pnlServerInfo.add(lblNumber);pnlServerInfo.add(txtNumber); pnlServerInfo.add(lblMax);pnlServerInfo.add(txtMax);pnlServerInfo.add(lblServerName); pnlServerInfo.add(txtServerName); pnlServerInfo.add(lblProtocol); pnlServerInfo.add(txtProtocol); pnlServerInfo.add(lblIP);pnlServerInfo.add(txtIP);pnlServerInfo.add(lblPort);pnlServerInfo.add(txtPort);pnlServerInfo.setBounds(5, 5, 100, 400); lblLog.setBounds(110, 5, 100, 30);taLog.setBounds(110, 35, 400, 370); btnStop.setBounds(200, 410, 120, 30); btnSaveLog.setBounds(320, 410, 120, 30); pnlServer.add(pnlServerInfo);pnlServer.add(lblLog);pnlServer.add(taLog);pnlServer.add(btnStop);pnlServer.add(btnSaveLog);// ===========在线用户面板==================== pnlUser = new JPanel();pnlUser.setLayout(null);lblMessage = new JLabel("[用户消息]"); taMessage = new TextArea(20, 20);lblNotice = new JLabel("通知:");txtNotice = new JTextField(20);btnSend = new JButton("发送(S)");btnSend.setEnabled(true);btnSend.addActionListener(new ActionListener() {publicvoid actionPerformed(ActionEvent arg0) {serverMessage();}});lblUserCount = new JLabel("在线总人数 0 人");btnKick = new JButton("踢人(K)");btnKick.addActionListener(new ActionListener() {publicvoid actionPerformed(ActionEvent arg0) {tiRen();}});lblUser = new JLabel("[在线用户列表]");lstUser = new JList();lstUser.setVisibleRowCount(17);lstUser.setFixedCellWidth(180);//指定的固订单位格宽度值,而不是从列表元素计算而来的宽度值lstUser.setFixedCellHeight(18);spUser = new JScrollPane();spUser.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); spUser.getViewport().setView(lstUser);lblMessage.setBounds(5, 5, 100, 25);taMessage.setBounds(5, 35, 300, 360);lblUser.setBounds(310, 5, 100, 25);spUser.setBounds(310, 35, 220, 360);lblNotice.setBounds(5, 410, 40, 25);txtNotice.setBounds(50, 410, 160, 25);btnSend.setBounds(210, 410, 80, 25);lblUserCount.setBounds(320, 410, 100, 25); btnKick.setBounds(440, 410, 80, 25);pnlUser.add(lblMessage);pnlUser.add(taMessage);pnlUser.add(lblUser);pnlUser.add(spUser);list = new JList();list.setListData(new String[] { "" }); spUser.setViewportView(list);pnlUser.add(lblNotice);pnlUser.add(txtNotice);pnlUser.add(btnSend);pnlUser.add(lblUserCount);pnlUser.add(btnKick);// ============主标签面板======================== tpServer = new JTabbedPane(JTabbedPane.TOP); tpServer.add("服务器管理", pnlServer); tpServer.add("用户信息管理", pnlUser);this.getContentPane().add(tpServer);setVisible(true);}protectedvoid serverMessage() {// TODO自动生成方法存根this.serverMessage = txtNotice.getText(); txtNotice.setText("");}protectedvoid closeServer() {// TODO自动生成方法存根this.dispose();}protectedvoid saveLog() {// TODO自动生成方法存根try {FileOutputStream fileoutput = new FileOutputStream("log.txt", true);String temp = taMessage.getText();fileoutput.write(temp.getBytes());fileoutput.close();JOptionPane.showMessageDialog(null, "记录保管在log.txt");} catch (Exception e) {System.out.println(e);}}protectedvoid tiRen() {// TODO自动生成方法存根ti = list.getSelectedValue().toString();log("Ti:"+ti);}privatevoid log(String string) {// TODO自动生成方法存根String newta = taMessage.getText();newta += ("\n"+string);taMessage.setText(newta);}publicvoid actionPerformed(ActionEvent evt) {}publicstaticvoid main(String args[]) {new ServerFrame();}}publicclass Connection extends Thread { /*** 与客户端通讯Socket*/private Socket netClient;/*** 在线用户列表*/private Vector<Customer> userOnline;/*** 聊天信息*/private Vector<Chat> userChat;/*** 从客户到服务器输入流*/private ObjectInputStream fromClient; /*** 传到客户端打印流*/private PrintStream toClient;/*** 注册用户列表*/privatestatic Vector vList = new Vector();/*** 临时对象*/private Object obj;/*** 服务器日志窗体*/private ServerFrame sFrame;@SuppressWarnings("unchecked")/*** 创立与客户端通讯*/public Connection(ServerFrame frame, Socket client, Vector u, Vector c) {netClient = client;userOnline = u;userChat = c;sFrame = frame;try {// 发生双向通信// 检索客户输入fromClient = new ObjectInputStream(netClient.getInputStream());// 服务器写到客户toClient = new PrintStream(netClient.getOutputStream());} catch (IOException e) {try {netClient.close();} catch (IOException e1) {System.out.println("不能建立流" + e1);return;}}this.start();}/*** 处置与客户真个通讯线程*/publicvoid run() {try {// obj是Object类的对象obj = (Object) fromClient.readObject();if (obj.getClass().getName().equals("Customer")) {//serverLogin();serverLoginDB();}if (obj.getClass().getName().equals("Register_Customer")) { //serverRegiste();serverRegisteDB();}if (obj.getClass().getName().equals("Message")) { serverMessage();}if (obj.getClass().getName().equals("Chat")) {serverChat();}if (obj.getClass().getName().equals("Exit")) {serverExit();}} catch (IOException e) {System.out.println(e);} catch (ClassNotFoundException e1) {System.out.println("读对象发生毛病!" + e1);} finally {try {netClient.close();} catch (IOException e) {System.out.println(e);}}}/**** 登录处置*/@SuppressWarnings("deprecation")publicvoid serverLogin() {try {Customer clientMessage2 = (Customer) obj;// 读文件FileInputStream file3 = new FileInputStream("user.txt"); ObjectInputStream objInput1 = new ObjectInputStream(file3); vList = (Vector) objInput1.readObject();int find = 0; // 查找判断标识表记标帜// System.out.println(find);for (int i = 0; i < vList.size(); i++) {Register_Customer reg = (Register_Customer) vList.elementAt(i); if (reg.custName.equals(clientMessage2.custName)) {find = 1;if (!reg.custPassword.equals(clientMessage2.custPassword)) { toClient.println("密码不正确");break;} else {// 判断是否已经登录int login_flag = 0;for (int a = 0; a < userOnline.size(); a++) {// chenminString _custName = ((Customer) userOnline.elementAt(a)).custName;if (clientMessage2.custName.equals(_custName)) {login_flag = 1;break;}}if (userOnline.size() >= 50) {toClient.println("登录人数过多,请稍候再试");break;}if (login_flag == 0) {clientMessage2.custHead = reg.head;//getUserHeadByName(clientMessage2.custName);userOnline.addElement(clientMessage2);toClient.println("登录胜利");Date t = new Date();log("用户" + clientMessage2.custName + "登录胜利,"+ "登录时间:" + t.toLocaleString() + "\n"); freshServerUserList();break;} else {toClient.println("该用户已登录");}}} else {continue;}}if (find == 0) {toClient.println("没有这个用户,请先注册"); }file3.close();objInput1.close();fromClient.close();} catch (ClassNotFoundException e) { System.out.println(e);} catch (IOException e) {System.out.println(e);}}/**** 登录处置** @throws Exception*/@SuppressWarnings("deprecation") publicvoid serverLoginDB() {try {Customer clientMessage2 = (Customer) obj;String name = clientMessage2.custName;String pass = clientMessage2.custPassword;String sql = "select * from yonghu where custName='" + name + "'"; ResultSet rs = DB.executeQuery(sql);System.out.println("sql:" + sql);boolean login = false;String head="";while (rs.next()) {String ps=rs.getString("custPassword").toString();System.out.println("ps:["+ps+"]");System.out.println("pass:["+pass+"]");if (ps.equals(pass.toString())) {login = true;System.out.println("logined:");}System.out.println("compareTo:"+pareTo(pass));head=rs.getString("head");System.out.println("head:"+rs.getString("head"));}System.out.println("login:"+login);if (!login) {。

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

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

计算机网络课程设计报告学生姓名学号班级指导教师设计时间目录第一章系统描述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聊天室

网络编程课程设计报告题目:简单聊天室设计院系:专业班级:学号:学生姓名:指导教师:2016 年1 月6 日1.引言1)本课题的来源随着网络普及和上网人数的大增,在国内各大门户网站都架设了大型聊天室。

如:新浪聊天室、中华网社区聊天室、搜狐等都成为网民们的热门聊天室。

以新浪聊天室为例看,聊天室呈现积聚人气作用,并开设不同主题的聊天室以使网民们具有针对性的使用聊天室。

本人计划设计一个实现基于Java语言的聊天室的Windows网络编程,启动服务器后,客户端运行,向服务器端发出请求,连接成功后,会弹出一个聊天室的界面,该界面有私聊(可加入生动的表情描述)、群聊、发送文件等功能,客户可以根据自己的需要选择不同的功能。

具体任务是实现文件的接收功能,启动服务器监听后,接收客户端发来请求,安排线程接收对方发来的文件(例如文档、照片、音乐、电影等)并存入指定的文件夹中。

2)本系统涉及的知识点1、套接字Socket的建立、连接、关闭,客户端和服务器端的输入/输出流的连接。

2、Java中的多线程及线程的常用方法、Runnable接口。

3、基于SWING的图形用户界面设计:布局设计、文本组件、按钮与标签组件、列表组件等。

4、InetAddress类。

5、输入/输出流:文件、文件字节流、文件字符流、缓冲流、数据流。

3)功能要求(1)在服务器端和客户端分别创建一个套接字对象,通过输入输出流连接在一起。

套接字调用close()方法关闭双方的套接字连接。

(2)使用多线程处理套接字连接,把服务器端或客户端读取的数据放在一个单独的线程中去进行,防止服务器端或客户端读取数据可能引起的堵塞。

服务器端收到一个客户的套接字后,应该启动一个专门为该客户服务的线程。

(3)成功连接后,在图形界面中用户可以根据自己的需要进行不同的操作,如:群聊天、和某一个用户单独聊天(可加入生动的表情描述)、发送文件等。

在界面中会显示用户的聊天记录。

4)开发环境的选择在进行开发之前,首先决定的第一个问题就是,该使用什么开发环境来编写该系统?以目前常用的开发语言来讲有C/C++、.NET技术,JAVA、 Visual Basic 几种。

java网络聊天室课程设计报告(内附代码)之欧阳歌谷创作

java网络聊天室课程设计报告(内附代码)之欧阳歌谷创作

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

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

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

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

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

课程安排之阳早格格创做搜集谈天室院(系) 别疑电教院班级估计102教号姓名指挥西席时间418—510课程设计任务书籍题目搜集谈天室课程安排系 (部) 疑电教院博业估计机科教与技能班级估计102教死姓名教号4月 18 日至 5 月 10 日共 4 周指挥西席(签名) 系主任(签名)年月日成绩评定表目录课程安排概括2222教死疑息管制系统硬件总体安排223教死疑息管制硬件仔细安排446参照文献37纲要公達の実践の本领を下めるため、教んだ知識を運用することができて止って更に創制して、书籍院は特に2週間脚配して、公達にVisual C++の課程の設計の実習を止わせます.このファイルの詳しい説明はVisual C++6.0環境の下で、1つのソフトウェアの過程を設計して、このソフトウェアは各種のデータの個数を統計したのです.このソフトウェアの機能は、ユーザーは1段の笔墨を进力して、ソフトウェアは笔墨の中の各類のデータの数を記録して、英文のデータの数、数字のデータの数、空欄のデータの数とそれのタイプのデータの数を含んで、そしてそれらを明らかに示します.以下、課程を通して説明を設計して、データはソフトウェアの説明を統計して、プログラムは説明を調整して、総括などの圆里を開発して、詳しくこのプログラムの製做の過程を説明して、效率、各種の実止することができる支配.关键字:データの統計,VC++6.0, ヘッドファイル课程安排概括`随着估计机搜集日月牙同的死长,人们的接流办法越去越多,保守的接流办法,如:疑件、电报、电话等已经易以谦脚人们的接流央供,正在互联网上坐即的战佳友博得通联,已经成为现正在社会人们合流的通联办法.果此,二台估计机之间举止坐即通讯、收支文献等接流办法已经成为必定潮流.果此出现了QQ等谈天工具,然而QQ等谈天工具虽然便当、真用,然而是,娱乐功能太多,有很多吸引人的娱乐功能,从一定程度上去道,是一种娱乐工具,不克不迭动效率于坐即通讯、文献共享的博用功具.暂时,用于真止简朴的坐即通讯、文献共享的硬件真正在太少,而且,它们中大部分皆是千万于的C/S模式,对付近程服务器有非常大的依好性,不真足真止面对付面的接流.为此,尔决断开垦一个博用于真止二台估计机之间坐即通讯、文献共享的硬件,以便当二台估计机之间疑息的接流.预防了服务器闲或者与服务器无法对接时,浪费过多时间用于战服务器建坐对接.果此,那个硬件是极具符合性战真用性的坐即通讯硬件.真止搜集谈天的功能,采与Windows Socket(或者Java Socket)编程,服务器与客户端采与了TCP/IP对接办法,正在安排谈天规划时,可将所有疑息收往服务器端,再由服务器举止处理,服务器端是所有疑息的核心.服务器端要保存用户疑息,可利用数据库去真止那一功能,需要建坐用户疑息数据库.正在客户端可采与文献系统保存谈天记录战用户号码.可通过闪动托盘图标战播搁分歧的音乐提示疑息到去及佳友上线等疑息.可通过建坐消息链表去保存用户接支的百般消息.运止环境:Windows 9x、2000、XP、Windows 7需要环境:JDK 1.6以上、eclipse开垦环境硬件环境:CPU 400MHz以上,内存512MB以上教死疑息管制系统硬件总体安排该C/S模式的谈天系统,便是服务器去提供服务端对接赞同,客户端主动的提倡对接哀供.当多个用户共时对接到服务器时,经由服务器的接支与转收即不妨真止客户之间的通疑.对付于真足系统的过程,也是分为二部分,即客户端的提倡哀供,服务器赞同哀供.最先是客户端的登陆,客户端正在登陆时,必须树坐所念要对接的服务器,而后客户端便会根据树坐的服务器IP天面,背服务器提倡建坐对接哀供.而服务器端是末究正在监听搜集状态的,主要检测到有一个对接哀供,那么服务器便会给目前的提倡端调配一个服务线程,用于处理它的百般哀供.对付于客户端的百般哀供,本质上皆是通过正在客户收往服务器的百般字符流区别的,简直的要领便是正在消息的头部以及尾部增加特殊字符串,进而真止服务器对付消息哀供的辨别.比圆对付于登陆疑息,消息的头部便是“PEOPLO”,而对付于公聊中的消息,头部便是“SEC”,其余的共理皆增加了头部.天然,对付于客户端去道,那些皆是透明的,用户的支配并不受到所有效率.正在服务器端,消息被检测分解后,变回根据简直的脚段举止处理,比圆是公聊消息,服务器便会根据其尾部的脚段疑息,背目标端转收该条消息.那里特殊要道的是,该系统特别的对付用户收去的消息举止了加稀处理,即用户的百般简直疑息,不然而不妨预防背第三圆的揭收,而且纵然服务器端出现非常十分,疑息也不会揭收.对付于公聊的办法,该系统所采与的要领类似于QQ的通疑办法,由提倡圆主动对接,当脚段圆接支到对接哀供后,会主动建坐一个公聊窗心,进而真止公聊.教死疑息管制硬件仔细安排由于那里界里安排源代码比较简朴,那里不再列出.3.1.1 服务器界里安排服务器界里OutputStream关关socket 关关socket中断通疑登陆界里备案界里谈天室界里枚举部分真止通疑功能的主要代码publicclass AppServer extends Thread {private ServerSocket serverSocket;private ServerFrame sFrame; privatestaticVectoruserOnline = newVector(1, 1); privatestaticVectorv = newVector(1, 1);/*** 创制服务器开用服务监听1001端心**/public AppServer() {sFrame = new ServerFrame();try {serverSocket = new ServerSocket(1001);// 获与服务器的主机名战IP天面InetAddress address = InetAddress.getLocalHost(); sFrame.txtServerName.setText(address.getHostName());sFrame.txtIP.setText(address.getHostAddress());sFrame.txtPort.setText("1001");} catch (IOException e) {fail(e, "不克不迭开用服务!");}sFrame.txtStatus.setText("已开用...");this.start(); // 开用线程}/*** 退出服务器** @param e* 非常十分* @param str* 退出疑息*/publicstaticvoid fail(Exception e, String str) {System.out.println(str + " ." + e);}/*** 监听客户的哀供,当有用户哀供时创制 Connection线程*/publicvoid run() {try {while (true) {// 监听并担当客户的哀供Socket client = serverSocket.accept(); new Connection(sFrame, client, userOnline, v); // 支援多线程// System.out.println("userLength:"+userLength);}} catch (IOException e) {System.out.println("不克不迭监听");}}/*** 开用服务器*/publicstaticvoid main(String args[]) {new AppServer();}}publicclass ServerFrame extends JFrame implements ActionListener {publicJListlist;/****/privatestaticfinallongserialVersionUID = 8936397327038098620L;// 服务器疑息里板JPanel pnlServer, pnlServerInfo;JLabel lblStatus, lblNumber, lblMax, lblServerName, lblProtocol, lblIP, lblPort, lblLog;public JTextField txtStatus, txtNumber, txtMax, txtServerName, txtProtocol, txtIP, txtPort;JButton btnStop, btnSaveLog;public TextArea taLog;JTabbedPane tpServer;public TextArea taMessage;// 用户疑息里板JPanel pnlUser;public JLabel lblMessage, lblUser, lblNotice, lblUserCount;JListlstUser;JScrollPane spUser;JTextField txtNotice;JButton btnSend, btnKick;public String ti = "";public String serverMessage ="";public ServerFrame() {// 服务器窗心super("[HappyChat]谈天服务器");setSize(550, 500);setDefaultClo搜索引擎劣化peration(JFrame.EXIT_ON_CLOSE);setResizable(false);Dimension scr = Toolkit.getDefaultToolkit().getScreenSize();// 正在屏幕居中隐现Dimension fra = this.getSize();if (fra.width > scr.width) {fra.width = scr.width;}if (fra.height > scr.height) {fra.height = scr.height;}this.setLocation((scr.width fra.width) / 2,(scr.height fra.height) / 2);// ==========服务器疑息里板=========================pnlServer = new JPanel();pnlServer.setLayout(null);pnlServerInfo = new JPanel(new GridLayout(14, 1));pnlServerInfo.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createTitledBorder(""), BorderFactory.createEmptyBorder(1, 1, 1, 1)));lblStatus = new JLabel("目前状态:");txtStatus = new JTextField(10);txtStatus.setEditable(false);lblNumber = new JLabel("目前正在线人数:"); txtNumber = new JTextField("0 人", 10); txtNumber.setEditable(false);lblMax = new JLabel("最多正在线人数:"); txtMax = new JTextField("50 人", 10);txtMax.setEditable(false);lblServerName = new JLabel("服务器称呼:"); txtServerName = new JTextField(10); txtServerName.setEditable(false);lblProtocol = new JLabel("考察协议:"); txtProtocol = new JTextField("HTTP", 10); txtProtocol.setEditable(false);lblIP = new JLabel("服务器IP:");txtIP = new JTextField(10);txtIP.setEditable(false);lblPort = new JLabel("服务器端心:");txtPort = new JTextField("8000", 10);txtPort.setEditable(false);btnStop = new JButton("关关服务器(C)"); btnStop.addActionListener(new ActionListener() { publicvoid actionPerformed(ActionEvent arg0) {closeServer();}});lblLog = new JLabel("[服务器日志]");taLog = new TextArea(20, 50);btnSaveLog = new JButton("保存日志(S)"); btnSaveLog.addActionListener(new ActionListener() { publicvoid actionPerformed(ActionEvent arg0) {saveLog();}});pnlServerInfo.add(lblStatus);pnlServerInfo.add(txtStatus);pnlServerInfo.add(lblNumber);pnlServerInfo.add(txtNumber);pnlServerInfo.add(lblMax);pnlServerInfo.add(txtMax);pnlServerInfo.add(lblServerName); pnlServerInfo.add(txtServerName); pnlServerInfo.add(lblProtocol);pnlServerInfo.add(txtProtocol);pnlServerInfo.add(lblIP);pnlServerInfo.add(txtIP);pnlServerInfo.add(lblPort);pnlServerInfo.add(txtPort);pnlServerInfo.setBounds(5, 5, 100, 400);lblLog.setBounds(110, 5, 100, 30);taLog.setBounds(110, 35, 400, 370);btnStop.setBounds(200, 410, 120, 30);btnSaveLog.setBounds(320, 410, 120, 30); pnlServer.add(pnlServerInfo);pnlServer.add(lblLog);pnlServer.add(taLog);pnlServer.add(btnStop);pnlServer.add(btnSaveLog);// ===========正在线用户里板==================== pnlUser = new JPanel();pnlUser.setLayout(null);lblMessage = new JLabel("[用户消息]");taMessage = new TextArea(20, 20);lblNotice = new JLabel("报告:");txtNotice = new JTextField(20);btnSend = new JButton("收支(S)");btnSend.setEnabled(true);btnSend.addActionListener(new ActionListener() { publicvoid actionPerformed(ActionEvent arg0) {serverMessage();}});lblUserCount = new JLabel("正在线总人数 0 人"); btnKick = new JButton("踢人(K)");btnKick.addActionListener(new ActionListener() { publicvoid actionPerformed(ActionEvent arg0) {tiRen();}});lblUser = new JLabel("[正在线用户列表]");lstUser = newJList();lstUser.setVisibleRowCount(17);lstUser.setFixedCellWidth(180);//指定的牢固单元格宽度值,而不是从列表元素估计而去的宽度值lstUser.setFixedCellHeight(18);spUser = new JScrollPane();spUser.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);spUser.getViewport().setView(lstUser);lblMessage.setBounds(5, 5, 100, 25);taMessage.setBounds(5, 35, 300, 360);lblUser.setBounds(310, 5, 100, 25);spUser.setBounds(310, 35, 220, 360);lblNotice.setBounds(5, 410, 40, 25);txtNotice.setBounds(50, 410, 160, 25);btnSend.setBounds(210, 410, 80, 25);lblUserCount.setBounds(320, 410, 100, 25);btnKick.setBounds(440, 410, 80, 25);pnlUser.add(lblMessage);pnlUser.add(taMessage);pnlUser.add(lblUser);pnlUser.add(spUser);list = newJList();list.setListData(new String[] { "" });spUser.setViewportView(list);pnlUser.add(lblNotice);pnlUser.add(txtNotice);pnlUser.add(btnSend);pnlUser.add(lblUserCount);pnlUser.add(btnKick);// ============主标签里板======================== tpServer = new JTabbedPane(JTabbedPane.TOP); tpServer.add("服务器管制", pnlServer);tpServer.add("用户疑息管制", pnlUser);this.getContentPane().add(tpServer);setVisible(true);}protectedvoid serverMessage() {// TODO 自动死成要领存根this.serverMessage = txtNotice.getText();txtNotice.setText("");}protectedvoid closeServer() {// TODO 自动死成要领存根this.dispose();}protectedvoid saveLog() {// TODO 自动死成要领存根try {FileOutputStream fileoutput = new FileOutputStream("log.txt", true);String temp = taMessage.getText();fileoutput.write(temp.getBytes());fileoutput.close();JOptionPane.showMessageDialog(null, "记录保存正在log.txt");} catch (Exception e) {System.out.println(e);}}protectedvoid tiRen() {// TODO 自动死成要领存根ti = list.getSelectedValue().toString();log("Ti:"+ti);}privatevoid log(String string) {// TODO 自动死成要领存根String newta = taMessage.getText();newta += ("\n"+string);taMessage.setText(newta);}publicvoid actionPerformed(ActionEvent evt) {publicstaticvoid main(String args[]) { new ServerFrame();}}publicclass Connection extends Thread { /*** 与客户端通讯Socket*/private Socket netClient;/*** 正在线用户列表*/private Vector<Customer> userOnline; /*** 谈天疑息*/private Vector<Chat> userChat;/*** 从客户到服务器输进流*/private ObjectInputStream fromClient; /*** 传到客户端挨印流private PrintStream toClient;/*** 备案用户列表*/privatestaticVectorvList = newVector();/*** 临时对付象*/private Object obj;/*** 服务器日志窗体*/private ServerFrame sFrame;@SuppressWarnings("unchecked")/*** 创制与客户端通讯*/public Connection(ServerFrame frame, Socket client, Vector u, Vector c) { netClient = client;userOnline = u;userChat = c;sFrame = frame;try {// 爆收单背通疑// 检索客户输进fromClient = new ObjectInputStream(netClient.getInputStream());// 服务器写到客户toClient = new PrintStream(netClient.getOutputStream());} catch (IOException e) {try {netClient.close();} catch (IOException e1) {System.out.println("不克不迭建坐流" + e1); return;}}this.start();}/*** 处理与客户端的通讯线程*/publicvoid run() {try {// obj是Object类的对付象obj = (Object) fromClient.readObject();if (obj.getClass().getName().equals("Customer")) {// serverLogin();serverLoginDB();}if (obj.getClass().getName().equals("Register_Customer")) {// serverRegiste();serverRegisteDB();}if (obj.getClass().getName().equals("Message")) {serverMessage();}if (obj.getClass().getName().equals("Chat")) {serverChat();}if (obj.getClass().getName().equals("Exit")) {serverExit();}} catch (IOException e) {System.out.println(e);} catch (ClassNotFoundException e1) {System.out.println("读对付象爆收过失!" + e1);} finally {try {netClient.close();} catch (IOException e) {System.out.println(e);}}}/*** 登录处理*/@SuppressWarnings("deprecation")publicvoid serverLogin() {try {Customer clientMessage2 = (Customer) obj;// 读文献FileInputStream file3 = new FileInputStream("user.txt");ObjectInputStream objInput1 = new ObjectInputStream(file3);vList = (Vector) objInput1.readObject();int find = 0; // 查找推断标记// System.out.println(find);for (int i = 0; i < vList.size(); i++) {Register_Customer reg = (Register_Customer) vList.elementAt(i);if (reg.custName.equals(clientMessage2.custName)) {find = 1;if (!reg.custPassword.equals(clientMessage2.custPassword)) {toClient.println("暗号不粗确");break;} else {// 推断是可已经登录int login_flag = 0;for (int a = 0; a < userOnline.size(); a++) {String _custName = ((Customer) userOnline.elementAt(a)).custName;if (clientMessage2.custName.equals(_custName)) {login_flag = 1;break;}}if (userOnline.size() >= 50) {toClient.println("登录人数过多,请稍候再试");break;}if (login_flag == 0) {clientMessage2.custHead = reg.head;// getUserHeadByName(clientMessage2.custName);userOnline.addElement(clientMessage2);toClient.println("登录乐成");Date t = new Date();log("用户" +clientMessage2.custName + "登录乐成,"+ "登录时间:" + t.toLocaleString() + "\n");freshServerUserList();break;} else {toClient.println("该用户已登录");}}} else { continue;}}if (find == 0) {toClient.println("不那个用户,请先备案");}file3.close();objInput1.close(); fromClient.close();} catch (ClassNotFoundException e) {System.out.println(e);} catch (IOException e) {System.out.println(e);}}/**** 登录处理** @throws Exception*/@SuppressWarnings("deprecation")publicvoid serverLoginDB() {try {Customer clientMessage2 = (Customer) obj;String name = clientMessage2.custName;String pass = clientMessage2.custPassword;String sql = "select * from yonghu where custName='" + name + "'";ResultSet rs = DB.executeQuery(sql);System.out.println("sql:" + sql);boolean login = false;String head="";while (rs.next()) {String ps=rs.getString("custPassword").toString();System.out.println("ps:["+ps+"]");System.out.println("pass:["+pass+"]");if (ps.equals(pass.toString())) {login = true;System.out.println("logined:");}System.out.println("compareTo:"+pareTo(pass));head=rs.getString("head");System.out.println("head:"+rs.getString("head"));}System.out.println("login:"+login);toClient.println("暗号不粗确");return;}// 推断是可已经登录int login_flag = 0;for (int a = 0; a < userOnline.size(); a++) {String _custName = ((Customer)userOnline.elementAt(a)).custName;if (clientMessage2.custName.equals(_custName)) {login_flag = 1;break;}}if (userOnline.size() >= 50) {toClient.println("登录人数过多,请稍候再试");return;}if (login_flag == 0) {System.out.println("head:"+head);clientMessage2.custHead =head;// getUserHeadByName(clientMessage2.custName);userOnline.addElement(clientMessage2);toClient.println("登录乐成");Date t = new Date();log("用户" + clientMessage2.custName + "登录乐成," ++ t.toLocaleString() + "\n");freshServerUserList();return;} else {toClient.println("该用户已登录");}fromClient.close();} catch (Exception e) {e.printStackTrace();}}/*** 刷新服务器日志窗体正在线列表**/privatevoid freshServerUserList() {String[] userList = new String[50];Customer cus = null;for (int j = 0; j < userOnline.size(); j++) {cus = (Customer) userOnline.get(j);userList[j] = cus.custName;}sFrame.list.setListData(userList);sFrame.txtNumber.setText("" + userOnline.size());sFrame.lblUserCount.setText("目前正在线人数:" + userOnline.size());// System.out.println("fresh ok");}/*** 备案处理*/@SuppressWarnings( { "unchecked", "deprecation" })publicvoid serverRegiste() {try {int flag = 0; // 是可沉名推断标记Register_Customer clientMessage = (Register_Customer) obj;File fList = new File("user.txt");if (fList.length() != 0)// 推断是可是第一个备案用户{ObjectInputStream objInput = new ObjectInputStream(new FileInputStream(fList));vList = (Vector) objInput.readObject();// 推断是可有沉名for (int i = 0; i < vList.size(); i++) {Register_Customer reg = (Register_Customer) vList.elementAt(i);if (reg.custName.equals(clientMessage.custName)) {toClient.println("备案名沉复,请其余采用");flag = 1;break;} elseif (reg.custName.equals("所有人")) {toClient.println("克制使用此备案名,请其余采用");flag = 1;break;}}}if (flag == 0) {// 增加新备案用户vList.addElement(clientMessage);// 将背量中的类写回文献FileOutputStream file = new FileOutputStream(fList);ObjectOutputStream objout = new ObjectOutputStream(file);objout.writeObject(vList);// 收支备案乐成疑息toClient.println(clientMessage.custName + "备案乐成");Date t = new Date();log("用户" + clientMessage.custName + "备案乐成, " + "备案时间:"+ t.toLocaleString() + "\n");file.close();objout.close();fromClient.close();}} catch (ClassNotFoundException e) {System.out.println(e);} catch (IOException e) {System.out.println(e);}}/*** 备案处理*/@SuppressWarnings( { "unchecked", "deprecation" })publicvoid serverRegisteDB() {try {intflag = 0; // 是可沉名推断标记Register_Customer clientMessage = (Register_Customer) obj;String sql = "select * from yonghu where custName='"+ clientMessage.custName + "'";ResultSet rs = DB.executeQuery(sql);System.out.println("sql:" + sql);boolean reg = false;while (rs.next()) {reg = true;ResultSetMetaData rsmd = rs.getMetaData();int numberOfColumns = rsmd.getColumnCount();for(int i=1;i<=numberOfColumns;i++){String me=rsmd.getColumnName(i);String v=rs.getString(i);System.out.println(me+":"+v);}System.out.println();}System.out.println("reg:"+reg);if (reg) {toClient.println("备案名沉复,请其余采用");return;}if (clientMessage.custName.equals("所有人")) {toClient.println("克制使用此备案名,请其余采用");return;}sql = "insert intoyonghu(custName,custPassword,age,sex,email,head) values('"+ "','"+ "','"+ "','"+ "','"+ "','" + clientMessage.head + "')";System.out.println("c:"+sql);DB.executeUpdate(sql);toClient.println(clientMessage.custName + "备案乐成");Date t = new Date();log("用户" + clientMessage.custName + "备案乐成, " + "备案时间:"+ t.toLocaleString() + "\n");fromClient.close();} catch (Exception e) {e.printStackTrace();System.out.println(e);}}/*** 收支疑息处理*/publicvoid serverMessage() {try {Message mess = new Message();erOnLine = userOnline;mess.chat = userChat;mess.ti = sFrame.ti;mess.serverMessage = "" + sFrame.serverMessage;ObjectOutputStream outputstream = new ObjectOutputStream(netClient.getOutputStream());outputstream.writeObject((Message) mess); netClient.close();outputstream.close();} catch (IOException e) {}}/*** 减少疑息处理*/publicvoid serverChat() {// 将接支到的对付象值赋给谈天疑息的序列化对付象Chat cObj = new Chat();cObj = (Chat) obj;// chenmincObj.chatMessage = WordFilter.filter(cObj.chatMessage);chatLog(cObj);// 将谈天疑息的序列化对付象挖加到保存谈天疑息的矢量中userChat.addElement((Chat) cObj);return;}/*** 用户退出处理*/@SuppressWarnings("deprecation")publicvoid serverExit() {Exit exit = new Exit();exit = (Exit) obj;removeUser(exit);// chenminif (sFrame.ti.equals(exit.exitname)) {sFrame.ti = "";}Date t = new Date();log("用户" + exit.exitname + "已经退出, " + "退出时间:" + t.toLocaleString());freshServerUserList();}/*** 正在线用户中简略退出用户** @param exit* 退出用户名对付象*/privatevoid removeUser(Exit exit) {// TODO 自动死成要领存根Vector<Customer> vec = new Vector<Customer>();Customer _cus = null;for (int j = 0; j < userOnline.size(); j++) {_cus = (Customer) userOnline.get(j);if (!exit.exitname.equals(_cus.custName)) {vec.add(_cus);}// System.out.println("list:"+_cus.custName);}userOnline.removeAllElements();for (int j = 0; j < vec.size(); j++) {_cus = (Customer) vec.get(j); userOnline.add(_cus);}}/*** 日志服务器窗体写疑息** @param log* 日志疑息*/publicvoid log(String log) {String newlog = sFrame.taLog.getText() + "\n" + log; sFrame.taLog.setText(newlog);}/**** 日志服务器窗体写谈天疑息*** 谈天疑息对付象*/@SuppressWarnings("deprecation")publicvoid chatLog(Chat obj) {String newlog = sFrame.taMessage.getText();Date date = new Date();if (!obj.whisper) {newlog += "\n";newlog += ("[" + date.toLocaleString() + "]");newlog += obj.chatUser;newlog += ">";newlog += obj.chatToUser;newlog += ":";newlog += obj.chatMessage;}String text = "";text += obj.chatUser;text += ">";text += obj.chatToUser;text += ":";text += obj.chatMessage;String sql ="insert into logs(text,shijian)values('"+text+"','"+date.toLocaleString()+"')";try {System.out.println(sql);DB.executeUpdate(sql);} catch (Exception e) {// TODO Autogenerated catch blocke.printStackTrace();}sFrame.taMessage.setText(newlog);}}安排体验及以后的矫正意睹为了普及咱们的试验本领,让咱们教以致用,能机动使用所教的知识举止再创制,书籍院特安插咱们举止为期二周的Visual C++课程安排真习,并安插了指挥教授帮闲领导,让咱们正在典型化、宽紧化、真用化上头有了很大收达.正在此次字符统计步调开垦历程中,有很多物品值得咱们思索并归纳.开垦历程大概可分为以下几个步调:(1)思索总体安排规划:总体结媾战模块中部安排,功能调配.思索要真止所有步调大概需要的几个模块战其中用到的Visual C++谈话基础支配符、语句等.(2)绘出总体安排规划过程图:用过程图的形式展现您的基础编程思维.(3)过程图简直化:将要过程图中的几大模块的简直真止思索领会,不妨用过程图的形式展现.并念佳真止的关键代码.(4)编写步调代码:那是一个至关要害搀纯而且需要反复建改的关节,正在此关节中您将创制总体安排战模块思维会存留很多问题,需不竭矫正.怎么样真止各函数功能,达到预期效验也将是一项复纯的处事.(5)代码的调试:正在Visual C++6.0环境下输进代码并举止调试战粗确运止.正在调试历程中会逢到很多需要粗化的场合,需要十脚的耐性与小心,不竭矫正完备步调.(6)末尾建饰:步调不妨粗确运止之后,再不效率步调功能的情况下,使用百般辅帮性标记,使界里越收好瞅漂明,支配更人情化.巩固步调的新意与可止性.通过那次课程安排,使咱们越收认识的掌握了Visual C++谈话的使用.帮闲咱们认识了更多Visual C++谈话的功能,普及了咱们的动脚本领,教到了许多办理本质问题的贵沉体味.共时也掘掘出了咱们潜正在的本领,使咱们对付自己更有自疑,对付编程也更有兴趣.尔疑好,只消齐力、勤奋、脆持不懈,便不什么干不到的事,不克不迭还出开初便退缩,要怯于拼搏,敢于革新.参照文献1)电子工业出版社《JSP真用教程》,郑阿偶编著2)电子工业出版社《JAVA步调安排真用教程》,叶核亚编著考资料。

Java聊天室程序设计报告

Java聊天室程序设计报告

计算机与信息科学系课程设计报告课程名称:面向对象程序设计—Java 设计题目: Java聊天室程序专业:学号:姓名:指导老师:提交时间:2009-6-20目录第一章可行性分析报告 (3)1.1 引言 (3)1.1.1 编写目的 (4)1.1.2项目背景 (4)1.1.3参考资料 (4)1.2 可行性分析 (5)1.2.1系统简要描述 (5)1.2.2系统流程图 (5)1.2.3经济可行性分析 (5)第二章需求规格说明书 (7)2.1 编写目的 (8)2.2 数据描述 (8)2.2.1文字叙述 (9)2.2.2系统数据流图 (9)2.3 功能划分 (9)第三章概要设计说明书 (9)3.1 总体设计 (9)3.1.1总体结构设计 (9)3.2.接口设计 (11)3.3 数据结构设计 (11)3.3 运行设计 (12)3.4 维护设计 (12)第四章详细设计说明书 (12)4.1 总体设计 (12)4.1.1需求概要 (13)4.1.2软件结构 (13)4.2 模块程序流程 (13)4.2.1用户登录模块 (13)4.2.2注册模块 (14)4.2.3系统总体流程图 (15)第五章编码测试与实现说明 (15)5.1 功能模块的测试 (15)5.2 工作的过程 (16)5.3 软件设计效果 (16)第六章设计问题总计 (19)第七章总结 (19)可行性分析报告1.引言1.1编写目的:可行性研究的目的是为了对问题进行研究,以最小的代价在最短时间内确定问题是否可解。

经过对此项目进行详细调查研究,初拟系统实现报告,对软件开发中将要面临的问题及其解决方案进行初步设计及合理安排。

明确开发风险及其所带来的经济效益。

本报告经审核后,交软件经理审查。

1.2 项目背景:开发软件名称:Java聊天室小软件项目任务提出者:**高校项目开发者:***软件开发小组用户:**高校实现软件单位:**高校项目与其他软件,系统的关系:开发环境:本项目采用客户机/服务器原理,服务器端采用Windows XP为操作系统的工作站,客户端的程序是建立在Window XP系统上,在JDK1.5上开发,JAVA程序工程采用JCreator、Elipse 为编程工具进行开发。

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

课程设计之南宫帮珍创作网络聊天室院(系) 别信电学院班级计算102学号姓名指导教师时间2013-4-18—2013-5-10课程设计任务书题目网络聊天室课程设计系 (部) 信电学院专业计算机科学与技术班级计算102 学生姓名学号4月 18 日至 5 月 10 日共 4 周指导教师(签字)系主任(签字)年月日成绩评定表目录摘要私達の実践の能力を高めるため、学んだ知識を運用することができて行って更に創造して、学校は特に2週間手配して、私達にVisual C++の課程の設計の実習を行わせます.このファイルの詳しい説明はVisual C++6.0環境の下で、1つのソフトウェアの過程を設計して、このソフトウェアは各種のデータの個数を統計したのです.このソフトウェアの機能は、ユーザーは1段の文字を入力して、ソフトウェアは文字の中の各類のデータの数を記録して、英文のデータの数、数字のデータの数、空欄のデータの数とそれのタイプのデータの数を含んで、そしてそれらを明らかに示します.以下、課程を通して説明を設計して、データはソフトウェアの説明を統計して、プログラムは説明を調整して、総括などの方面を開発して、詳しくこのプログラムの製作の過程を説明して、作用、各種の実行することができる把持.关键字:データの統計,VC++6.0, ヘッドファイル课程设计概述`随着计算机网络日新月异的发展, 人们的交流方式越来越多, 传统的交流方式, 如:信件、电报、德律风等已经难以满足人们的交流要求, 在互联网上即时的和好友取得联系, 已经成为现今社会人们主流的联系方式.因此, 两台计算机之间进行即时通讯、发送文件等交流方式已经成为肯定潮水.因此呈现了QQ等聊天工具, 然而QQ等聊天工具虽然方便、实用, 可是, 娱乐功能太多, 有很多吸引人的娱乐功能, 从一定水平上来说, 是一种娱乐工具, 不能作为用于即时通讯、文件共享的专用工具.目前, 用于实现单一的即时通讯、文件共享的软件实在太少, 而且, 它们中年夜部份都是绝对的C/S模式, 对远程服务器有非常年夜的依赖性, 没有完全实现点对点的交流.为此, 我决定开发一个专用于实现两台计算机之间即时通讯、文件共享的软件, 以方便两台计算机之间信息的交流.防止了服务器忙或与服务器无法连接时, 浪费过多时间用于和服务器建立连接.因此, 这个软件是极具适应性和实用性的即时通讯软件.实现网络聊天的功能, 采纳Windows Socket(或Java Socket)编程, 服务器与客户端采纳了TCP/IP连接方式, 在设计聊天方案时, 可将所有信息发往服务器端, 再由服务器进行处置, 服务器端是所有信息的中心.服务器端要保管用户信息, 可利用数据库来实现这一功能, 需要建立用户信息数据库.在客户端可采纳文件系统保管聊天纪录和用户号码.可通过闪动托盘图标和播放分歧的音乐提示信息到来及好友上线等信息.可通过建立消息链表来保管用户接收的各种消息.环境需求分析运行环境:Windows 9x、2000、XP、Windows 7、eclipse开发环境硬件环境:CPU 400MHz以上,内存512MB以上学生信息管理系统软件总体设计该C/S模式的聊天系统, 就是服务器来提供服务端连接响应, 客户端主动的发起连接请求.当多个用户同时连接到服务器时, 经由服务器的接收与转发即可以实现客户之间的通信.对整体系统的流程, 也是分为两部份, 即客户真个发起请求, 服务器响应请求.首先是客户真个登岸, 客户端在登岸时, 必需设置所想要连接的服务器, 然后客户端就会根据设置的服务器IP地址, 向服务器发起建立连接请求.而服务器端是始终在监听网络状态的, 主要检测到有一个连接请求, 那么服务器就会给以后的发起端分配一个服务线程, 用于处置它的各种请求.对客户真个各种请求, 实际上都是通过在客户发往服务器的各种字符流区分的, 具体的方法就是在消息的头部以及尾部添加特殊字符串, 从而实现服务器抵消息请求的识别.比如对登岸信息, 消息的头部就是“PEOPLO”,而对私聊中的消息, 头部就是“SEC”,其他的同理都添加了头部.固然, 对客户端来说, 这些都是透明的, 用户的把持并没有受就任何影响.在服务器端, 消息被检测分析后, 变回根据具体的目的进行处置, 比如是私聊消息, 服务器便会根据其尾部的目的信息, 向目标端转发该条消息.这里额外要说的是, 该系统特另外对用户发来的消息进行了加密处置, 即用户的各种具体信息, 不单能够防止向第三方的泄漏, 而且即使服务器端呈现异常, 信息也不会泄漏.对私聊的方式, 该系统所采纳的方法类似于QQ的通信方式, 由发起方主动连接, 当目的方接收到连接请求后, 会主动建立一个私聊窗口, 从而实现私聊.学生信息管理软件详细设计由于这里界面设计源代码比力简单, 这里不再列出.3.1.1 服务器界面设计服务器界面登岸界面注册界面聊天室界面列举部份实现通信功能的主要代码publicclass AppServer extends Thread {private ServerSocket serverSocket;private ServerFrame sFrame;privatestatic Vector userOnline = new Vector(1, 1); privatestatic Vector v = new Vector(1, 1);/*** 创立服务器启动服务监听1001端口**/public AppServer() {sFrame = new ServerFrame();try {serverSocket = new ServerSocket(1001);// 获取服务器的主机名和IP地址InetAddress address = InetAddress.getLocalHost(); sFrame.txtServerName.setText(address.getHostName()); sFrame.txtIP.setText(address.getHostAddress()); sFrame.txtPort.setText("1001");} catch (IOException e) {fail(e, "不能启动服务!");}sFrame.txtStatus.setText("已启动...");this.start(); // 启动线程}/*** 退出服务器** @param e* 异常* @param str* 退出信息*/publicstaticvoid fail(Exception e, String str) {System.out.println(str + " ." + e);}/*** 监听客户的请求, 当有用户请求时创立 Connection线程*/publicvoid run() {try {while (true) {// 监听并接受客户的请求Socket client = serverSocket.accept();new Connection(sFrame, client, userOnline, v); // 支持多线程// System.out.println("userLength:"+userLength);}} catch (IOException e) {System.out.println("不能监听");}}/*** 启动服务器*/publicstaticvoid main(String args[]) {new AppServer();}}publicclass ServerFrame extends JFrame implements ActionListener { public JList list;/****/privatestaticfinallong serialVersionUID = -8936397327038098620L;// 服务器信息面板JPanel pnlServer, pnlServerInfo;JLabel lblStatus, lblNumber, lblMax, lblServerName, lblProtocol, lblIP,lblPort, lblLog;public JTextField txtStatus, txtNumber, txtMax, txtServerName, txtProtocol, txtIP,txtPort;JButton btnStop, btnSaveLog;public TextArea taLog;JTabbedPane tpServer;public TextArea taMessage;// 用户信息面板JPanel pnlUser;public JLabel lblMessage, lblUser, lblNotice, lblUserCount;JList lstUser;JScrollPane spUser;JTextField txtNotice;JButton btnSend, btnKick;public String ti = "";public String serverMessage ="";public ServerFrame() {// 服务器窗口super("[HappyChat]聊天服务器");setSize(550, 500);setDefaultClo搜索引擎优化peration(JFrame.EXIT_ON_CLOSE); setResizable(false);Dimension scr = Toolkit.getDefaultToolkit().getScreenSize();// 在屏幕居中显示Dimension fra = this.getSize();if (fra.width > scr.width) {fra.width = scr.width;}if (fra.height > scr.height) {fra.height = scr.height;}this.setLocation((scr.width - fra.width) / 2,(scr.height - fra.height) / 2);// ==========服务器信息面板=========================pnlServer = new JPanel();pnlServer.setLayout(null);pnlServerInfo = new JPanel(new GridLayout(14, 1));pnlServerInfo.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder(""), BorderFactory.createEmptyBorder(1, 1, 1, 1)));lblStatus = new JLabel("以后状态:");txtStatus = new JTextField(10);txtStatus.setEditable(false);lblNumber = new JLabel("以后在线人数:");txtNumber = new JTextField("0 人", 10); txtNumber.setEditable(false);lblMax = new JLabel("最多在线人数:");txtMax = new JTextField("50 人", 10);txtMax.setEditable(false);lblServerName = new JLabel("服务器名称:"); txtServerName = new JTextField(10); txtServerName.setEditable(false);lblProtocol = new JLabel("访问协议:");txtProtocol = new JTextField("HTTP", 10); txtProtocol.setEditable(false);lblIP = new JLabel("服务器IP:");txtIP = new JTextField(10);txtIP.setEditable(false);lblPort = new JLabel("服务器端口:");txtPort = new JTextField("8000", 10);txtPort.setEditable(false);btnStop = new JButton("关闭服务器(C)");btnStop.addActionListener(new ActionListener() { publicvoid actionPerformed(ActionEvent arg0) { closeServer();}});lblLog = new JLabel("[服务器日志]");taLog = new TextArea(20, 50);btnSaveLog = new JButton("保管日志(S)"); btnSaveLog.addActionListener(new ActionListener() {publicvoid actionPerformed(ActionEvent arg0) { saveLog();}});pnlServerInfo.add(lblStatus);pnlServerInfo.add(txtStatus);pnlServerInfo.add(lblNumber);pnlServerInfo.add(txtNumber);pnlServerInfo.add(lblMax);pnlServerInfo.add(txtMax);pnlServerInfo.add(lblServerName); pnlServerInfo.add(txtServerName); pnlServerInfo.add(lblProtocol); pnlServerInfo.add(txtProtocol); pnlServerInfo.add(lblIP);pnlServerInfo.add(txtIP);pnlServerInfo.add(lblPort);pnlServerInfo.add(txtPort);pnlServerInfo.setBounds(5, 5, 100, 400); lblLog.setBounds(110, 5, 100, 30);taLog.setBounds(110, 35, 400, 370);btnStop.setBounds(200, 410, 120, 30); btnSaveLog.setBounds(320, 410, 120, 30); pnlServer.add(pnlServerInfo);pnlServer.add(lblLog);pnlServer.add(taLog);pnlServer.add(btnStop);pnlServer.add(btnSaveLog);// ===========在线用户面板====================pnlUser = new JPanel();pnlUser.setLayout(null);lblMessage = new JLabel("[用户消息]");taMessage = new TextArea(20, 20);lblNotice = new JLabel("通知:");txtNotice = new JTextField(20);btnSend = new JButton("发送(S)");btnSend.setEnabled(true);btnSend.addActionListener(new ActionListener() {publicvoid actionPerformed(ActionEvent arg0) {serverMessage();}});lblUserCount = new JLabel("在线总人数 0 人");btnKick = new JButton("踢人(K)");btnKick.addActionListener(new ActionListener() {publicvoid actionPerformed(ActionEvent arg0) {tiRen();}});lblUser = new JLabel("[在线用户列表]");lstUser = new JList();lstUser.setVisibleRowCount(17);lstUser.setFixedCellWidth(180);//指定的固订单位格宽度值, 而不是从列表元素计算而来的宽度值lstUser.setFixedCellHeight(18);spUser = new JScrollPane();spUser.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALW AYS);spUser.getViewport().setView(lstUser);lblMessage.setBounds(5, 5, 100, 25);taMessage.setBounds(5, 35, 300, 360);lblUser.setBounds(310, 5, 100, 25);spUser.setBounds(310, 35, 220, 360);lblNotice.setBounds(5, 410, 40, 25);txtNotice.setBounds(50, 410, 160, 25);btnSend.setBounds(210, 410, 80, 25);lblUserCount.setBounds(320, 410, 100, 25);btnKick.setBounds(440, 410, 80, 25);pnlUser.add(lblMessage);pnlUser.add(taMessage);pnlUser.add(lblUser);pnlUser.add(spUser);list = new JList();list.setListData(new String[] { "" });spUser.setViewportView(list);pnlUser.add(lblNotice);pnlUser.add(txtNotice);pnlUser.add(btnSend);pnlUser.add(lblUserCount);pnlUser.add(btnKick);// ============主标签面板========================tpServer = new JTabbedPane(JTabbedPane.TOP);tpServer.add("服务器管理", pnlServer);tpServer.add("用户信息管理", pnlUser);this.getContentPane().add(tpServer);setVisible(true);}protectedvoid serverMessage() {// TODO自动生成方法存根this.serverMessage = txtNotice.getText();txtNotice.setText("");}protectedvoid closeServer() {// TODO自动生成方法存根this.dispose();}protectedvoid saveLog() {// TODO自动生成方法存根try {FileOutputStream fileoutput = new FileOutputStream("log.txt", true);String temp = taMessage.getText();fileoutput.write(temp.getBytes());fileoutput.close();JOptionPane.showMessageDialog(null, "记录保管在log.txt");} catch (Exception e) {System.out.println(e);}}protectedvoid tiRen() {// TODO自动生成方法存根ti = list.getSelectedValue().toString();log("Ti:"+ti);}privatevoid log(String string) {// TODO自动生成方法存根String newta = taMessage.getText();newta += ("\n"+string);taMessage.setText(newta);}publicvoid actionPerformed(ActionEvent evt) { }publicstaticvoid main(String args[]) {new ServerFrame();}}publicclass Connection extends Thread {/*** 与客户端通讯Socket*/private Socket netClient;/*** 在线用户列表*/private Vector<Customer> userOnline;/*** 聊天信息*/private Vector<Chat> userChat;/*** 从客户到服务器输入流*/private ObjectInputStream fromClient;/*** 传到客户端打印流*/private PrintStream toClient;/*** 注册用户列表*/privatestatic Vector vList = new Vector();/*** 临时对象*/private Object obj;/*** 服务器日志窗体*/private ServerFrame sFrame;@SuppressWarnings("unchecked")/*** 创立与客户端通讯*/public Connection(ServerFrame frame, Socket client, Vector u, Vector c) {netClient = client;userOnline = u;userChat = c;sFrame = frame;try {// 发生双向通信// 检索客户输入fromClient = new ObjectInputStream(netClient.getInputStream()); // 服务器写到客户toClient = new PrintStream(netClient.getOutputStream());} catch (IOException e) {try {netClient.close();} catch (IOException e1) {System.out.println("不能建立流" + e1);return;}}this.start();}/*** 处置与客户真个通讯线程*/publicvoid run() {try {// obj是Object类的对象obj = (Object) fromClient.readObject();if (obj.getClass().getName().equals("Customer")) {//serverLogin();serverLoginDB();}if (obj.getClass().getName().equals("Register_Customer")) { //serverRegiste();serverRegisteDB();}if (obj.getClass().getName().equals("Message")) { serverMessage();}if (obj.getClass().getName().equals("Chat")) {serverChat();}if (obj.getClass().getName().equals("Exit")) {serverExit();}} catch (IOException e) {System.out.println(e);} catch (ClassNotFoundException e1) {System.out.println("读对象发生毛病!" + e1);} finally {try {netClient.close();} catch (IOException e) {System.out.println(e);}}}/**** 登录处置*/@SuppressWarnings("deprecation")publicvoid serverLogin() {try {Customer clientMessage2 = (Customer) obj;// 读文件FileInputStream file3 = new FileInputStream("user.txt"); ObjectInputStream objInput1 = new ObjectInputStream(file3); vList = (Vector) objInput1.readObject();int find = 0; // 查找判断标识表记标帜// System.out.println(find);for (int i = 0; i < vList.size(); i++) {Register_Customer reg = (Register_Customer) vList.elementAt(i); if (reg.custName.equals(clientMessage2.custName)) {find = 1;if (!reg.custPassword.equals(clientMessage2.custPassword)) { toClient.println("密码不正确");break;} else {// 判断是否已经登录int login_flag = 0;for (int a = 0; a < userOnline.size(); a++) {// chenminString _custName = ((Customer) userOnline.elementAt(a)).custName;if (clientMessage2.custName.equals(_custName)) {login_flag = 1;break;}}if (userOnline.size() >= 50) {toClient.println("登录人数过多, 请稍候再试"); break;}if (login_flag == 0) {clientMessage2.custHead = reg.head;// getUserHeadByName(clientMessage2.custName); userOnline.addElement(clientMessage2);toClient.println("登录胜利");Date t = new Date();log("用户" + clientMessage2.custName + "登录胜利, " + "登录时间:" + t.toLocaleString() + "\n"); freshServerUserList();break;} else {toClient.println("该用户已登录");}}} else {continue;}}if (find == 0) {toClient.println("没有这个用户, 请先注册");}file3.close();objInput1.close();fromClient.close();} catch (ClassNotFoundException e) {System.out.println(e);} catch (IOException e) {System.out.println(e);}}/**** 登录处置** @throws Exception*/@SuppressWarnings("deprecation")publicvoid serverLoginDB() {try {Customer clientMessage2 = (Customer) obj;String name = clientMessage2.custName;String pass = clientMessage2.custPassword;String sql = "select * from yonghu where custName='" + name + "'"; ResultSet rs = DB.executeQuery(sql);System.out.println("sql:" + sql);boolean login = false;String head="";while (rs.next()) {String ps=rs.getString("custPassword").toString();System.out.println("ps:["+ps+"]");System.out.println("pass:["+pass+"]");if (ps.equals(pass.toString())) {login = true;System.out.println("logined:");}System.out.println("compareTo:"+pareTo(pass)); head=rs.getString("head");System.out.println("head:"+rs.getString("head"));}System.out.println("login:"+login);if (!login) {。

java课程设计---java聊天室的系统的设计与开发(含代码)-java

Java程序课程设计任务书JAVA聊天室的系统的设计与开发1.主要内容:用JA V A实现基于C/S模式的聊天室系统。

聊天室分为服务器端和客户端两部分,服务器端程序主要负责侦听客户端发来的信息,客户端需要登陆到服务器端才可以实现正常的聊天功能。

(包括技术要求等):系统的功能要求::,等待客户端连接。

,默认端口为8888。

,断开所有的用户连接。

:。

,用户可以随时登录和注销。

学习并掌握一下技术:Java JavaBean 等熟练使用一下开发工具:Eclipse,JCreator 等实现系统上述的功能。

:5月20日~ 5月21日:课程设计选题,查找参考资料5月22日~ 5月23日:完成系统设计5月24日~ 5月27日:完成程序代码的编写5月28日:系统测试与完善5月29日:完成课程设计报告,准备答辩4.主要参考文献:[1].张广彬孟红蕊(案例精编)[M].摘要在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,例如,国外的ICQ、国内腾讯公司开发的OICQ。

基于Java网络编程的强大功能,本次毕业设计使用Java编写一个聊天系统。

一般来说,聊天工具大多数由客户端程序和服务器程序外加服务器端用于存放客户数据的数据库组成,本系统采用客户机/服务器架构模式通过Java提供的Soket类来连接客户机和服务器并使客户机和服务器之间相互通信,由于聊天是多点对多点的而Java提供的多线程功能用多线程可完成多点对多点的聊天,数据库管理系统用SQL Server2000完成并通过JDBC-ODBC桥访问数据库。

本系统建立在JAVA平台上,系统的设计使用了面向对象技术和面向对象的设计原则。

系统采用C/S结构,客户端与客户端以及客户端与服务器端之间通过Socket传送消息。

使用JAVA语言编写,开发工具采用Eclipse。

服务器端设计与实现过程中,采用了多线程技术,可以在单个程序当中同时运行多个不同的线程,执行不同的任务。

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

课程设计网络聊天室院(系) 别信电学院班级计算102学号姓名指导教师时间 2013-4-18—2013-5-10课程设计任务书题目网络聊天室课程设计系 (部) 信电学院专业计算机科学与技术班级计算102学生姓名学号4 月 18 日至5 月 10 日共 4 周指导教师(签字)系主任(签字)年月日成绩评定表目录摘要私达の実践の能力を高めるため、学んだ知识を运用することができて行って更に创造して、学校は特に2周间手配して、私达にVisual C++の课程の设计の実习を行わせます.このファイルの详しい説明はVisual C++环境の下で、1つのソフトウェアの过程を设计して、このソフトウェアは各种のデータの个数を统计したのです。

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

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

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

目前,用于实现单一的即时通讯、文件共享的软件实在太少,而且,它们中大部分都是绝对的C/S模式,对远程服务器有非常大的依赖性,没有彻底实现点对点的交流。

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方法,计算器从该类开始执行。

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

应用软件的开发环境的简要说明 页脚内容1 Java聊天室课程设计 一、 需求分析 1.1开发背景 在信息化社会的今天,网络飞速发展,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,类似MSN、QQ,网络聊天时一类的聊天系统的发展日新月异,因此产生了制作一个类似QQ的网络聊天工具的想法,且通过制作该程序还能更好的学习网络软件编程知识。

网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯。网编程中有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机。而TCP层则提供面向应用的可靠的或非可靠的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的。目前较为流行的网络编程模型是客户机/服务器(C/S)结构。即通信双方一方作为服务器等待客户提出请求并予以响应。客户则在需要服务时向服务器提出申请。服务器一般作为守护进程始终运行,监听网络端口,一旦有客户请求,就会启动一个服务进程来响应该客户,同时自己继续监听服务端口,使后来的客户也得到响应的服务。

1.2设计要求 本课程设计的目标是利用套接字socket()设计一个聊天程序,该程序基于C/S模式,客户机器向服务器发聊天请求,服务器应答并能显示客户机发过来的信息。

1.3设计目的 通过设计一个网络聊天程序,对套接字、数据报通讯、URL、与URLConnectiom的相关知识有详细的了解和充分的认识。能将相关的只是运用到相关的实践中去。 应用软件的开发环境的简要说明 页脚内容2 1.4功能实现 聊天室共分为客户端和服务端两部分,服务器程序主要负责侦听客户端发来的消息,客户端需要登录到相应的服务器才可以实现正常的聊天功能。

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

二、 总体设计 应用软件的开发环境的简要说明

页脚内容3 2.1设计思想 套接字对象在网络编程中扮演者重要的角色,可以用套接字技术编写一个聊天室,服务器为每个客户启动一个线程。在该线程中通过套接字和客户交流信息,当客户向服务器发送一条聊天信息“大家好”时,服务器要让所有的这些线程中的输入流写入信息大家好,这样所有的客户的套接字的输入流就都读取到了这一条信息。如果把信息“你好”发送给特定用户,服务器就让特定线程中的输出流写入信息“你好”,那么只有特定客户的套机字的输入流可以读取到这条信息。

在聊天室中需要对用户上线下线的状态进行修改,进而统计在线人数、查找某用户等。因而需要用到java链表来实现。由于Java语言不像c或c++一样可以利用线性表的链式存储结构,用节点和指针来表示,在Java中是没有指针的,但是可以通过使用对象的引用来实现链表。链表的结点个数称为链表的长度。因此在Java中可以定义两个类来实现链表的操作,分别为节点类和链表类。在本设计中对用户的存储就是利用链表来实现的。

2.2基本设计概念和处理流程 本系统运行用JAVA开发,采用C\S结构,系统分为客服端和服务端两大模块,使用Socket类建立套接字实现客服端和服务端得通讯。

处理流程 客户端 服务端 发送请求 应用软件的开发环境的简要说明

页脚内容4 服务端 客户端 一个ServerSocket对象和一个Socket对象 一个Socketd对象

ServerSocket(port)创建ServerSocket对象提供

Accept()

连接成功,获得一InputStream OutputStream InputStream

OutputStream

Socket(host,port)创建Socket对象,向指定主

Socket.close() ServerSocket.close() Socket.close()

建立Socket申请连通过流传送应用软件的开发环境的简要说明

页脚内容5 TCP Socket通信流程 2.3总体结构

2.4功能分配 客户端

网络聊天室 服务端 客服端

客户端 连接服务端 配置服务端 登录与注销

向所有人或一个人发送消息 应用软件的开发环境的简要说明

页脚内容6 服务端

2.5接口设计 2.5.1用户接口 提供一个用户操作界面:包括用户可以再界面中登录聊天室、输入消息、浏览聊天内容和聊天对象。 同时提供一个服务器操作界面,通过服务器操作界面可以修改服务器的配置,知道用户的当前状态,并可以给用户发送指定系统信息。

2.5.2内部接口 Socket(string hont ,int port ); 客户端使用Socket类建立与服务器的套接字连接。

服务端 等待客户连接 配置服务器侦听端口 向用户发送系统消息 统计在线人数、断开连接等 应用软件的开发环境的简要说明

页脚内容7 ServerSocket(int port); 建立接收客户的套接字的服务器套接字。 2.6主要模块 2.6.1聊天室服务器端模块 聊天室服务器端模块主要有以下几部分组成 1、 主框架类(ChatServer.java) 该文件包含名为ChatServer的public类,其主要功能是定义服务器的界面,添加事件侦听鱼事件处理。ChatServer类调用ServerListen类来实现服务端用户上线与下线的侦听,调用ServerReceive类来实现服务器端消息的转发。

2、 服务器用户上线与下线侦听类。 该类对用户上线与下线的侦听是通过调用用户链表类来实现的,当用户的上线与下线情况发生改变时,该类会对主类的界面进行相应的修改。

3、 服务器消息收发类 该类分别定义了向某用户及向所有人发送消息的方法,发送的消息会显示在主界面类的界面上。 4用户修改配置的类。 该类继承自JDialog。使用户对服务器端口进行修改配置的类。 5节点类 定义了链表中的用户 应用软件的开发环境的简要说明 页脚内容8 6链表类 该类通过构造函数构造用户链表,定义了添加用户、删除用户、返回用户数、根据用户名查找用户和各根据索引查找用户等方法。

7服务器帮助类、 2.6.2聊天室服务器端模块算法描述

服务器端的ChatServer类继承自JFrame并实现相应的事件监听接口,因此它定义了服务器的主框架,及各个按钮的事件监听。它分别调用ServerListen类来实现服务端用户上线与下线的侦听,调用ServerReceive类来实现服务器端消息的转发。同时服务器可以响应多个客户的请求,当一个客户发送请求时,服务器就为它增加一个线程,同时服务器利用UserLinkList类为客户端设置一个请求队列,如果服务器不能马上响应客户端的请求,就要把这个请求放到请求队列在中,,等服务器将当前的请求处理

ChatServer -port:public static in -serverSocket:ServerSocket -messageShow:JTextArea -userLinkList:UserLinkList Thread ServerListen - server: ServerSocket

ServerReceive -textarea:JTextArea - userLinkList :UserLinkList 应用软件的开发环境的简要说明

页脚内容9 完,会自动到请求队列中按照先后顺序取出请求进行处理。 2.6.3聊天室客户端模块 客户端主要有以下几个文件,功能如下: 1客户端主框架类 该类主要定义客户端的界面,添加事件侦听与事件处理。该类定义了与服务器实现连接与断开连接的方法。当用户登录到指定的服务器上时,该类条用客户端实现消息收发的类实现消息的收发。同时该类定义了向所有用户发送消息的方法。

2客户端消息收发的类 该类实现了服务器与客户端消息的收发 3用户修改配置的类 该类继承自JDialog,是用户对要连接的服务器IP及侦听端口进行修改配置的类。 4帮助类 客户端用户程序的帮助类

2.6.4聊天室客户端模块主要算法描述 应用软件的开发环境的简要说明

页脚内容10 客户端ChatClient类继承了JFrame并实现相应的事件监听接口。它实现了客户端的主界面及相应按钮的事件侦听。该类调用ClientReceive类实现消息的收发。同时该类定义了向所有用户发送消息的方法。通过相应的输入输出流与服务器进行数据的传递与交流。

三、 主要代码实现 3.1服务器主要代码实现 1、Chatserver类:包含名为ChatServer的public类,其主要功能为定义服务器端的界面,添加事件侦听与事件处理。调用ServerListen类来实现服务端用户上线与下线的侦听,调用ServerReceive类来实现服务器端的消息的收发。

import java.awt.*;

ChatClient -port:public static in -serverSocket:ServerSocket -messageShow:JTextArea -userLinkList:UserLinkList

ClientReceive - socket: Socket

Thread

相关文档
最新文档