当前位置:文档之家› 网络聊天室课程设计报告(内附java代码)

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

课程设计网络聊天室院(系) 别信电学院班级计算102学号姓名指导教师时间 2013-4-18—2013-5-10课程设计任务书题目网络聊天室课程设计系 (部) 信电学院专业计算机科学与技术班级计算102学生姓名学号4 月 18 日至5 月 10 日共 4 周指导教师(签字)系主任(签字)年月日成绩评定表目录课程设计概述 (2)问题描述 (2)功能需求分析 (2)环境需求分析 (2)学生信息管理系统软件总体设计 (3)整体思路 (3)总体设计流程图 (4)学生信息管理软件详细设计 (5).界面设计 (5)通信功能实现方法 (8)参考文献....................................................错误!未定义书签。

课程设计概述问题描述`随着计算机网络日新月异的发展,人们的交流方式越来越多,传统的交流方式,如:信件、电报、电话等已经难以满足人们的交流要求,在互联网上即时的和好友取得联系,已经成为当今社会人们主流的联系方式。

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

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

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

为此,我决定开发一个专用于实现两台计算机之间即时通讯、文件共享的软件,以方便两台计算机之间信息的交流。

避免了服务器忙或与服务器无法连接时,浪费过多时间用于和服务器建立连接。

因此,这个软件是极具适应性和实用性的即时通讯软件。

功能需求分析实现网络聊天的功能,采用Windows Socket(或Java Socket)编程,服务器与客户端采用了TCP/IP连接方式,在设计聊天方案时,可将所有信息发往服务器端,再由服务器进行处理,服务器端是所有信息的中心。

服务器端要保存用户信息,可利用数据库来实现这一功能,需要建立用户信息数据库。

在客户端可采用文件系统保存聊天纪录和用户号码。

可通过闪动托盘图标和播放不同的音乐提示信息到来及好友上线等信息。

可通过建立消息链表来保存用户接收的各种消息。

环境需求分析运行环境:Windows 9x、2000、XP、Windows 7必要环境:JDK 以上、eclipse开发环境硬件环境:CPU 400MHz以上,内存512MB以上学生信息管理系统软件总体设计整体思路该C/S模式的聊天系统,就是服务器来提供服务端连接响应,客户端主动的发起连接请求。

当多个用户同时连接到服务器时,经由服务器的接收与转发便可以实现客户之间的通信。

对于整体系统的流程,也是分为两部分,即客户端的发起请求,服务器响应请求。

首先是客户端的登陆,客户端在登陆时,必须设置所想要连接的服务器,然后客户端就会根据设置的服务器IP地址,向服务器发起建立连接请求。

而服务器端是始终在监听网络状态的,主要检测到有一个连接请求,那么服务器就会给当前的发起端分配一个服务线程,用于处理它的各种请求。

对于客户端的各种请求,实际上都是通过在客户发往服务器的各种字符流区分的,具体的方法就是在消息的头部以及尾部添加特殊字符串,从而实现服务器对消息请求的识别。

比如对于登陆信息,消息的头部就是“PEOPLO”,而对于私聊中的消息,头部就是“SEC”,其他的同理都添加了头部。

当然,对于客户端来说,这些都是透明的,用户的操作并没有受到任何影响。

在服务器端,消息被检测分析后,变回根据具体的目的进行处理,比如是私聊消息,服务器便会根据其尾部的目的信息,向目标端转发该条消息。

服务器界面客户端界面设计注册界面通信功能实现方法列举部分实现通信功能的主要代码文件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);.");(); etScreenSize();reateEmptyBorder(1, 1, 1, 1)));lblStatus = new JLabel("当前状态:");txtStatus = new JTextField(10);(false);lblNumber = new JLabel("当前在线人数:"); txtNumber = new JTextField("0 人", 10);(false);lblMax = new JLabel("最多在线人数:");txtMax = new JTextField("50 人", 10);(false);lblServerName = new JLabel("服务器名称:"); txtServerName = new JTextField(10);(false);lblProtocol = new JLabel("访问协议:");txtProtocol = new JTextField("HTTP", 10); (false);lblIP = new JLabel("服务器IP:");txtIP = new JTextField(10);(false);lblPort = new JLabel("服务器端口:");txtPort = new JTextField("8000", 10);(false);btnStop = new JButton("关闭服务器(C)");(new ActionListener() {public void actionPerformed(ActionEvent arg0) { closeServer();}});lblLog = new JLabel("[服务器日志]");taLog = new TextArea(20, 50);btnSaveLog = new JButton("保存日志(S)");(new ActionListener() {public void actionPerformed(ActionEvent arg0) { saveLog();}});(lblStatus);(txtStatus);(lblNumber);(txtNumber);(lblMax);(txtMax);(lblServerName);(txtServerName);(lblProtocol);(txtProtocol);(lblIP);(txtIP);(lblPort); (txtPort);(5, 5, 100, 400); (110, 5, 100, 30); (110, 35, 400, 370); (200, 410, 120, 30); (320, 410, 120, 30); (pnlServerInfo); (lblLog); (taLog); (btnStop); (btnSaveLog);etView(lstUser);(5, 5, 100, 25); (5, 35, 300, 360); (310, 5, 100, 25); (310, 35, 220, 360); (5, 410, 40, 25);(50, 410, 160, 25); (210, 410, 80, 25); (320, 410, 100, 25); (440, 410, 80, 25);(lblMessage); (taMessage); (lblUser); (spUser);list = new JList(); (new String[] { "" }); (list);(lblNotice); (txtNotice); (btnSend); (lblUserCount); (btnKick);dd(tpServer);setVisible(true);}protected void serverMessage() {oString();log("Ti:"+ti);}private void log(String string) {etName().equals("Customer")) { etName().equals("Register_Customer")) { etName().equals("Message")) {serverMessage();}if ().getName().equals("Chat")) {serverChat();}if ().getName().equals("Exit")) {serverExit();}} catch (IOException e) {} catch (ClassNotFoundException e1) { "读对象发生错误!" + e1);} finally {try {();} catch (IOException e) {}}}/**** 登录处理*/@SuppressWarnings("deprecation")public void serverLogin() {try {Customer clientMessage2 = (Customer) obj;lementAt(a)).custName;if {login_flag = 1;break;}}if () >= 50) {("登录人数过多,请稍候再试");break;}if (login_flag == 0) {= ;oString();"ps:["+ps+"]");"pass:["+pass+"]");if ())) {login = true;"logined:");}"compareTo:"+(pass));head=("head");"head:"+("head"));}"login:"+login);if (!login) {("密码不正确");return;}ustName;if {login_flag = 1;break;}}if () >= 50) {("登录人数过多,请稍候再试");return;}if (login_flag == 0) {"head:"+head);=head;lementAt(i);if {("注册名重复,请另外选择");flag = 1;break;} else if"所有人")) {("禁止使用此注册名,请另外选择");flag = 1;break;}}}if (flag == 0) {etOutputStream());((Message) mess);();();} catch (IOException e) {}}/*** 增加信息处理*/public void serverChat() {// 将接收到的对象值赋给聊天信息的序列化对象Chat cObj = new Chat();cObj = (Chat) obj;// chenmin= ;chatLog(cObj);// 将聊天信息的序列化对象填加到保存聊天信息的矢量中((Chat) cObj);return;}/*** 用户退出处理*/@SuppressWarnings("deprecation")public void serverExit() {Exit exit = new Exit();exit = (Exit) obj;removeUser(exit);// chenminif {= "";}Date t = new Date();log("用户" + + "已经退出, " + "退出时间:" + ());freshServerUserList();}/*** 在线用户中删除退出用户** @param exit* 退出用户名对象*/private void removeUser(Exit exit) {// TODO自动生成方法存根Vector<Customer> vec = new Vector<Customer>();Customer _cus = null;for (int j = 0; j < (); j++) {_cus = (Customer) (j);if (! {(_cus);}// "list:"+;}();for (int j = 0; j < (); j++) {_cus = (Customer) (j);(_cus);}}/*** 日志服务器窗体写信息** @param log* 日志信息*/public void log(String log) {String newlog = + "\n" + log;}/**** 日志服务器窗体写聊天信息*** 聊天信息对象*/@SuppressWarnings("deprecation")public void chatLog(Chat obj) {String newlog = Date date = new Date();if (! {newlog += "\n";newlog += ("[" + () + "]");newlog += ;newlog += "->";newlog += ;newlog += ":";newlog += ;}String text = "";text += ;text += "->";text += ;text += ":";text += ;String sql ="insert into logs(text,shijian) values('"+text+"','"+()+"')";try {(sql);} catch (Exception e) {// TODO Auto-generated catch block();}}}设计体会及今后的改进意见为了提高我们的实践能力,让我们学以致用,能灵活运用所学的知识进行再创造,学校特安排我们进行为期二周的Visual C++课程设计实习,并安排了指导老师帮助辅导,让我们在规范化、严谨化、实用化上面有了很大进展。

相关主题