聊天室课程设计报告.docx
- 文档编号:28101837
- 上传时间:2023-07-08
- 格式:DOCX
- 页数:24
- 大小:139.69KB
聊天室课程设计报告.docx
《聊天室课程设计报告.docx》由会员分享,可在线阅读,更多相关《聊天室课程设计报告.docx(24页珍藏版)》请在冰豆网上搜索。
聊天室课程设计报告
西安郵電學院
网络课程设计设计报告
题目:
基于TCPSOCKET的JAVA聊天室
院系名称:
计算机学院
专业名称:
网络工程
班级:
学生姓名:
学号(8位):
指导教师:
设计起止时间:
2011年6月20日~2011年7月1日
第一章功能分析
1.1需求分析
人们日常生活中越来越多地使用聊天室这项应用来为自己的工作和学习服务。
一个操作简单,界面友好、运行稳定的聊天室对于小型局域网的用户可以起到很好的交流作用。
所谓聊天室就是一个可以让许多用户同时互相通信的网上园地,个人用户可以通过聊天室将自己融入整个主流社会中。
根据目前使用聊天室的用户需求显示,用户对于聊天室主要有以下几点要求:
(1).与聊天室成员一起聊天。
(2).可以与聊天室成员私聊。
(3).可以改变聊天内容风格。
(4).用户注册(含头像)、登录。
(5).服务器监控聊天内容。
(6).服务器过滤非法内容。
(7).服务器发送通知。
(8).服务器踢人。
(9).保存服务器日志。
(10).保存用户聊天信息。
该简易聊天室是为许多喜爱聊天的用户开发设计的,和许多大型的网络聊天室相比该小聊天室功能比较简单,但能实现基本的聊天功能,点对多、点对点聊天和基本的用户功能,登录、查看在线用户等。
1.2软件功能描述
(1)、户设置:
用户自定义自己的登录名,成功设置后,服务端能接收到新设置的用户名。
(2)、登录功能:
在服务端开启的情况下,用户可以以自己自定义或者默认的登录名和登录地址端口登录到客户端,并能在服务器端显示登录状态。
(3)、公聊:
用户可以与“所有人”聊天,在线用户可正常接收并正确显示公聊消。
(4)、私聊:
用在线用户和其他用户聊天。
记录对于聊天室的其他用户是不可见的。
(5)、聊天心情:
用户在聊天的过程中可以选择相应的心情来表达自己的情感。
(6)、系统消息:
服务端运行,为每一个用户都能接收服务器端发送的信息提示信息。
(7)、用户的状态.每一个客户端用户都可以实时看到目前其他在线用户的状态。
(8)、用户剔除:
用户可以被系统剔除,并重新登记登录名和地址。
(9)、用户退出:
用户可以在正常情况下退出聊天室。
(10)、服务端控制:
服务端开启的情况下,用户才能登陆成功和聊天;用户设置的地址端口也必须与服务端的侦听端口一致,否则不能登录。
第二章主要模块描述及流程图
2.1模块介绍
本聊天室分为聊天室服务端和聊天室客户端,服务端与客户端之间通过套接口Socket(TCP)连接。
在java中使用套接口相当简单,JavaAPI为处理套接口的通信提供了一个类.Socket,服务器采用多线程以满足多用户的请求,并通过创建一个AppSocket来监听来自客户的连接请求,默认IP地址为:
127.0.0.1默认端口为8888。
2.1.1服务端模块图
聊天室服务端
端口服务
启动服务
发送系统消息
停止服务
退出
服务器
消息显示
聊天室服务端模块图3-1-1
端口服务:
输入要侦听的端口,默认为8888。
启动服务:
启动服务器,并开始在设置的端口中侦听,客户端用户可以登录并聊天。
停止服务:
关闭服务器,侦听结束。
客户端用户不能再聊天。
发送系统消息:
服务器端给所有人或者个别用户发送消息。
消息显示:
可以显示所有用户的聊天记录,和上线、下线信息。
退出服务器:
退出程序,并停止服务。
2.1.2客户端模块图
用户设置:
用户可以设置自己的用户名进行聊天。
连接设置:
用户可以设置自己的服务器的IP,端口号,默认地址为:
127.0.0.1:
8888。
用户登录:
在聊天室服务端已开启的情况下,用户才能登录,之后才能开始聊天。
用户注销:
退出聊天,可以继续修改用户设置和连接设置。
发送和接收聊天信息:
用户可以用户发送信息,并能看送给自己或所有人的消息。
退出:
关闭所有聊天并退出客户端。
2.2流程图
聊天室服务器
端口服务
启动服务
聊天室客户端
用户设置
登录
连接设置
聊天
退出
设置侦听端口
默认端口:
8888
设置用户名
默认连接地址或用户名
设置IP地址和端口
2.3服务器客户端关系图
(1).聊天室服务器端设计:
2.3.1聊天室服务器端设计
聊天室服务端主要包括4个文件,它们的功能如下:
(1)AppServer.java服务器端进行监听客户端进行服务器的启动,以及端客户进行处理用户退出。
(2)ServerFrame为服务器端管理界面,负责用户帐号信息保存和用户在线的状态和相关服务器端口的信息以及访问的方式。
(3)serverChat.java负责对用户信息的处理包括公聊和私聊的信息的发送以及将聊天信息的序列化对象填加到保存聊天信息的记事本中。
2.3.2聊天室客户端设计
ActionListener
ChatClient
-port:
publicstaticin
-serverSocket:
ServerSocket
-messageShow:
JTextArea
-userLinkList:
UserLinkList
-showStatus:
JTextField
+ChatClient():
public
+init():
publicvoid
+Connect():
publicvoid
+DisConnect():
publicvoid
+SendMessage():
publicvoid
JFrame
ClientReceive
-socket:
Socket
-output:
ObjectOutputStream
-input:
ObjectInputStream+ClientReceive(Socket,ObjectOutputStream,ObjectInputStream,JComboBox,JTextArea,JTextField)
Thread
聊天室客户端主要包括6个文件,其主要功能如下:
(1).ChatClient.java为客户端程序启动类,负责客户端的启动和退出。
(2).Login.java为客户端程序登录界面,负责用户帐号信息的验证与反馈。
(3).Register.java为客户端程序注册界面,负责用户帐号信息的注册验证与反馈。
(4).ChatRoom.java为客户端程序聊天室主界面,负责接收、发送聊天内容与服务器端的Connection.java亲密合作。
(5).Windowclose为ChatRoom.java的内部类,负责监听聊天室界面的操作,当用户退出时返回给服务器信息。
(6).Clock.java为客户端程序的一个小程序,实现的一个石英钟功能。
第三章主要程序代码和界面展示
3.1服务器端启动代码和界面
3.1.1服务器启动代码
publicclassAppServerextendsThread{
privateServerSocketserverSocket;
privateServerFramesFrame;
privatestaticVectoruserOnline=newVector(1,1);
privatestaticVectorv=newVector(1,1);
//创建服务器启动服务监听8888端口
publicAppServer(){
sFrame=newServerFrame();
try{
serverSocket=newServerSocket(8888);
//获取服务器的主机名和IP地址
InetAddressaddress=InetAddress.getLocalHost();
sFrame.txtServerName.setText(address.getHostName());
sFrame.txtIP.setText(address.getHostAddress());
sFrame.txtPort.setText("8888");
}catch(IOExceptione){
fail(e,"不能启动服务!
");}
sFrame.txtStatus.setText("已启动...");
this.start();//启动线程}
//退出服务器,退出消息
publicstaticvoidfail(Exceptione,Stringstr){
System.out.println(str+"。
"+e);}
//监听客户的请求,当有用户请求时创建Connection线程
publicvoidrun(){try{while(true){//监听并接受客户的请求
Socketclient=serverSocket.accept();
newConnection(sFrame,client,userOnline,v);//支持多线程
//System.out.println("userLength:
"+userLength);
}}atch(IOExceptione){
fail(e,"不能监听!
");}}
//服务器
publicstaticvoidmain(Stringargs[]){
newAppServer();}}
3.1.2服务器启动界面
服务器登录界面图4-1-2
3.2注册主要代码及界面
3.2.1注册主要代码
publicclassRegisterextendsJFrameimplementsActionListener{
privateJComboBoxcomboBox;
privatestaticfinallongserialVersionUID=9019746127517522180L;
JPanelpnlRegister;
JLabellblUserName,lblGender,lblAge;
JLabellblPassword,lblConfirmPass,lblEmail,logoPosition;
JTextFieldtxtUserName,txtAge,txtEmail;
JPasswordFieldpwdUserPassword,pwdConfirmPass;
JRadioButtonrbtnMale,rbtnFemale;
ButtonGroupbtngGender;
JButtonbtnOk,btnCancel,btnClear;
StringstrServerIp;
finalJLabelheadLabel=newJLabel();
//用于将窗口用于定位
Dimensionscrnsize;
Toolkittoolkit=Toolkit.getDefaultToolkit();
//构造方法
publicRegister(Stringip)
{super("[HappyChat]聊天室注册窗口");
strServerIp=ip;
pnlRegister=newJPanel();
this.getContentPane().add(pnlRegister);
lblUserName=newJLabel("用户名:
");
lblGender=newJLabel("性别:
");
lblAge=newJLabel("年龄:
");
lblPassword=newJLabel("密码:
");
lblConfirmPass=newJLabel("确认密码:
");
lblEmail=newJLabel("电子邮件:
");
txtUserName=newJTextField(30);
txtEmail=newJTextField(30);
txtAge=newJTextField(10);
pwdUserPassword=newJPasswordField(30);
pwdConfirmPass=newJPasswordField(30);
rbtnMale=newJRadioButton("男",true);
rbtnFemale=newJRadioButton("女");
btngGender=newButtonGroup();
btnOk=newJButton("确定(O)");
btnOk.setMnemonic('O');
btnOk.setToolTipText("保存注册信息");
btnCancel=newJButton("返回(B)");
btnCancel.setMnemonic('B');
btnCancel.setToolTipText("返回登录窗口");
btnClear=newJButton("清空(L)");
btnClear.setMnemonic('L');
btnClear.setToolTipText("清空注册信息");//按钮注册监听
btnOk.addActionListener(this);
btnCancel.addActionListener(this);
btnClear.addActionListener(this);
finalJLabellabel=newJLabel();
label.setText("头像:
");
label.setBounds(30,120,60,15);
pnlRegister.add(label);
comboBox=newJComboBox();
comboBox.setAutoscrolls(true);
comboBox.setModel(newDefaultComboBoxModel(newString[]{"1","2",}));
comboBox.setBounds(110,116,47,23);
comboBox.addItemListener(newItemListener(){
publicvoiditemStateChanged(ItemEventarg0){
Iconlogo=newImageIcon("face\\"+comboBox.getSelectedItem().toString()+".jpg");
//TODO自动生成方法存根
headLabel.setIcon(logo);}});
pnlRegister.add(comboBox);
headLabel.setHorizontalAlignment(SwingConstants.CENTER);
//.setIcon(SwingResourceManager.getIcon(Register.class,"face/1.jpg"));
headLabel.setIcon(newImageIcon("face//1.JPG"));
headLabel.setBounds(247,88,74,72);
pnlRegister.add(headLabel);
}//构造方法结束
//按钮监听响应
publicvoidactionPerformed(ActionEventae)
{Objectsource=newObject();
source=ae.getSource();
if(source.equals(btnOk))//"确定"按钮{
register();}
if(source.equals(btnCancel))//"返回"按钮{
newLogin();this.dispose();}
if(source.equals(btnClear))//"清空"按钮{
txtUserName.setText("");
pwdUserPassword.setText("");
pwdConfirmPass.setText("");
txtAge.setText("");
txtEmail.setText("");}
}//actionPerformed()结束
//////////"确定"按钮事件响应//////////
@SuppressWarnings({"deprecation","static-access"})
publicvoidregister(){//接受客户的详细资料
Register_Customerdata=newRegister_Customer();
data.custName=txtUserName.getText();
data.custPassword=pwdUserPassword.getText();
data.age=txtAge.getText();
data.sex=rbtnMale.isSelected()?
"男":
"女";
data.email=txtEmail.getText();
//chenmin
data.head=comboBox.getSelectedItem().toString();
//验证用户名是否为空
if(data.custName.length()==0){
JOptionPane.showMessageDialog(null,"用户名不能为空");return;}
//验证密码是否为空if(data.custPassword.length()==0){
JOptionPane.showMessageDialog(null,"密码不能为空");return}
//验证密码的一致性
if(!
data.custPassword.equals(pwdConfirmPass.getText())){
JOptionPane.showMessageDialog(null,"密码两次输入不一致,请重新输入");return;}//验证年龄是否为空
if(data.age.length()==0){
JOptionPane.showMessageDialog(null,"年龄不能为空");return;}
//验证年龄的合法性
intage=Integer.parseInt(txtAge.getText());
if(age<=0||age>100){JOptionPane.showMessageDialog(null,"年龄输入不合法");return;}//验证Email的正确性
intFound_flag=0;//判断标志
for(inti=0;i if(data.email.charAt(i)=='@'){ Found_flag++;}} if(Found_flag! =1){JOptionPane.showMessageDialog(null,"电子邮箱格式不正确,请重新输入");return;}try{//连接到服务器SockettoServer; toServer=newSocket(strServerIp,8888); ObjectOutputStreamstreamToServer=newObjectOutputStream(toServer.getOutputStream()); //写客户详细资料到服务器socket streamToServer.writeObject((Register_Customer)data); //读来自服务器socket的登陆状态 BufferedReaderfromServer=newBufferedReader(newInputStreamReader(toServer.getInputStream())); Stringstatus=fromServer.readLine();//显示成功消息 JOptionPaneop=newJOptionPane(); op.showMessageDialog(null,status); if(status.equals(data.custName+"注册成功")) {txtUserName.setText(""); pwdUserPassword.setText(""); pwdConfirmPass.setText(""); txtAge.setText(""); txtEmail.setText("");}//关闭流对象 streamToServer.close(); fromServer.close();} catch(InvalidClassExceptione1){ JOptionPane.showMessageDialog(null,"类错误! ");} catch(NotSerializableExceptione2){ JOptionPane.showMessageDialog(null,"对象未序列化! ");} catch(IOExceptione3){ JOptionPane.showMessageDialog(null,"不能写入到指定服务器! ");} }//方法register()结束 publicstaticvoidmain(Stringargs[]){newRegister("127.0.0.1"); }}//classRegister结束 3.2.2注册界面 3.3登录主要代码和界面 3.3.1登录代码 publicclassLoginextendsJFrameimplementsActionListener{ privatestaticfinallongserialVersionUID=-8965773902056088264L; privateJPanelpnlLogin; privateJButtonbtnLogin,btnRegister,btnExit; privateJLabellblServer,lblUserName,lblPassword,lblLogo; privateJTextFieldtxtUserName,txtServer; privateJPasswordFieldpwdPassword; privateString
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 聊天室 课程设计 报告