当前位置:文档之家› 聊天室课程设计报告

聊天室课程设计报告

网络课程设计设计报告题目:基于TCP SOCKET的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中使用套接口相当简单,Java API为处理套接口的通信提供了一个类.Socket,服务器采用多线程以满足多用户的请求,并通过创建一个AppSocket 来监听来自客户的连接请求,默认IP 地址为:127.0.0.1默认端口为8888。

2.1.1服务端模块图端口服务:输入要侦听的端口,默认为8888。

启动服务:启动服务器,并开始在设置的端口中侦听,客户端用户可以登录并聊天。

停止服务:关闭服务器,侦听结束。

客户端用户不能再聊天。

发送系统消息:服务器端给所有人或者个别用户发送消息。

消息显示:可以显示所有用户的聊天记录,和上线、下线信息。

退出服务器:退出程序,并停止服务。

2.1.2连接设置:用户可以设置自己的服务器的IP,端口号,默认地址为:127.0.0.1:8888。

用户登录:在聊天室服务端已开启的情况下,用户才能登录,之后才能开始聊天。

用户注销:退出聊天,可以继续修改用户设置和连接设置。

发送和接收聊天信息:用户可以用户发送信息,并能看送给自己或所有人的消息。

退出:关闭所有聊天并退出客户端。

2. 2 流程图2. 3 服务器客户端关系图2.3.1聊天室服务器端设计聊天室服务端主要包括4个文件,它们的功能如下:(1)AppServer .java 服务器端进行监听客户端进行服务器的启动,以及端客户进行处理用户退出。

(2)ServerFrame 为服务器端管理界面,负责用户帐号信息保存和用户在线的状态和相关服务器端口的信息以及访问的方式。

(3)serverChat.java 负责对用户信息的处理包括公聊和私聊的信息的发送以及将聊天信息的序列化对象填加到保存聊天信息的记事本中。

2.3.2聊天室客户端设计聊天室客户端主要包括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 服务器启动代码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);// 创建服务器启动服务监听8888端口public AppServer() {sFrame = new ServerFrame();try {serverSocket = new ServerSocket(8888);// 获取服务器的主机名和IP地址InetAddress address = InetAddress.getLocalHost();sFrame.txtServerName.setText(address.getHostName());sFrame.txtIP.setText(address.getHostAddress());sFrame.txtPort.setText("8888");} catch (IOException e) {fail(e, "不能启动服务!");}sFrame.txtStatus.setText("已启动...");this.start(); // 启动线程}// 退出服务器,退出消息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);}}atch (IOException e) {fail(e, "不能监听!");}}//服务器public static void main(String args[]) {new AppServer();}}3.1.2 服务器启动界面服务器登录界面图 4-1-23. 2 注册主要代码及界面3.2.1 注册主要代码public class Register extends JFrame implements ActionListener{private JComboBox comboBox;private static final long serialVersionUID = 9019746127517522180L;JPanel pnlRegister;JLabel lblUserName,lblGender,lblAge;JLabel lblPassword,lblConfirmPass,lblEmail,logoPosition;JTextField txtUserName,txtAge,txtEmail;JPasswordField pwdUserPassword,pwdConfirmPass;JRadioButton rbtnMale,rbtnFemale;ButtonGroup btngGender;JButton btnOk,btnCancel,btnClear;String strServerIp;final JLabel headLabel = new JLabel();//用于将窗口用于定位Dimension scrnsize;Toolkit toolkit=Toolkit.getDefaultToolkit();//构造方法public Register(String ip){super("[HappyChat]聊天室注册窗口");strServerIp=ip;pnlRegister=new JPanel();this.getContentPane().add(pnlRegister);lblUserName=new JLabel("用户名:");lblGender=new JLabel("性别:");lblAge=new JLabel("年龄:");lblPassword=new JLabel("密码:");lblConfirmPass=new JLabel("确认密码:");lblEmail=new JLabel("电子邮件:");txtUserName=new JTextField(30);txtEmail=new JTextField(30);txtAge=new JTextField(10);pwdUserPassword=new JPasswordField(30);pwdConfirmPass=new JPasswordField(30);rbtnMale=new JRadioButton("男",true);rbtnFemale=new JRadioButton("女");btngGender=new ButtonGroup();btnOk=new JButton("确定(O)");btnOk.setMnemonic('O');btnOk.setToolTipText("保存注册信息");btnCancel=new JButton("返回(B)");btnCancel.setMnemonic('B');btnCancel.setToolTipText("返回登录窗口");btnClear=new JButton("清空(L)");btnClear.setMnemonic('L');btnClear.setToolTipText("清空注册信息");//按钮注册监听btnOk .addActionListener(this);btnCancel.addActionListener(this);btnClear .addActionListener(this);final JLabel label = new JLabel();label.setText("头像:");label.setBounds(30, 120, 60, 15);pnlRegister.add(label);comboBox = new JComboBox();comboBox.setAutoscrolls(true);comboBox.setModel(new DefaultComboBoxModel(new String[] {"1", "2",}));comboBox.setBounds(110, 116, 47, 23);comboBox.addItemListener(new ItemListener() {public void itemStateChanged(ItemEvent arg0) {Icon logo = new ImageIcon("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(new ImageIcon("face//1.JPG"));headLabel.setBounds(247, 88, 74, 72);pnlRegister.add(headLabel);} //构造方法结束//按钮监听响应public void actionPerformed(ActionEvent ae){Object source=new Object();source=ae.getSource();if (source.equals(btnOk)) //"确定"按钮{register(); }if (source.equals(btnCancel)) //"返回"按钮{new Login();this.dispose();}if (source.equals(btnClear)) //"清空"按钮{txtUserName.setText("");pwdUserPassword.setText("");pwdConfirmPass.setText("");txtAge.setText("");txtEmail.setText(""); }} //actionPerformed()结束//////////"确定"按钮事件响应//////////@SuppressWarnings({ "deprecation", "static-access" })public void register(){//接受客户的详细资料Register_Customer data=new Register_Customer();data.custName = txtUserName.getText();data.custPassword = pwdUserPassword.getText();data.age = txtAge.getText();data.sex = rbtnMale.isSelected()?"男":"女";data.email = txtEmail.getText();//chenmindata.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; }//验证年龄的合法性int age=Integer.parseInt(txtAge.getText());if (age<=0||age>100){JOptionPane.showMessageDialog(null,"年龄输入不合法");return;}//验证Email的正确性int Found_flag=0; //判断标志for (int i=0;i<data.email.length();i++){if(data.email.charAt(i)=='@'){Found_flag++; }}if(Found_flag!=1){JOptionPane.showMessageDialog(null,"电子邮箱格式不正确,请重新输入"); return; }try{ //连接到服务器Socket toServer;toServer = new Socket(strServerIp,8888);ObjectOutputStream streamToServer=new ObjectOutputStream (toServer.getOutputStream());//写客户详细资料到服务器socketstreamToServer.writeObject((Register_Customer)data);//读来自服务器socket的登陆状态BufferedReader fromServer=new BufferedReader(new InputStreamReader(toServer.getInputStream()));String status=fromServer.readLine();//显示成功消息JOptionPane op=new JOptionPane();op.showMessageDialog(null,status);if(status.equals(data.custName+"注册成功")){ txtUserName.setText("");pwdUserPassword.setText("");pwdConfirmPass.setText("");txtAge.setText("");txtEmail.setText(""); } //关闭流对象streamToServer.close();fromServer.close(); }catch(InvalidClassException e1){JOptionPane.showMessageDialog(null,"类错误!");}catch(NotSerializableException e2){JOptionPane.showMessageDialog(null,"对象未序列化!"); } catch(IOException e3){JOptionPane.showMessageDialog(null,"不能写入到指定服务器!"); } } //方法register()结束public static void main(String args[]){new Register("127.0.0.1");}} //class Register 结束3.2.2 注册界面3. 3 登录主要代码和界面3.3.1 登录代码public class Login extends JFrame implements ActionListener {private static final long serialVersionUID = -8965773902056088264L;private JPanel pnlLogin;private JButton btnLogin, btnRegister, btnExit;private JLabel lblServer, lblUserName, lblPassword, lblLogo;private JTextField txtUserName, txtServer;private JPasswordField pwdPassword;private String strServerIp;// 用于将窗口定位private Dimension scrnsize;private Toolkit toolkit = Toolkit.getDefaultToolkit(); public Login() { super("登录[HappyChat]聊天室"); pnlLogin = new JPanel();this.getContentPane().add(pnlLogin);lblServer = new JLabel("服务器(S):");lblUserName = new JLabel("用户名(U):");lblPassword = new JLabel("密码(P):");txtServer = new JTextField(20);txtServer.setText("127.0.0.1");txtUserName = new JTextField(20);pwdPassword = new JPasswordField(20);btnLogin = new JButton("登录(L)");btnLogin.setToolTipText("登录到服务器");btnLogin.setMnemonic('L');btnRegister = new JButton("注册(R)");btnRegister.setToolTipText("注册新用户");btnRegister.setMnemonic('R');btnExit = new JButton("退出(X)");。

相关主题