网络聊天室课程设计报告(内附java代码)
java课程设计报告-利用JAVA实现简单聊天室
图2服务器启动成功
结果分析:在进入聊天室之前必须先启动服务器,实现服务器端的连接为用户的登录打开“窗口”。
其次运行用户注册登录文件,运行结果如下:
图3用户登陆界面
结果分析:添加用户信息,输入用户姓名,为用户进入聊天室提供关口。
并且利用以下语句实现如图4的界面 JLabel title=new JLabel("免注册版");
JLabel name=new JLabel("输入姓名");
JButton send=new JButton("进入");
添加注册信息后点击“进入”按钮,结果如图5
图4显示用户已登录
结果分析:当服务器启动用户完成信息注册时,在服务期端的界面中会显示当前在线的人员,并且提示客户已连接到服务器,可以进行聊天行为。
图5 显示聊天内容
结果分析:多个用户进入聊天室之后,用户可以在发送信息的文本框里填写自己的内容,点击“发送信息”按钮,信息会出现在上方的区域内,在界面的右方还可以显示在线人员的姓名,另在线用户可以知道有谁在聊天室内。
聊天结束点击“离开”按钮,结果如图7所示:
图6离开聊天室
点击服务器中的“停止”按钮,结果如图8.图9所示:
图7 点击“停止”按钮
图8终止与服务器端连接
结果分析:用户聊天结束点击“离开”按钮之后会在服务器端的界面上自动显示该用户已离开,提时、示服务器执行相关行为。
综上所述:通过运行这5个文件基本实现多用户在线聊天的功能,如启动服务器:实现网络的连接,为注册进入聊天室做准备;注册登陆界面:填写基本信息如姓名等,可以供多人进入实现多人聊天功能;发送信息:为用户发送信息提供平台。
java课程设计报告(java聊天室)
Java聊天室课程设计一、需求分析1.1开发背景在信息化社会的今天,网络飞速发展,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,类似MSN、QQ,网络聊天时一类的聊天系统的发展日新月异,因此产生了制作一个类似QQ的网络聊天工具的想法,且通过制作该程序还能更好的学习网络软件编程知识。
网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯。
网编程中有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。
在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机。
而TCP层则提供面向应用的可靠的或非可靠的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的。
目前较为流行的网络编程模型是客户机/服务器(C/S)结构。
即通信双方一方作为服务器等待客户提出请求并予以响应。
客户则在需要服务时向服务器提出申请。
服务器一般作为守护进程始终运行,监听网络端口,一旦有客户请求,就会启动一个服务进程来响应该客户,同时自己继续监听服务端口,使后来的客户也得到响应的服务。
1.2设计要求本课程设计的目标是利用套接字socket()设计一个聊天程序,该程序基于C/S模式,客户机器向服务器发聊天请求,服务器应答并能显示客户机发过来的信息。
1.3设计目的通过设计一个网络聊天程序,对套接字、数据报通讯、URL、与URLConnectiom的相关知识有详细的了解和充分的认识。
能将相关的只是运用到相关的实践中去。
1.4功能实现服务器的主要功能有1)在特定端口上进行侦听,等待客户连接2)用户可以配置服务器的真挺端口3)向已经连接服务器的客户发送系统消息4)统计在线人数5)当停止服务时,断开所有用户的连接客户端的主要功能1)连接到已经开启聊天服务的服务端2)用户可以配置要连接服务器端的ip地址和端口号3)用户可以配置连接后显示的用户名4)当服务器开启时。
网络编程课程设计-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网络聊天室课程设计报告(内附代码)之欧阳文创编
课程设计网络聊天室院(系) 别信电学院班级计算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, ヘッドファイル课程设计概述1.1问题描述`随着计算机网络日新月异的发展,人们的交流方式越来越多,传统的交流方式,如:信件、电报、电话等已经难以满足人们的交流要求,在互联网上即时的和好友取得联系,已经成为当今社会人们主流的联系方式。
因此,两台计算机之间进行即时通讯、发送文件等交流方式已经成为必然潮流。
因此出现了QQ等聊天工具,然而QQ等聊天工具虽然方便、实用,但是,娱乐功能太多,有很多吸引人的娱乐功能,从一定程度上来说,是一种娱乐工具,不能作为用于即时通讯、文件共享的专用工具。
目前,用于实现单一的即时通讯、文件共享的软件实在太少,而且,它们中大部分都是绝对的C/S模式,对远程服务器有非常大的依赖性,没有彻底实现点对点的交流。
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聊天室)
Java聊天室课程设计一、需求分析1.1开发背景在信息化社会的今天,网络飞速发展,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,类似MSN、QQ,网络聊天时一类的聊天系统的发展日新月异,因此产生了制作一个类似QQ的网络聊天工具的想法,且通过制作该程序还能更好的学习网络软件编程知识。
网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯。
网编程中有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。
在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机。
而TCP层则提供面向应用的可靠的或非可靠的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的。
目前较为流行的网络编程模型是客户机/服务器(C/S)结构。
即通信双方一方作为服务器等待客户提出请求并予以响应。
客户则在需要服务时向服务器提出申请。
服务器一般作为守护进程始终运行,监听网络端口,一旦有客户请求,就会启动一个服务进程来响应该客户,同时自己继续监听服务端口,使后来的客户也得到响应的服务。
1.2设计要求本课程设计的目标是利用套接字socket()设计一个聊天程序,该程序基于C/S模式,客户机器向服务器发聊天请求,服务器应答并能显示客户机发过来的信息。
1.3设计目的通过设计一个网络聊天程序,对套接字、数据报通讯、URL、与URLConnectiom的相关知识有详细的了解和充分的认识。
能将相关的只是运用到相关的实践中去。
1.4功能实现服务器的主要功能有1)在特定端口上进行侦听,等待客户连接2)用户可以配置服务器的真挺端口3)向已经连接服务器的客户发送系统消息4)统计在线人数5)当停止服务时,断开所有用户的连接客户端的主要功能1)连接到已经开启聊天服务的服务端2)用户可以配置要连接服务器端的ip地址和端口号3)用户可以配置连接后显示的用户名4)当服务器开启时。
java课程设计报告__利用java实现简单聊天室(可编辑)
java课程设计报告_-_利用JAVA实现简单聊天室利用JAVA实现简单聊天室1.课程设计目的在当今的信息时代,越来越多的聊天工具被应用,Java语言是当今流行的网络编程语言,它具有面向对象、与平台无关、安全、多线程等特点。
使用Java 语言不仅可以实现大型企业级的分布式应用系统,还能够为小型的、嵌入式设备进行应用程序的开发Java语言的重要概念及其面向对象的特性,锻炼我们熟练的应用面向对象的思想和设计方法解决实际问题的能力,开设了Java程序设计课程设计。
此次课程设计的题目为简单的聊天室,通过做巩固所学Java语言基本知识,增进Java语言编辑基本功,掌握JDK、JCreator等开发工具的运用,拓宽常用类库的应用。
使我们通过该教学环节与手段,把所学课程及相关知识加以融会贯通,全面掌握Java语言的编程思想及面向对象程序设计的方法,为今后从事实际工作打下坚实的基础。
2.设计方案论证2.1设计思路Java是一种简单的,面对象的,分布式的,解释的,键壮的安全的,结构中立的,可移植的,性能很优异的多线程的,动态的语言Java去掉了C++语言的许多功能,如:指针运算、结构、typedefs、#define让Java的语言功能很精炼,并增加了一些很有用的功能,如自动收集碎片。
这将减少平常出错的50%。
而且,Java很小,整个解释器只需215K的RAM。
Java简单聊天室,它是图形界面、线程、流与文件等技术的综合应用其界面主要采用了包程序实现了的基本功能有:Pentium 2.8GHz以上内存:256MB以上硬盘空间:80G以上操作系统:Windows XP运行环境:JDK,JCreator 2.5 程序功能图及程序相关说明主功能框图图1 程序基本框图表1 聊天室基本功能表序号文件名主要功能1ServerHost被服务器调用2Client显示聊天室3ClientUser被客户端调用4LogIn注册登陆5Objecting连接服务器6Server启动服务器程序代码是说明程序中引入的包:package Chat;import .*;import java.awt.*;import t.*;import javax.swing.*;import java.util.*;import java.io.*;(1)服务器端代码中用户自定义类:类名:Server作用:服务器启动继承的接口名:ActionListenerpublic class Server implements ActionListener定义的对象:count //记录点机关闭按钮次数2次关闭soconly //只有SOCKET,用于群发sockets //所有客户的SOCKETsocket_thread //Socket所在的线乘,用于退出;frame // 定义主窗体panel//定义面板start,stop //启动和停止按钮主要成员方法:public void center //定义小程序查看器的位置public void actionPerformed //定义处理异常机制定义子类:serverRun,Details继承的父类名:Threadclass serverRun extends Thread //启线乘用于接收连入的Socket class Details extends Thread //具体处理消息的线乘,只管发送消息创建一个ServerSocket 对象,用于接受指定端口客户端的信息ServerSocket server new ServerSocket "1234" ;接受请求时候,通过accept 方法,得到一个socket对象。
JAVA聊天室课程设计报告含源代码压缩文件
J A V A聊天室课程设计报告含源代码压缩文件 IMB standardization office【IMB 5AB- IMBK 08- IMB 2C】南京晓庄学院《JAVA程序设计》课程设计报告题目:姓名:学号:班级: 14软件工程3班指导教师: 王峥完成时间成绩:信息工程学院2016年6月目录Java聊天室的设计与实现引言Java聊天室开发背景在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,类似QQ、MSN,网络聊天时一类的聊天系统的发展日新月异,因此产生了制作一个有简单聊天功能的网络聊天程序;而且通过制作该程序还能更好的学习网络软件编程知识。
本程序设计简单可以实现在同一局域网的聊天,程序可以自动扫描已经上线的用户,上线用户可在同一聊天界面中实现群聊。
如果需要与其中的用户进行交谈,则只需双击右侧用户列表,读取对方IP地址,便可在下面的输入框内输入信息进行发送,实现一对一私聊功能。
1.1Java聊天室开发的目的和意义目的:(1)理解进程消息通信的概念,如何实现两个创建进程之间的数据传递。
(2)理解进程共享变量的进程通信。
(3)熟悉并掌握java语言的代码编写(4)熟练使用开发工具Eclipse(5)实现聊天室的一些基本功能意义:(1)实现局域网中的信息交互,界面尽量人性化且美观,让用户便于接受(2)用户及时获取自己想要的信息、促进交谈(3)异常处理,对于用户错误的操作使用程序会有提示消息(4)前期仅实现其基本雏形,后期可扩性很高,可实现统计在线人数,发送图片,界面美化,用户登陆注册信息的采集,连接到数据库etc.(5)后期可便于网站自身的广告宣传与商品推广因所学知识和能力的局限性,仅能完成有限范围内的雏形生成与功能实现,后期的功能实现需要进一步的深入学习才能使本课程设计日益完善。
1.2完成的主要工作(1)需求分析与总体设计、详细设计、代码分析(2)实现程序所能运行的功能(3)选择Window系统,并选择该操作系统中一种进程通信的方式。
JAVA课程设计报告聊天室
JAVA课程设计报告聊天室一、课程目标知识目标:1. 学生能理解网络编程的基本概念,掌握JAVA Socket编程的基础知识。
2. 学生能运用面向对象编程思想,设计并实现聊天室客户端与服务器的数据传输功能。
3. 学生了解并掌握多线程技术在网络编程中的应用。
技能目标:1. 学生能运用所学知识,独立编写并调试简单的聊天室程序。
2. 学生具备分析问题、解决问题的能力,能针对聊天室程序进行优化和改进。
3. 学生能在团队协作中发挥自己的作用,与他人共同完成一个完整的网络编程项目。
情感态度价值观目标:1. 学生培养对计算机编程的兴趣,增强学习JAVA的自信心。
2. 学生认识到团队合作的重要性,培养良好的团队协作精神。
3. 学生通过编程实践,体验创新与创造的乐趣,培养积极向上的学习态度。
本课程针对高年级学生,结合课本内容,注重理论与实践相结合,以提高学生的实际编程能力为主要目标。
课程要求学生在掌握基本知识的基础上,能够独立完成实际项目,培养其分析问题、解决问题的能力。
同时,课程强调团队协作,使学生学会与他人共同进步,共同成长。
通过本课程的学习,使学生达到知识、技能和情感态度价值观的全面提升。
二、教学内容1. 网络编程基础理论:介绍网络编程的基本概念,包括IP地址、端口号、协议等,使学生理解网络通信的基本原理。
- 教材章节:第三章 网络编程基础2. JAVA Socket编程:讲解Socket编程的原理,指导学生掌握客户端与服务器之间的数据传输方法。
- 教材章节:第四章 Socket编程3. 面向对象编程:运用面向对象编程思想,设计聊天室程序,包括类的定义、封装、继承与多态。
- 教材章节:第二章 面向对象编程基础4. 多线程技术:介绍多线程编程的概念,分析在聊天室程序中如何实现多用户并发通信。
- 教材章节:第五章 多线程编程5. 聊天室程序设计与实现:指导学生完成聊天室客户端与服务器的编写,实现基本的功能需求。
JAVA课程设计实验报告-“聊天室”报告
第二章 聊天室的设计
2.1聊天室的粗略设计分析
聊天系统平台应有两个部分组成:服务端和客户端。服务端主要完成用户信息的存储、客户端命令的接受与响应以及发送系统消息、信息转发、踢人等服务端应有的功能。客户端主要完成聊天信息的发送与接受、登录、注销等功能。
此c/s系统使用的是TCP/IP协议,应用了如下通讯模式:
如果用户名和密码正确的话,则登录聊天室主界面;如果已经在线,则输出已经在线;否则输出用户名和密码错误,需要重新登录或者注册。
在线用户列表
用户登录之后,需要知道系统中,有哪些用户在线,这样可以方便用户选择与个别用户私聊和传送文件,也可以进行公聊。
用户公聊
用户输入的用户名和密码都正确后,则进入聊天室。聊天主界面主要由四大版块组成:公聊的聊天信息、在线用户列表、好友列表,系统消息和聊天的一些操作。
1.2聊天室的基本功能-------------------------------------------------------------3
1.3设计所用参考资料-------------------------------------------------------------6
第二章 聊天室的设计-------------------------------------------6
由于Client使用了流套接字,所以服务程序也要使用流套接字。这就要创建一个ServerSocket对象,接下来服务程序进入无限循环之中,无限循环从调用ServerSocket的accept()方法开始,在调用开始后accept()方法将导致调用线程阻塞直到连接建立。在建立连接后accept()返回一个最近创建的Socket对象,该Socket对象绑定了客户程序的IP地址或端口号。由于存在单个服务程序与多个客户程序通讯的可能,服务程序循环检测是否有客户连接到服务器上,如果有,则创建一个线程来服务这个客户,以此完成对客户端的监听。
Java课程设计聊天室(含代码)【范本模板】
Java程序课程设计任务书JAVA聊天室的系统的设计与开发1.主要内容:用JA V A实现基于C/S模式的聊天室系统。
聊天室分为服务器端和客户端两部分,服务器端程序主要负责侦听客户端发来的信息,客户端需要登陆到服务器端才可以实现正常的聊天功能.2。
具体要求(包括技术要求等):系统的功能要求:A。
服务器端主要功能如下:1.在特定端口上进行侦听,等待客户端连接.2.用户可以配置服务器端的侦听端口,默认端口为8888.3。
向已经连接到服务器端的用户发送系统消息。
4。
统计在线人数。
5.当停止服务时,断开所有的用户连接.B。
客户端的主要功能如下:1。
连接到已经开启聊天服务的服务器端。
2。
用户可以配置要连接的服务器端的IP地址和端口号。
3。
用户可以配置连接后显示的用户名。
4。
当服务器端开启的话,用户可以随时登录和注销。
5。
用户可以向所有人或某一个人发送消息。
学习并掌握一下技术:Java JavaBean 等熟练使用一下开发工具:Eclipse,JCreator 等实现系统上诉的功能。
3.进度安排:12月28日~12月29日:课程设计选题,查找参考资料12月30日~ 1月1日:完成系统设计1月2日~1月5日:完成程序代码的编写1月6日:系统测试与完善1月7日:完成课程设计报告,准备答辩4.主要参考文献:[1]。
张广彬孟红蕊张永宝。
Java课程设计(案例精编)[M].清华大学出版社.2007年版摘要在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,例如,国外的ICQ、国内腾讯公司开发的OICQ。
基于Java网络编程的强大功能,本次毕业设计使用Java编写一个聊天系统。
一般来说,聊天工具大多数由客户端程序和服务器程序外加服务器端用于存放客户数据的数据库组成,本系统采用客户机/服务器架构模式通过Java提供的Soket类来连接客户机和服务器并使客户机和服务器之间相互通信,由于聊天是多点对多点的而Java提供的多线程功能用多线程可完成多点对多点的聊天,数据库管理系统用SQL Server2000完成并通过JDBC—ODBC桥访问数据库.本系统建立在JAVA平台上,系统的设计使用了面向对象技术和面向对象的设计原则.系统采用C/S结构,客户端与客户端以及客户端与服务器端之间通过Socket传送消息。
java课程设计报告利用java实现简单聊天室
创建一个socket对象,用于连接服务器。
用socket创建流。
通过流和服务器进行交互。
交互完毕,将流和socket关闭。
(4)聊天室:
类名:Client
作用:实现发送即时信息。
继承的接口名:ActionListener
public class Server implements ActionListener{
定义的对象:
count//记录点机关闭按钮次数2次关闭
soconly//只有SOCKET,用于群发
sockets//所有客户的SOCKET
socket_thread//Socket所在的线乘,用于退出;
程序中引入的包:
package Chat;
import .*;
import java.awt.*;
import ;
import javax.swing.*;
import java.util.*;
import java.io.*;
(1)服务器端代码中用户自定义类:
类名:Server
作用:服务器启动
接受请求时候,通过accept()方法,得到一个socket对象。
Socket socket = server.accept();
通过socket创建流(输入,输出)。
BufferedReaderbr=newBufferedReader(newInputStreamReader
(socket.getInputStream()))
类名:LogIn
作用:用户注册登录
继承的接口名:ActionListener
public class LogIn implements ActionListener
Java简易聊天工具课程设计报告及代码
J a v a网络编程实践课程设计说明书课程名称:Java网络编程课程设计_题目:__基于C/S的班级聊天室(群聊)工具姓名:____HJC_____学号:201211012 201211006教学班号:软件工程1201班指导教师:xxx_______x x x x x x软件科学与工程系二○一三年十二月二十二日Java网络编程实践任务书目的:熟悉JA V A 语法,掌握图形化界面、多线程、网络、数据库等综合编程,掌握用编程语言开发由若干功能组成的小型项目的基本流程,增强动手实践能力,巩固和加强书本知识的学习,体会JA V A编程的特点。
题目1:基于C/S的班级即时通讯工具(2人)要求:1.C/S模式,基于Socket实现,服务器端用多线程来处理同时多个客户端连接。
2.数据存储:服务器端存储最少一个班级的信息;最好多个班级,主要存储班级若干学生的基本信息。
用数据库存储。
下面所有功能只考虑一个班是基本实现,考虑多个班是拓展实现。
3.界面:GUI界面,友好直观,布局合理,方便的功能入口。
4.功能:1)登陆输入用户名和密码;用户名是学号,有初始密码,例如111111;2)登陆验证根据服务器端存储的班级信息,对输入的用户进行验证,看是否存在于该班(只考虑一个班的情况)。
或是否是某个班的学生(多个班的情况)。
验证通过进入主界面,否则给出错误提示。
3)主界面列出该学生好友列表(同班级同学默认全是该生好友,如果是多个班则可以添加别班好友并经对方批准)。
4)即时聊天,选中某个好友,双击打开窗口聊天。
如果不在线则服务器等对方上线后转发(此功能属拓展实现)。
5)可以修改自己的登陆密码。
6)题目2:基于C/S的班级聊天室(群聊)工具(2人)要求:1.C/S模式,基于Socket实现,服务器端用多线程来处理同时多个客户端连接。
2.数据存储:服务器端存储一个班级的信息;主要存储班级若干学生的基本信息。
用数据库存储。
3.界面:GUI界面,友好直观,布局合理,方便的功能入口。
JAVA聊天室课程设计报告(含源代码压缩文件)
JAVA聊天室课程设计报告(含源代码压缩文件) 南京晓庄学院《JAVA程序设计》课程设计报告题目: 姓名: 学号: 班级: 指导教师: 完成时间成绩:Java聊天室的设计与实现戴佳伟 14552021 14软件工程3班王峥 2021.10.7信息工程学院2021年6月1目录1 1.1 1.1 1.2 2 2.1引言 (3)java聊天室开发背景 ........................................................................... (3)java聊天室开发的目的和意义 ........................................................................... (3)完成的主要工作 ........................................................................... (4)需求分析和总体设计 (5)需求分析与设计思路 ........................................................................... . (5)2.1.1 关键技术说明 ........................................................................... (5)2.1.2需求分析 ........................................................................... ............................. 6 java聊天室设计方案与思路 (6)java聊天室目录结构说明 (7)2.1.32.1.4 2.2 33.1java聊天室功能结构 ........................................................................... (8)详细设计 (10)java聊天室模块实现 ........................................................................... . (10)3.1.14 5XX模块实现 ........................................................................... .. (10)java聊天室运行结果 (13)课程设计总结 (15)2Java聊天室的设计与实现1 引言1.1Java聊天室开发背景在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,类似QQ、MSN,网络聊天时一类的聊天系统的发展日新月异,因此产生了制作一个有简单聊天功能的网络聊天程序;而且通过制作该程序还能更好的学习网络软件编程知识。
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 语言是当今风行的网络编程语言,它具有面向对象,与平台无关,平安,多线程等特点.使用java语言不但可以实现大型企业级的分布式应用系统,还可以为小型的的,嵌入式设备停止应用程序的开辟.面向对象的开辟是当当代界最风行的开辟方法,它不但具有更贴近自然地语义,而且有利于软件的维护和继承,锻炼我们熟练地应用面向对象的思想和设计方法处理实际问题的才能.本程序正是用java语言实现了简单聊天功能.它是图形界面,线程,流与文件系统等技术的综合应用.其界面主要采取了java.awt包,java.swing包等.二.系统总体设计由于本软件知识一个聊天程序,程序只提供用户之间的聊天功能,故对网络传输数据要求不是很高,只要正常的传输速度便可以了.2数据管理IP地址(IP),端口(Port)本软件采取Java语言编写,Java语言是一种跨平台的编程语言,所以本软件对操纵系统没有特此外要求.而网络传输方面采取TCP/IP网络传输协议或者是RMI.(1)本软件客户端与用户共用一段程序.客户端编译运行后,在窗口选择侦听.用户编译运行后,在窗口选择毗连.(2)本软件实现的功能有1)允许服务器侦听客户端,客户端毗连到服务器2)允许服务区与客户端之间停止聊天;3)允许服务器与客户端更改布景颜色;4) 允许服务器与客户端更改字体颜色;5)服务器与客户端时,会显示内容发送时间;6)允许服务器与客户端用鼠标点击“发送”,按ENTER键都可发送内容7)允许服务器与客户端用鼠标点击关闭时关闭聊天窗口三.系统详细设计(1)程序中引入的包:import java.awt.*;import java.awt.event.*;import javax.swing.*;import .*;import java.io.*;(2)代码中自定义的类:类名:chatHouse继承的类:JFrame实现的接口:ActionListener, Runnable作用:构造服务器界面以及客户端界面.定义的对象: TextArea ta;JTextField ip;JTextField port;JButton btn_server;JButton btn_client;JButton btn_backGroundCol;JButton btn_fontCol;JTextField send_text;JButton btn_send;JButton btn_close;JLabel pic;Socket skt;构造方法:public chatHouse()主要成员方法:public void run()public void actionPerformed(ActionEvent e) public void doServer()public void doSend()2.源代码[chatHouse.java]import java.awt.*;import java.awt.event.*;import javax.swing.*;import .*;import java.io.*;import java.util.*;public class chatHouse extends JFrame implements ActionListener, Runnable{private TextArea ta;private JTextField ip;private JTextField port;private JButton btn_server;private JButton btn_client;private JButton btn_backGroundCol;private JButton btn_fontCol;private JTextField send_text;private JButton btn_send;private JButton btn_close;private JLabel pic;private Socket skt;public void run(){try{BufferedReader br = new BufferedReader(new InputStreamReader(skt.getInputStream()));while(true){String s = br.readLine(); // 从网络读if(s==null) break;ta.append(s + "\n");}}catch(Exception e){e.printStackTrace();}}public void actionPerformed(ActionEvent e){if(e.getSource()==btn_server){doServer();}if(e.getSource()==btn_client){doClient();}if(e.getSource()==btn_send){doSend();}}public void doServer(){try{ServerSocket server = newServerSocket(Integer.parseInt(port.getText()));skt = server.accept();ta.append("毗连成功!\n");new Thread(this).start();}catch(Exception e){ta.append("服务器启动失败!\n");}}public void doClient(){try{skt = new Socket(ip.getText(),Integer.parseInt(port.getText()));ta.append("毗连成功!\n");new Thread(this).start();}catch(Exception e){ta.append("毗连失败!\n");}}public void doSend(){Calendar c=Calendar.getInstance();int y=c.get(c.YEAR);int M=c.get(c.MONTH)+1;int d=c.get(c.DAY_OF_MONTH);int h=c.get(c.HOUR_OF_DAY);int mm=c.get(c.MINUTE);int ss=c.get(c.SECOND);try{PrintWriter pw = new PrintWriter(skt.getOutputStream());String s = send_text.getText();if(s==null) return;ta.append(y+""+M+""+d+""+h+":"+mm+":"+ss+"\n");ta.append(s+"\n");pw.println(y+""+M+""+d+""+h+":"+mm+":"+ss);pw.println(s);pw.flush();send_text.setText("");}catch(Exception e){ta.append("发送失败!\n");}}public chatHouse(){super("聊天室");this.setBounds(100,100,550,430);Container cc = this.getContentPane();JPanel p1 = new JPanel();cc.add(p1, BorderLayout.NORTH);JPanel p2 = new JPanel();cc.add(p2,BorderLayout.CENTER);JPanel p3 = new JPanel();cc.add(p3,BorderLayout.SOUTH);pic=new JLabel(new ImageIcon("12.gif")); cc.add(pic,BorderLayout.EAST);p1.add(new JLabel("IP: "));ip = new JTextField("127.0.0.1", 10);p1.add(ip);p1.add(new JLabel("Port: "));port = new JTextField("7777", 4);p1.add(port);btn_server = new JButton("侦听");p1.add(btn_server);btn_client = new JButton("毗连");p1.add(btn_client);btn_backGroundCol =new JButton("布风光"); p1.add(btn_backGroundCol);btn_fontCol =new JButton("字体颜色");p1.add(btn_fontCol);p2.setLayout(new BorderLayout())ta = new TextArea();p2.add(ta, BorderLayout.CENTER);send_text = new JTextField("Hello.");p2.add(send_text, BorderLayout.SOUTH);btn_send = new JButton("发送");p3.add(btn_send, BorderLayout.WEST);btn_close =new JButton("关闭");p3.add(btn_close, BorderLayout.CENTER);//"关闭"按钮监听器btn_close.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){ System.exit(100);}});// 布景变色监听btn_backGroundCol.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){ JColorChooser chooser4=new JColorChooser();Color color=chooser4.showDialog(null,"布景颜",Color.yellow);ta.setBackground(color);}});//字体变色监听btn_fontCol.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){ JColorChooser chooser4=new JColorChooser();Color color=chooser4.showDialog(null,"字体颜色",Color.black);send_text.setForeground(color);ta.setForeground(color);}});//按ENTER键可发送监听btn_server.addActionListener(this);btn_client.addActionListener(this);btn_send.addActionListener(this);setDefaultClo搜索引擎优化peration(JFrame.EXIT_ON_CLOSE);send_text.addKeyListener(new KeyAdapter(){public void keyPressed(KeyEvent e){if(e.getKeyCode()==KeyEvent.VK_ENTER)doSend();}});}public static void main(String[] args){new chatHouse().setVisible(true);}}import java.util.*;3.程序测试编译运行程序后,先选择对方IP,选择同样的Port.服务器先侦听,客户端再毗连.毗连成功,窗口会显示“毗连成功!”字样.接下来便可以聊天了.(1) 服务器与客户端聊天.(2)服务器与客户端聊天.服务器将布景颜色设为粉红,字体颜色设为蓝色.客户端将布景颜色设为蓝色,字体颜色设为红色.四.小结1.通过本次课程设计,使得自己懂得实际和实践相连系起来,从实际中得出结论,才干真正掌握这门技术,也提高了自己独立思考的才能,在设计的过程中,可以自己处理.真正体会到要将一门知识学的更深入,必须加强实践,多操练,才干发现问题所在.2..本程序实现的功能还比较简单不敷完善,从中,我知道了自己的缺乏之处,决计增长自己的知识,设计更加好的程序,实现各种更加复杂的功能,如:传输文件,图片.以及登陆界面,昵称等.3.总的来讲,这次实训对我很有帮忙.让我学会了的不只是设计JAVA聊天室,更让我学会主动学习,而不是主动接纳.这样才干更好的运用自己所学到的知识.。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计网络聊天室院(系) 别信电学院班级计算102学号姓名指导教师时间2013-4-18—2013-5-10课程设计任务书题目网络聊天室课程设计系(部) 信电学院专业计算机科学与技术班级计算102学生学号4 月18 日至5 月10 日共 4 周指导教师(签字)系主任(签字)年月日成绩评定表目录课程设计概述 (2)1.1问题描述 (2)1.2功能需求分析 (2)1.3环境需求分析 (2)学生信息管理系统软件总体设计 (3)2.1整体思路 (3)2.2总体设计流程图 (4)学生信息管理软件详细设计 (5)3.1.界面设计 (5)3.2通信功能实现方法 (8)参考文献............................................................................................ 错误!未定义书签。
课程设计概述1.1问题描述`随着计算机网络日新月异的发展,人们的交流方式越来越多,传统的交流方式,如:信件、电报、等已经难以满足人们的交流要求,在互联网上即时的和好友取得联系,已经成为当今社会人们主流的联系方式。
因此,两台计算机之间进行即时通讯、发送文件等交流方式已经成为必然潮流。
因此出现了QQ等聊天工具,然而QQ等聊天工具虽然方便、实用,但是,娱乐功能太多,有很多吸引人的娱乐功能,从一定程度上来说,是一种娱乐工具,不能作为用于即时通讯、文件共享的专用工具。
目前,用于实现单一的即时通讯、文件共享的软件实在太少,而且,它们部分都是绝对的C/S模式,对远程服务器有非常大的依赖性,没有彻底实现点对点的交流。
为此,我决定开发一个专用于实现两台计算机之间即时通讯、文件共享的软件,以方便两台计算机之间信息的交流。
避免了服务器忙或与服务器无法连接时,浪费过多时间用于和服务器建立连接。
因此,这个软件是极具适应性和实用性的即时通讯软件。
1.2功能需求分析实现网络聊天的功能,采用Windows Socket(或Java Socket)编程,服务器与客户端采用了TCP/IP连接方式,在设计聊天方案时,可将所有信息发往服务器端,再由服务器进行处理,服务器端是所有信息的中心。
服务器端要保存用户信息,可利用数据库来实现这一功能,需要建立用户信息数据库。
在客户端可采用文件系统保存聊天纪录和用户。
可通过闪动托盘图标和播放不同的音乐提示信息到来及好友上线等信息。
可通过建立消息链表来保存用户接收的各种消息。
1.3环境需求分析运行环境:Windows 9x、2000、XP、Windows 7必要环境:JDK 1.6以上、eclipse开发环境硬件环境:CPU 400MHz以上,存512MB以上学生信息管理系统软件总体设计2.1整体思路该C/S模式的聊天系统,就是服务器来提供服务端连接响应,客户端主动的发起连接请求。
当多个用户同时连接到服务器时,经由服务器的接收与转发便可以实现客户之间的通信。
对于整体系统的流程,也是分为两部分,即客户端的发起请求,服务器响应请求。
首先是客户端的登陆,客户端在登陆时,必须设置所想要连接的服务器,然后客户端就会根据设置的服务器IP地址,向服务器发起建立连接请求。
而服务器端是始终在监听网络状态的,主要检测到有一个连接请求,那么服务器就会给当前的发起端分配一个服务线程,用于处理它的各种请求。
对于客户端的各种请求,实际上都是通过在客户发往服务器的各种字符流区分的,具体的方法就是在消息的头部以及尾部添加特殊字符串,从而实现服务器对消息请求的识别。
比如对于登陆信息,消息的头部就是“PEOPLO”,而对于私聊中的消息,头部就是“SEC”,其他的同理都添加了头部。
当然,对于客户端来说,这些都是透明的,用户的操作并没有受到任何影响。
在服务器端,消息被检测分析后,变回根据具体的目的进行处理,比如是私聊消息,服务器便会根据其尾部的目的信息,向目标端转发该条消息。
这里额外要说的是,该系统特别的对用户发来的消息进行了加密处理,即用户的各种具体信息,不仅能够防止向第三方的泄漏,而且即使服务器端出现异常,信息也不会泄漏。
对于私聊的方式,该系统所采用的方法类似于QQ的通信方式,由发起方主动连接,当目的方接收到连接请求后,会主动建立一个私聊窗口,从而实现私聊。
2.2总体设计流程图学生信息管理软件详细设计3.1.界面设计由于这里界面设计源代码比较简单,这里不再列出。
3.1.1 服务器界面设计服务器界面3.1.2客户端界面设计登陆界面注册界面聊天室界面3.2通信功能实现方法列举部分实现通信功能的主要代码AppServer.java文件public class AppServer extends Thread {private ServerSocket serverSocket;private ServerFrame sFrame;private static Vector userOnline = new Vector(1, 1);private static 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* 退出信息*/public static void fail(Exception e, String str) {System.out.println(str + " 。
" + e);}/*** 监听客户的请求,当有用户请求时创建Connection线程*/public void 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("不能监听");}}/*** 启动服务器*/public static void main(String args[]) {new AppServer();}}ServerFrame.java文件public class ServerFrame extends JFrame implements ActionListener { public JList list;/****/private static final long serialVersionUID = -20L;// 服务器信息面板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);setDefaultCloseOperation(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() { public void actionPerformed(ActionEvent arg0) { closeServer();}});lblLog = new JLabel("[服务器日志]");taLog = new TextArea(20, 50);btnSaveLog = new JButton("保存日志(S)"); btnSaveLog.addActionListener(new ActionListener() { public void 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() {public void actionPerformed(ActionEvent arg0) {serverMessage();}});lblUserCount = new JLabel("在线总人数0 人");btnKick = new JButton("踢人(K)");btnKick.addActionListener(new ActionListener() {public void 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);}protected void serverMessage() {// TODO自动生成方法存根this.serverMessage = txtNotice.getText();txtNotice.setText("");}protected void closeServer() {// TODO自动生成方法存根this.dispose();//this.res}protected void 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);}}protected void tiRen() {// TODO自动生成方法存根ti = list.getSelectedValue().toString();log("Ti:"+ti);}private void log(String string) {// TODO自动生成方法存根String newta = taMessage.getText();newta += ("\n"+string);taMessage.setText(newta);}public void actionPerformed(ActionEvent evt) {}public static void main(String args[]) {new ServerFrame();}}Connection.java文件public class Connection extends Thread { /*** 与客户端通讯Socket*/private Socket netClient;/*** 在线用户列表*/private Vector<Customer> userOnline;/*** 聊天信息*/private Vector<Chat> userChat;/*** 从客户到服务器输入流*/private ObjectInputStream fromClient;/*** 传到客户端打印流*/private PrintStream toClient;/*** 注册用户列表*/private static 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();}/*** 处理与客户端的通讯线程*/public void 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")public void 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")public void 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();}}/*** 刷新服务器日志窗体在线列表**/private void 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" })public void 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;} else if (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" })public void serverRegisteDB() {try {int flag = 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 into yonghu(custName,custPassword,age,sex,email,head) values('"+ clientMessage.custName+ "','"+ clientMessage.custPassword+ "','"+ clientMessage.age+ "','"+ clientMessage.sex+ "','"+ clientMessage.email+ "','" + 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);}}/*** 发送信息处理*/public void 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) {}}/*** 增加信息处理*/public void serverChat() {// 将接收到的对象值赋给聊天信息的序列化对象Chat cObj = new Chat();cObj = (Chat) obj;// chenmincObj.chatMessage = WordFilter.filter(cObj.chatMessage);chatLog(cObj);// 将聊天信息的序列化对象填加到保存聊天信息的矢量中userChat.addElement((Chat) cObj);return;}/*** 用户退出处理*/SuppressWarnings("deprecation")public void 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* 退出用户名对象*/private void 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* 日志信息*/public void log(String log) {String newlog = sFrame.taLog.getText() + "\n" + log;sFrame.taLog.setText(newlog);}/**** 日志服务器窗体写聊天信息*** 聊天信息对象*/SuppressWarnings("deprecation")public void 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 Auto-generated catch blocke.printStackTrace();}sFrame.taMessage.setText(newlog);}}设计体会及今后的改进意见为了提高我们的实践能力,让我们学以致用,能灵活运用所学的知识进行再创造,学校特安排我们进行为期二周的Visual C++课程设计实习,并安排了指导老师帮助辅导,让我们在规化、严谨化、实用化上面有了很大进展。