Java课程设计聊天室(含代码).docx

合集下载

Java局域网聊天程序课程设计(含代码)

Java局域网聊天程序课程设计(含代码)

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

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

2.具体要求(包括技术要求等):系统的功能要求:A.服务器端主要功能如下:1.在特定端口上进行侦听,等待客户端连接。

2.用户可以配置服务器端的侦听端口,默认端口为8888。

3.向已经连接到服务器端的用户发送系统消息。

4.统计在线人数。

5.当停止服务时,断开所有的用户连接。

B.客户端的主要功能如下:1.连接到已经开启聊天服务的服务器端。

2.用户可以配置要连接的服务器端的IP地址和端口号。

3.用户可以配置连接后显示的用户名。

4.当服务器端开启的话,用户可以随时登录和注销。

5.用户可以向所有人或某一个人发送消息。

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

3.进度安排:12月28日~ 12月29日:课程设计选题,查找参考资料12月30日~ 1月1日:完成系统设计1月2日~ 1月5日:完成程序代码的编写1月6日:系统测试与完善1月7日:完成课程设计报告,准备答辩4.主要参考文献:[1].张广彬孟红蕊张永宝.Java课程设计(案例精编)[M].清华大学出版社.2007年版摘要在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,例如,国外的ICQ、国内腾讯公司开发的OICQ。

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

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

java课程设计--聊天软件(带源码)(可编辑修改word版)

java课程设计--聊天软件(带源码)(可编辑修改word版)

5. 实验方法与步骤:这个软件从0.1 到1.3 一共13 个版本。

0.1 到0.4 版本为客户端界面设计,第0.5 到1.2 版本为服务器端设计以及客户端与服务器端通信连接的设计实现。

1.3 版为完善之前版本的缺陷并添加登陆界面。

最终版本1.3 版中一共三个类(如图一所示)源代码如下://客户端import java.awt.*;import java.awt.event.*;import java.io.IOException;import .*;import java.io.*;public class ChatClient extends Frame{ Socket s = null;DataOutputStream dos = null;DataInputStream dis = null;private boolean bConnected = false;private static final long serialVersionUID = 1L;TextField tfTxt = new TextField();TextArea taContent = new TextArea();public static void main(String[] args) {// TODO Auto-generated method stubnew Login();}public void launchFrame(){ setLocation(400, 300);this.setSize(300, 300);add(tfTxt, BorderLayout.SOUTH);add(taContent, BorderLayout.NORTH);pack();this.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e){ disconnect();System.exit(0);}});tfTxt.addActionListener(new TFListener());setVisible(true);connect();new Thread(new RecvThead()).start();}public void connect() {try {s = new Socket("127.0.0.1", 8888);dos = new DataOutputStream(s.getOutputStream());dis = new DataInputStream(s.getInputStream());System.out.print("lian jie shang le ");bConnected = true;} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void disconnect() {try {public void run() {try {while (bConnected){ String str;str = dis.readUTF();taContent.setText(taContent.getText()+str+'\n');System.out.print(str);}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}//服务器端import java.io.DataInputStream;import java.io.EOFException;import java.io.IOException;import java.io.*;import .*;import java.util.*;public class ChatServer{ boolean started =false; ServerSocket ss =null;List<Client>clients=new ArrayList<Client>();public static void main(String[] args) {// Socket s=null;// DataInputStream dis =null;new ChatServer().start();}public void start(){ try {ss = new ServerSocket(8888);started = true;} catch (BindException e){ System.out.print("端口使用中!\n");System.out.print("请关闭相关程序重新运行程序!\n");System.exit(0);} catch (IOException e){ e.printStackTrace();}try {while (started) {// oolean bConnected=false;// s=ss.accept();Socket s = ss.accept();Client c = new Client(s);System.out.print("已连接!\n");new Thread(c).start();clients.add(c);}// dis.close();} catch (IOException e){ e.printStackTrace();} finally{ try {ss.close();} catch (IOException e1){ e1.printStackTrace();}}}class Client implements Runnable{ private Socket s;private DataInputStream dis = null;private DataOutputStream dos=null;private boolean bConnected = false;public Client(Socket s){ this.s = s;try {dis = new DataInputStream(s.getInputStream());dos =new DataOutputStream(s.getOutputStream());bConnected = true;} catch (IOException e){ e.printStackTrace();}}public void send(Stringstr){ try {dos.writeUTF(str);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void run(){ try {while (bConnected) {String str = dis.readUTF();System.out.print(str + "\n");for (inti=0;i<clients.size();i++){ Client c=clients.get(i);c.send(str);}}} catch (EOFException e){ System.out.print("客户端断开连接!\n");} catch (IOException e) {e.printStackTrace();} finally{ try {dis.close();btnLogin.addActionListener(this);btnExit.addActionListener(this);// P.setBounds(0,0,315,120);// pnlLogin.add(P);pnlLogin.setBackground(Color.WHITE);lblUserName.setBounds(10,125,90,25);txtUserName.setBounds(120,125,180,25);lblPassword.setBounds(10,155,90,25);pwdPassword.setBounds(120,155,180,25);btnLogin.setBounds(20,185,80,25);btnExit.setBounds(220,185,80,25);lblUserName.setForeground(Color.BLACK);lblUserName.setBackground(Color.WHITE);lblPassword.setForeground(Color.BLACK);lblPassword.setBackground(Color.WHITE);pnlLogin.add(lblUserName);pnlLogin.add(txtUserName);pnlLogin.add(lblPassword);pnlLogin.add(pwdPassword);pnlLogin.add(btnLogin);pnlLogin.add(btnExit);setResizable(false);setSize(315,245);setVisible(true);dsSize=toolkit.getScreenSize();setLocation(dsSize.width/2-this.getWidth()/2,dsSize.height/2- this.getHeight()/2);}@Overridepublic void actionPerformed(ActionEvent ae){if(ae.getSource()==btnLogin){String jusername =txtUserName.getText().trim();char[] s = pwdPassword.getPassword();String jpassword = new String(s);if (jusername.equals("") || jpassword.equals(""))}登陆失败登陆成功多个客户端登陆聊天,一个发起聊天在线的全部能收到6.实验总结:这个实验的主要技术是 包中的是socket 使用。

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

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

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

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

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

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

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

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

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

JAVA课程设计实验报告-“聊天室”报告
聊天信息版块设计思想:一种就是将客户的聊天信息写入数据库,一种是将其写入向量中。在本次项目中,要求学员把客户的聊天信息写入数据库中。
用户私聊
如果两个人聊的话题比较隐秘,不想被其他人看到,就要使用私聊。在这里,如果说话对象是所有人的话,不能选择私聊;从当前好友列表中选择了一个用户之后,则私聊对话框应该弹出来。
第一章聊天室的描述
1 .1聊天室的设要求
当今社会,网络技术越来越发展,可以说,二十一世纪就是网络的世纪。网络迅猛发展,势不可挡。为了实现资源共享,各式各样的网站发展迅速,各种各样的聊天工具不断更新。某公司希望通过一个聊天工具加强员工和客户之间的沟通和交流。所以制作一个聊天室势在必行。
为了实现一个更好的网络交互平台,各用户之间能够实时方便的传递信息,按照用户对系统的要求不同,可以在聊天室里实现公共聊天,也可以邀几个私交好友私聊,同时提供了两个用户之间能够传送文件。本系统是基于方便用户聊天,传递信息,共享资源,所以系统的功能主要是从以上几个模块着手。
1、服务器负责数据管理及程序处理。
2、客户机负责界面描述和界面显示。
3、客户机向服务器提出处理要求。
4、服务器响应将处理结果返回客户机。
5、使网络数据流量最少。
1.2聊天室的基本功能
1.用户注册
2.用户登录
3.在线用户列表
4.用户公聊
5.用户私聊
6.好友信息维护
7.私聊信息的维护
8.登录日志的维护
9.用户注销
添加好友
删除好友
私聊信息的维护
如果两个人聊的话题比较隐秘,不想被其他人看到,就要使用私聊。而且只有好友之间才能进行私聊。要与某用户进行私聊,必须把对方加为好友。与好友之间的聊天信息,应该以文件的方式存储在客户端,不显示在公聊的版面上。

java课程设计_聊天室

java课程设计_聊天室

《java语言程序设计》课程设计姓名:范高华学号:200712030213指导教师:张洲平班级:信息072所在院系:理学院《java语言程序设计》课程设计要求要求对所论问题提交课程设计报告(word2003文档),报告要求纸张:A4 ;版式:上下均空2.5cm, 左右均空3cm,页眉页脚各设1 .5cm页眉:奇数页码页眉:信息专业java语言程序课程设计报告(宋体小5号)偶数页码页眉:算法名称(宋体小5号)页脚:作者简介:张三、男、湖南益阳人(宋体小5号)文章标题:黑体三号粗体字;二级标题:黑体4号;三级标题黑体小4号作者姓名与单位:宋体小5号:张三信息与计算科学专业××班摘要:简明扼要反映问题的实质、解决问题的理论、方法、和关键技术,内容不超过200字,宋体小5号关键词:三到五个核心术语、宋体小5号正文:宋体5号(问题重述、理论分析、模型、算法、程序流程图、程序设计技术文档、程序代码、程序使用说明、针对给定实例程序运行情况(调试验证情况)、设计总结)附件:程序代码与流程图参考文献题目要求:每人选做1题。

课程设计报告形式:以给定版式打印提交。

郑重声明:设计报告不得出现雷同现象,否则此课程设计以0分记。

)课程设计选题目1、蜘蛛纸牌游戏(提示:需要使用多线程)该游戏通过鼠标操作,将电脑多次分发的纸牌,按照相同的花色由大到小排列起来,直到桌面上的纸牌全都消失,即为胜利。

包括如下功能:a、难度选择:包括简单(单色)、中级(双色)、高级(四色)。

b、开局:任何时候可以重新开始一盘新的游戏。

c、发牌。

d、显示可行操作:提示当前可行操作。

e、简单的帮助文档:对软件的简单介绍和编制说明。

2、中国象棋对弈系统用java实现具有一定功能的中国象棋对弈软件,主要功能如下:a、象棋对弈:红方先走,然后黑方再走,红黑交替,直到一方获胜。

b、新游戏:任何时候可以重新开始一盘新的对弈。

c、悔棋:当走错棋的时候可以悔棋。

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

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

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

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

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

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

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

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

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

聊天室java课程设计

聊天室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网络聊天室课程设计报告(内附代码)

课程安排之阳早格格创做搜集谈天室院(系) 别疑电教院班级估计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实现聊天室功能(包含全部代码-有界面)

服务器端代码:import .*;import .*;import .*;import .*;public class Server{private static final int PORT=6666;G_Menu gm=new G_Menu();private ServerSocket server;public ArrayList<PrintWriter> list;public static String user;public static ArrayList<User> list1=new ArrayList<User>();....");while(true){Socket client=();etServer();}class Chat implements Runnable{Socket socket;private BufferedReader br;private String msg;private String mssg="";public Chat(Socket socket){try{=socket;}catch(Exception ex){();}}public void run(){try{br=new BufferedReader(new InputStreamReader()));while((msg=())!=null){if("1008611"))plit(":");quals()+"("+()+")"))etOutputStream());quals ()))etOutputStream());quals(si[0]))lose();;import .*;import .*;import class Socket_one;import .*;import .*;import Landen extends Frame implements ActionListener {JFrame jf=new JFrame("聊天登陆");JPanel jp1=new JPanel();JPanel jp2=new JPanel();JPanel jp3=new JPanel();JPanel jp4=new JPanel();JLabel jl1=new JLabel("姓名:");JLabel jl2=new JLabel("地址:");JLabel jl3=new JLabel("端口:");JRadioButton jrb1=new JRadioButton("男生"); JRadioButton jrb2=new JRadioButton("女生"); JRadioButton jrb3=new JRadioButton("保密");public JTextField jtf1=new JTextField(10);public JTextField jtf2=new JTextField(10);public JTextField jtf3=new JTextField(10);JButton jb1=new JButton("连接");JButton jb2=new JButton("断开");TitledBorder tb=new TitledBorder("");ButtonGroup gb=new ButtonGroup();public void init()quals("断开")){(0);}if().equals("连接")){if().equals("")){(null,"请输入用户名!");}else if(!()&&!()&&!()){(null,"请选择性别!");}else{(false);if()){s1="boy";}else if()){s1="girl";}else if()){s1="secret";}G_Menu gmu=new G_Menu();(),s1);();}}}}public class Login{public static void main(String[] args) {new Landen().init();}}主界面代码:import .*;import .*;import .*;import .*;class G_Menu extends JFrame implements ActionListener {JFrame jf=new JFrame("聊天室");public Socket_one soc;public PrintWriter pw;public JPanel jp1=new JPanel();public JPanel jp2=new JPanel();public JPanel jp3=new JPanel();public JPanel jp4=new JPanel();public JPanel jp5=new JPanel();public JPanel jp6=new JPanel();public JPanel jp7=new JPanel();public static JTextArea jta1=new JTextArea(12,42); public static JTextArea jta2=new JTextArea(12,42);public JLabel jl1=new JLabel("对");public static JComboBox jcomb=new JComboBox();public JCheckBox jcb=new JCheckBox("私聊");public JTextField jtf=new JTextField(36);public JButton jb1=new JButton("发送>>");public JButton jb2=new JButton("刷新");public static DefaultListModel listModel1;public static JList lst1;public String na;public String se;public String message;public void getMenu(String name,String sex)quals("发送>>"))quals("")) {if()){String name1=(String)();message="悄悄话"+na+"("+se+")"+"对"+name1+"说:"+();("4");quals("刷新"));import .*;import .*;class User{private String name;//用户姓名private String sex;//用户性别private Socket sock;//用户自己的socketpublic User(String name,String sex,Socket sock){setName(name);setSex(sex);setSock(sock);}public String getName(){return name;}public void setName(String name){=name;}public String getSex(){return sex;}public void setSex(String sex){=sex;}public Socket getSock(){return sock;}public void setSock(Socket sock){=sock;}}使用说明:1、先将所有的类都编译一下2、先运行服务器端代码3、再运行登录界面代码。

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

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

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

(完整word版)JAVA聊天室

(完整word版)JAVA聊天室

基于JAVA的聊天室设计与实现一、设计目的:信息技术的高速发展给人类生产,生活带来了广泛而深远的影响。

“上网冲浪”、“数码相机”“PDA”、“彩屏手机”、“蓝牙技术”等新产品,新概念层出不穷,不断冲击着人们的视听。

这些高科技成果为人们带来便捷、快乐的同时,也促进了人机交互技术的发展。

人机交互是关于设计、评价和实现供人们使用的交互式计算机系统,并围绕相关的主要现象进行研究的科学。

它主要研究人与计算机之间的信息交换,涉及计算机科学,心理学,认知科学等诸多学科,是信息技术的一个重要组成部分,并将继续对信息技术的发展产生巨大影响。

聊天室是一项应用广泛,并且实用性强的一个非常典型的人机交互系统。

在信息世界里,聊天工具的使用是非常频繁的,如MSN、QQ、校内通,之类的聊天工具许多人都正在使用。

此次设计的聊天室系统虽然其功能简单,但是在开发技术和过程中,能够充分学习和使用JAVA的技术,进一步培养学生面向对象程序设计的思想,加深对面向对象程序设计四大特性的理解。

二、需求分析人们日常生活中越来越多地使用聊天室这项应用来为自己的工作和学习服务。

一个操作简单,界面友好、运行稳定的聊天室对于小型局域网的用户可以起到很好的交流作用。

所谓聊天室就是一个可以让许多用户同时互相通信的网上园地,个人用户可以通过聊天室将自己融入整个主流社会中。

根据目前使用聊天室的用户需求显示,用户对于聊天室主要有以下几点要求:(1)、聊天功能:可以实时接收和发送信息,并能支持公聊和私聊的的方式,能够查看聊天记录,聊天过程中能对字体、表情等进行设定等。

(2)、用户功能:可以随时注册和登录及注销,并能选择性加好友和删除好友以及查看对方的开放信息,还能看到对方的登录状态。

(3)、文件传输功能:用户可以共享资源,能发送及接收文件。

(4)、保密功能:用户可以设定自己的保密状态,使某些信息对于其他用户是不可见的。

(5)、系统稳定:客户端与服务端的连接稳定,不出现或者少出现连接不上的情况。

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网络聊天室课程设计报告(内附代码)

课程设计网络聊天室院(系)别信电学院班级计算102学号姓名指导教师时间2013—4—18—2013-5-10 课程设计任务书题目网络聊天室课程设计系(部)信电学院专业计算机科学与技术班级计算102学生姓名学号4 月18 日至5 月10 日共 4 周指导教师(签字)系主任(签字)年月日成绩评定表目录课程设计概述 (3)1。

1问题描述 (3)1.2功能需求分析 (3)1。

3环境需求分析 (3)学生信息管理系统软件总体设计 (4)2。

1整体思路 (4)2.2总体设计流程图 (5)学生信息管理软件详细设计 (6)3.1。

界面设计 (6)3.2通信功能实现方法 (8)参考文献 (45)摘要私達の実践の能力を高めるため、学んだ知識を運用することができて行って更に創造して、学校は特に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 服务器界面设计服务器界面登岸界面注册界面聊天室界面列举部份实现通信功能的主要代码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);if (!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法式设计实用教程》,叶核亚编著考资料创作时间:二零二一年六月三十日。

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

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

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

2.具体要求(包括技术要求等):系统的功能要求:A.服务器端主要功能如下:1.在特定端口上进行侦听,等待客户端连接。

2.用户可以配置服务器端的侦听端口,默认端口为8888 。

3.向已经连接到服务器端的用户发送系统消息。

4.统计在线人数。

5.当停止服务时,断开所有的用户连接。

B.客户端的主要功能如下:1.连接到已经开启聊天服务的服务器端。

2.用户可以配置要连接的服务器端的IP 地址和端口号。

3.用户可以配置连接后显示的用户名。

4.当服务器端开启的话,用户可以随时登录和注销。

5.用户可以向所有人或某一个人发送消息。

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

3.进度安排:12 月 28 日~ 12 月 29 日:课程设计选题,查找参考资料12 月 30 日~ 1 月 1 日:完成系统设计1 月2 日~ 1 月 5 日:完成程序代码的编写1 月 6 日:系统测试与完善1 月 7 日:完成课程设计报告,准备答辩主要参考文献:[1]. 张广彬孟红蕊张永宝.Java课程设计(案例精编)[M]. 清华大学出版社.2007 年版摘要在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,例如,国外的ICQ、国内腾讯公司开发的OICQ。

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

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

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

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

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

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

大大增强了程序对服务器资源的利用。

聊天系统完成后将可进行多人对多人的聊天,对好友进行添加、删除,对新用户的注册,发送消息、接受消息等等功能。

关键词:多线程;客户机/服务器;JAVA;Socket;Eclipse ; TCP/IP目录Java程序课程设计任务书错误 !未定义书签。

摘要错误 !未定义书签。

目录错误 !未定义书签。

第 1 章引言错误 ! 未定义书签。

背景错误 !未定义书签。

课程设计内容错误!未定义书签。

任务分工错误 !未定义书签。

第2 章聊天室系统错误 ! 未定义书签。

聊天室系统概述错误! 未定义书签。

聊天室系统的定义错误 ! 未定义书签。

聊天室系统的任务及目的错误 !未定义书签。

主要聊天室系统介绍错误 !未定义书签。

本章小结错误 !未定义书签。

第3 章聊天室系统的设计错误 !未定义书签。

系统需求分析错误 ! 未定义书签。

系统开发及运行环境错误 !未定义书签。

系统主要功能要求错误 ! 未定义书签。

系统模块化分析错误!未定义书签。

聊天室系统总体结构错误 !未定义书签。

聊天室系统各模块介绍错误 !未定义书签。

系统数据流图错误!未定义书签。

本章小结错误 !未定义书签。

第 4 章系统的具体实现错误!未定义书签。

界面设计错误 !未定义书签。

服务器启动界面图错误 ! 未定义书签。

服务器启动成功界面图错误 !未定义书签。

客户端界面图错误 ! 未定义书签。

用户设置界面图错误 ! 未定义书签。

用户成功登录界面图错误 !未定义书签。

两人私聊界面图错误 ! 未定义书签。

多人群聊界面图错误 ! 未定义书签。

程序设计及调试运行错误 !未定义书签。

程序调试(以服务器为例)错误 ! 未定义书签。

JCreator 错误 !未定义书签。

本章小结错误 !未定义书签。

第5 章结束语错误 ! 未定义书签。

致谢错误 !未定义书签。

附录源代码错误 ! 未定义书签。

第 1 章引言背景当今主流的聊天工具有QQ,ICQ,MSN Messenger ,Yahoo Messenger 等,国内最热门的当属QQ,腾讯 QQ(OICQ)是由深圳市腾讯计算机系统公司开发的,基于Internet的即时寻呼软件。

您可以使用 QQ 和好友用户进行交流,信息即时发送,即时回复,收发及时、功能全面。

此外QQ 还具有 BP 机网上寻呼、聊天室、传输文件、语音邮件、手机短讯服务等功能,QQ 不仅仅是虚拟的网络寻呼机,更可与传统的无线寻呼网、GSM 移动电话的短消息系统互联,目前QQ 和全国多家寻呼台、移动通信公司有业务合作。

是国内不可多得的中文网络寻呼机。

QQ 支持显示朋友在线信息、即时传送信息、即时交谈、即时发送文件和网址。

QQ 可以在 Win95/98/NT/2000 操作系统下运行,是十分灵活的网络寻呼工具。

它会自动检查您是否已联网,如果您的电脑已连入Internet ,可以搜索网友、显示在线网友,可以根据QQ 号、昵称、姓名、 email 地址等关键词来查找,找到后可加入到通讯录中。

当您的通讯录中的网友在线时,QQ 中朋友的头像就会显示在线,根据提示就可以发送信息,如果对方登记了寻呼机或开通了GSM 手机短消息,即使离线了,您也可及时将信息传递给您的好友。

虽然以上这些软件是免费的,并且功能越来越强大。

但是它们的唯一的不足就是必须要联网或者下载到它们的服务端,要不然是没法脱离Intenet 使用的。

为了能在一个没有连接到Intenet的局域网使用聊天工具,那就必须要有服务器端。

本系统就是包括服务器端与客户端,可以在局域网聊天的一个工具。

课程设计内容实现的是局域网中的聊天功能,运行服务程序后,服务器创建成功,然后使服务器对某一个设定的端口处于监听状态,当有客户端请求建立连接时,服务器就可接受请求,建立连接!这样服务器和客户端就可相互发送消息,实现聊天功能!系统的功能要求 :A.服务器端主要功能如下:1.在特定端口上进行侦听,等待客户端连接。

2.用户可以配置服务器端的侦听端口,默认端口为8888 。

3.向已经连接到服务器端的用户发送系统消息。

4.统计在线人数。

5.当停止服务时,断开所有的用户连接。

B.客户端的主要功能如下:1.连接到已经开启聊天服务的服务器端。

2.用户可以配置要连接的服务器端的IP 地址和端口号。

3.用户可以配置连接后显示的用户名。

4.当服务器端开启的话,用户可以随时登录和注销。

5.用户可以向所有人或某一个人发送消息任务分工第 2 章聊天室系统聊天室系统概述聊天室是一种基于互联网的即时交流系统,最初是ICQ,也称网络寻呼机。

此类软件使得人们可以运用连上 INTERNET 网的电脑用户可以随时跟另外一个在线网民交谈,甚至可以通过视频看到对方的适时图像。

使人们不必担心昂贵的话费而畅快交流,并工作、交流两不误。

聊天室系统的定义聊天时系统是通过即时通讯技术来实现在线聊天、交流的软件。

目前有 2 种架构形式,1、一种是 C/S 架构,采用客户端/ 服务器形式,用户使用过程中需要下载安装客户端软件,典型的代表有:QQ、百度HI、 Skype QQ VS GU、 Gtalk 、新浪UC、 MSN 等; 2、采用B/S 架构,即浏览器/ 服务端形式,这种形式的即时通讯软件,直接借助互联网为媒介、客户端无需安装任何软件,既可以体验服务器端进行沟通对话,一般运用在电子商务网站的服务商,典型的代表有Websitelive、53KF、 live800 等。

聊天室系统的任务及目的本系统主要通过客户端,服务器端来体现聊天系统的基本功能。

( 1)服务器端1.处理用户注册2.处理用户登录3.处理用户发送信息,服务器监控聊天内容,服务器过滤非法内容4.处理用户得到信息5.处理用户退出8. 服务器踢人。

9. 保存服务器日志。

10.保存用户聊天信息。

( 2)客户端1.用户注册界面及结果2.用户登录界面及结果3.用户发送信息界面及结果4.用户得到信息界面及结果5.用户退出界面及结果主要聊天室系统介绍目前国内外做聊天系统的公司很多,产品也琳琅满目,国内有诸如腾讯QQ、新浪UC、网易泡泡等,国外有著名的MSN(新版改名为Live Messenger )以及跨平台Gaim 等。

本人取最具代表性的QQ和 MSN 进行了一些研究,作为我开发聊天系统的准备。

腾讯无疑是国内即时通讯市场的霸主,自从99 年进入即时通讯领域并迅速占市场之后,其在国内用户数量始终高居榜首,即使近几年面对微软MSN 的强大攻势,腾讯 QQ 的时常占有率依然稳步增长。

腾讯的成功与其对QQ 的不断创新和完善是分不开的。

参考了许多网络上的资料,以及自己通过观察腾讯QQ 运行时的各种细节。

可以确定腾讯QQ 是以多服务器提供服务、服务器总控客户端、客户端之间UDP 直连通信的。

并且在两个客户端之间不能建立直连的情况下,才由服务器进行中转通信。

其模型如图1-1图 1-1腾讯QQ服务器-客户端模型1与腾讯QQ 不同,微软的MSN Messenger 只使用了TCP作为传输层通信协议,所有客户端与服务器进行连接,然后通过与服务器的TCP连接进行中转通信。

其模型如图1-2图1-2 MSN 服务器 -客户端模型 2腾讯使用的模型中,服务器主要处理客户端各种状态的控制,可以极大减轻服务器的处理压力,但其内部协议和实现复杂度都较高。

而MSN Messenger 所有数据都要经过服务器,服务器压力可想而知(难怪平时很少见到使用MSN 进行语音视频聊天的)。

本章小结这一章介绍了当前聊天室系统应该具备的功能模块,并提供了市面上比较流行的聊天室系统作为参考。

在这一章中,我们可以了解什么是聊天室系统,当前聊天室系统的市场需求,还有一个聊天室系统应该的开发目标。

第 3 章聊天室系统的设计这一章是聊天室系统的设计,从系统需求分析开始,介绍开发环境和用到的开发工具,系统主要的功能设计,系统的数据流程图。

系统需求分析聊天室的设计目标:通过做巩固所学Java 语言基本知识,增进Java 语言编辑基本功,掌握JDK、JCreator 等开发工具的运用,拓宽常用类库的应用,用JAVA 实现基于C/S 模式的聊天室系统。

相关文档
最新文档