版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、西安郵電學院网络课程设计 设计报告题 目:基于TCP SOCKET的JAVA聊天室院系名称: 计算机学院 专业名称: 网络工程班 级: 学生姓名: 学号(8位): 指导教师: 设计起止时间:2011年6月20日2011年7月1日第一章 功能分析1.1 需求分析人们日常生活中越来越多地使用聊天室这项应用来为自己的工作和学习服务。一个操作简单,界面友好、运行稳定的聊天室对于小型局域网的用户可以起到很好的交流作用。所谓聊天室就是一个可以让许多用户同时互相通信的网上园地,个人用户可以通过聊天室将自己融入整个主流社会中。根据目前使用聊天室的用户需求显示,用户对于聊天室主要有以下几点要求:(1). 与聊天
2、室成员一起聊天。(2). 可以与聊天室成员私聊。(3). 可以改变聊天内容风格。(4). 用户注册(含头像)、登录。(5). 服务器监控聊天内容。(6). 服务器过滤非法内容。(7). 服务器发送通知。(8). 服务器踢人。(9). 保存服务器日志。(10).保存用户聊天信息。该简易聊天室是为许多喜爱聊天的用户开发设计的,和许多大型的网络聊天室相比该小聊天室功能比较简单,但能实现基本的聊天功能,点对多、点对点聊天和基本的用户功能,登录、查看在线用户等。1.2 软件功能描述(1)、户设置:用户自定义自己的登录名,成功设置后,服务端能接收到新设置的用户名。(2)、登录功能:在服务端开启的情况下,用
3、户可以以自己自定义或者默认的登录名和登录地址端口登录到客户端,并能在服务器端显示登录状态。(3)、公聊:用户可以与“所有人”聊天,在线用户可正常接收并正确显示公聊消。(4)、私聊:用在线用户和其他用户聊天。记录对于聊天室的其他用户是不可见的。(5)、聊天心情:用户在聊天的过程中可以选择相应的心情来表达自己的情感。(6)、系统消息:服务端运行,为每一个用户都能接收服务器端发送的信息提示信息。(7)、用户的状态.每一个客户端用户都可以实时看到目前其他在线用户的状态。(8)、用户剔除:用户可以被系统剔除,并重新登记登录名和地址。(9)、用户退出:用户可以在正常情况下退出聊天室。(10)、服务端控制:
4、服务端开启的情况下,用户才能登陆成功和聊天;用户设置的地址端口也必须与服务端的侦听端口一致,否则不能登录。第二章 主要模块描述及流程图2. 1 模块介绍 本聊天室分为聊天室服务端和聊天室客户端,服务端与客户端之间通过套接口Socket(TCP)连接。在java中使用套接口相当简单,Java API为处理套接口的通信提供了一个类.Socket,服务器采用多线程以满足多用户的请求,并通过创建一个AppSocket来监听来自客户的连接请求,默认IP地址为:127.0.0.1默认端口为8888。2.1.1服务端模块图聊天室服务端端口服务退出服务器发送系统消息停止服务启动服务消息显示 聊天室服务端模块图
5、 3-1-1端口服务:输入要侦听的端口,默认为8888。启动服务:启动服务器,并开始在设置的端口中侦听,客户端用户可以登录并聊天。停止服务:关闭服务器,侦听结束。客户端用户不能再聊天。发送系统消息:服务器端给所有人或者个别用户发送消息。消息显示:可以显示所有用户的聊天记录,和上线、下线信息。退出服务器:退出程序,并停止服务。聊天室客户端2.1.2客户端模块图发送/接收聊天消息连接设置用户登录用户设置退出用户设置:用户可以设置自己的用户名进行聊天。连接设置:用户可以设置自己的服务器的IP,端口号,默认地址为:127.0.0.1:8888。用户登录:在聊天室服务端已开启的情况下,用户才能登录,之后
6、才能开始聊天。用户注销:退出聊天,可以继续修改用户设置和连接设置。发送和接收聊天信息:用户可以用户发送信息,并能看送给自己或所有人的消息。退出:关闭所有聊天并退出客户端。2. 2 流程图 聊天室服务器启动服务端口服务 设置侦听端口 默认端口:8888聊天登录用户设置聊天室客户端 连接设置 设置用户名退出 默认连接地址或用户名 设置IP地址和端口2. 3 服务器客户端关系图(ActionListenerChatServer-port:public static in-serverSocket:ServerSocket-messageShow:JTextArea-userLinkList:User
7、LinkList-showStatus:JTextField+ ChatServer():public+init():public void +startService():public void+stopService():public void +sendStopToAll():public void+sendMsgToAll(String):public void+ sendSystemMessage():public voidJFrameThreadServerListen- server: ServerSocket- userLinkList :UserLinkList- isSto
8、p: public Boolean+ServerListen(ServerSocket,JComboBox,JTextArea,JTextField,UserLinkList)ServerReceive-textarea:JTextArea- userLinkList :UserLinkList- isStop: public Boolean+ServerListen(ServerSocket,JComboBox,JTextArea,JTextField,UserLinkList)1). 聊天室服务器端设计: 2.3.1聊天室服务器端设计聊天室服务端主要包括4个文件,它们的功能如下:(1)Ap
9、pServer .java 服务器端进行监听客户端进行服务器的启动,以及端客户进行处理用户退出。(2)ServerFrame 为服务器端管理界面,负责用户帐号信息保存和用户在线的状态和相关服务器端口的信息以及访问的方式。(3)serverChat.java 负责对用户信息的处理包括公聊和私聊的信息的发送以及将聊天信息的序列化对象填加到保存聊天信息的记事本中。2.3.2聊天室客户端设计ActionListenerChatClient-port:public static in-serverSocket:ServerSocket-messageShow:JTextArea-userLinkList
10、:UserLinkList-showStatus:JTextField+ ChatClient():public+init():public void +Connect():public void+DisConnect():public void +SendMessage():public voidJFrameThreadClientReceive- socket: Socket-output:ObjectOutputStream-input:ObjectInputStream +ClientReceive(Socket,ObjectOutputStream,ObjectInputStream
11、,JComboBox,JTextArea,JTextField )聊天室客户端主要包括6个文件,其主要功能如下:(1).ChatClient.java 为客户端程序启动类,负责客户端的启动和退出。(2).Login.java 为客户端程序登录界面,负责用户帐号信息的验证与反馈。(3).Register.java 为客户端程序注册界面,负责用户帐号信息的注册验证与反馈。(4).ChatRoom.java 为客户端程序聊天室主界面,负责接收、发送聊天内容与服务器端的Connection.java 亲密合作。(5).Windowclose 为ChatRoom.java的内部类,负责监听聊天室界面的操
12、作,当用户退出时返回给服务器信息。(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);/ 创建服务
13、器 启动服务监听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&q
14、uot;); 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) / 监听并接受
15、客户的请求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 注册主要代码及界面
16、3.2.1 注册主要代码public class Register extends JFrame implements ActionListenerprivate JComboBox comboBox;private static final long serialVersionUID = 9019746127517522180L;JPanel pnlRegister;JLabel lblUserName,lblGender,lblAge;JLabel lblPassword,lblConfirmPass,lblEmail,logoPosition;JTextField txtUserName
17、,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 Re
18、gister(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("密 码:");lblConfir
19、mPass=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 JR
20、adioButton("女"); btngGender=new ButtonGroup(); btnOk=new JButton("确定(O)"); btnOk.setMnemonic('O'); btnOk.setToolTipText("保存注册信息");btnCancel=new JButton("返回(B)");btnCancel.setMnemonic('B');btnCancel.setToolTipText("返回登录窗口");btnClear=ne
21、w 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, 1
22、20, 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 arg
23、0) 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&quo
24、t;);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.e
25、quals(btnCancel) /"返回"按钮 new Login();this.dispose(); if (source.equals(btnClear) /"清空"按钮 txtUserName.setText(""); pwdUserPassword.setText(""); pwdConfirmPass.setText(""); txtAge.setText(""); txtEmail.setText(""); /actionPerformed(
26、)结束/"确定"按钮事件响应/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 = r
27、btnMale.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.showM
28、essageDialog(null,"密码不能为空"); return/验证密码的一致性if(!data.custPassword.equals(pwdConfirmPass.getText() JOptionPane.showMessageDialog(null,"密码两次输入不一致,请重新输入"); return;/验证年龄是否为空if(data.age.length()=0) JOptionPane.showMessageDialog(null,"年龄不能为空"); return;/验证年龄的合法性int age=Integer
29、.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,"电子
30、邮箱格式不正确,请重新输入"); return;try /连接到服务器Socket toServer; toServer = new Socket(strServerIp,8888); ObjectOutputStream streamToServer=new ObjectOutputStream (toServer.getOutputStream(); /写客户详细资料到服务器socket streamToServer.writeObject(Register_Customer)data); /读来自服务器socket的登陆状态 BufferedReader fromServer=
31、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(""
32、;); pwdConfirmPass.setText(""); txtAge.setText(""); txtEmail.setText(""); /关闭流对象 streamToServer.close(); fromServer.close(); catch(InvalidClassException e1) JOptionPane.showMessageDialog(null,"类错误!"); catch(NotSerializableException e2)JOptionPane.showMessageDi
33、alog(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
34、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 St
35、ring 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):&q
36、uot;);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
37、('L');btnRegister = new JButton("注册(R)");btnRegister.setToolTipText("注册新用户");btnRegister.setMnemonic('R');btnExit = new JButton("退出(X)");btnExit.setToolTipText("退出系统");btnExit.setMnemonic('X');3.3.2 登录界面登录界面图4-1-33. 4 聊天主要代码和界面3.4.1 主要代
38、码public class ChatRoom extends Thread implements ActionListener private JComboBox daXiaoComboBox;private JComboBox yangShiComboBox;private JComboBox zitiComboBox;private JComboBox emote;static JFrame frmChat;JPanel pnlChat;JButton btnCls, btnExit, btnSend, btnClear, btnSave, btnTimer;JLabel lblUserL
39、ist, lblUserMessage, lblSendMessage, lblChatUser;JLabel lblUserTotal, lblCount, lblBack;JTextField txtMessage;java.awt.List lstUserList;TextArea taUserMessage;JComboBox cmbUser;JCheckBox chPrivateChat;String strServerIp, strLoginName;Thread thread;final JLabel headLabel = new JLabel();/ 用于将窗口用于定位Dim
40、ension scrnsize;Toolkit toolkit = Toolkit.getDefaultToolkit();Message messobj = null;String serverMessage = ""final JSlider blueSlider = new JSlider();final JSlider redSlider = new JSlider();final JSlider greenSlider = new JSlider();final JLabel hanziLabel = new JLabel();/ 构造方法public ChatR
41、oom(String name, String ip) / Dialog d = new FontDialog();strServerIp = ip;strLoginName = name;frmChat = new JFrame("聊天室" + "用户:" + name + "");pnlChat = new JPanel();frmChat.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frmChat.getContentPane().add(pnlChat);Font fntDis
42、p1 = new Font("宋体", Font.PLAIN, 12);String list = "所有人" ;btnCls = new JButton("清屏(C)");btnExit = new JButton("退出(X)");btnSend = new JButton("发送(N)");btnSave = new JButton("保存(S)");btnTimer = new JButton("时钟(T)");lblUserList = new
43、JLabel("【在线用户列表】");lblUserMessage = new JLabel("【聊天信息】");lblSendMessage = new JLabel("聊天内容:");lblChatUser = new JLabel("你对:");lblUserTotal = new JLabel("在线人数:");lblCount = new JLabel("0");lstUserList = new java.awt.List();txtMessage = new J
44、TextField(170);cmbUser = new JComboBox(list);/ chenmincmbUser.addItemListener(new ItemListener() public void itemStateChanged(ItemEvent arg0) freshHead(););chPrivateChat = new JCheckBox("私聊");taUserMessage = new TextArea("", 300, 200,TextArea.SCROLLBARS_VERTICAL_ONLY);/ 只能向下滚动/ t
45、aUserMessage.setText("aaaaaa汉字aaaa");taUserMessage.setForeground(new Color(0, 0, 0);taUserMessage.setEditable(false); / 不可写入/ /监听按钮响应public void actionPerformed(ActionEvent ae) Object source = (Object) ae.getSource();if (source.equals(btnTimer) new Clock();if (source.equals(btnCls) clearMe
46、ssage();if (source.equals(btnExit) exit();if (source.equals(btnSend) sendMessage();if (source.equals(btnSave) saveMessage();if (source.equals(lstUserList) / 双击列表框 changeUser(); / actionPerformed()结束, 监听窗口关闭响应class Windowclose extends WindowAdapter public void windowClosing(WindowEvent e) exit();/ &q
47、uot;清屏"按钮public void clearMessage() taUserMessage.setText("");/ "退出"按钮public void exit() Exit exit = new Exit();exit.exitname = strLoginName;/ 发送退出信息try Socket toServer = new Socket(strServerIp, 8888);/ 向服务器发送信息ObjectOutputStream outObj = new ObjectOutputStream(toServer.getO
48、utputStream();outObj.writeObject(exit);outObj.close();toServer.close();frmChat.dispose();/ this.destroy(); catch (Exception e) / exit()结束 ,"发送"按钮public void sendMessage() Chat chatobj = new Chat();chatobj.chatUser = strLoginName;chatobj.chatMessage = txtMessage.getText();chatobj.chatToUser = String.valueOf(cmbUser.getSelectedItem();chatobj.whisper = chPrivateChat.isSelected() ? true : false;chatobj.emote = emote.getSelectedItem().toString();/ 向服务器发送信息try Socket toServer = new Socket(strServerIp, 8888);ObjectOutputStream outObj = new ObjectOutputStream(toServer.getOutputStream();out
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 护理课件曲线图:静脉血栓风险评估与预防
- 护理专业精神科护理与心理康复
- 湖北省鄂州市多校2025-2026学年高二下学期4月阶段检测历史试卷(含答案)
- 动物胶提胶浓缩工岗前岗位安全考核试卷含答案
- 工业炉及电炉机械装配工测试验证知识考核试卷含答案
- 可变电容器装校工岗前实操掌握考核试卷含答案
- 2026年新科教版高中高一历史下册第三单元辛亥革命历史功绩卷含答案
- 石油地震勘探工安全教育测试考核试卷含答案
- 2026年新科教版高中高二数学下册第一单元排列组合不相邻问题卷含答案
- 电光源外部件制造工岗前模拟考核试卷含答案
- 制造业安全生产培训课件
- 管理层财务知识核心框架
- 2025年版高中思想政治课程标准修订情况
- 流动人口管理服务
- 2025年房屋加固施工合同协议
- 2025重庆水务集团股份有限公司校园招聘16人笔试历年参考题库附带答案详解
- 2023年一级注册计量师计量专业案例分析考试真题及答案
- 万达装修施工方案设计
- 电网侧独立储能电站项目经济效益和社会效益分析报告
- 2025上半年软考系统架构设计师考试真题考及答案
- 2025年云南省社会科学院中国(昆明)南亚东南亚研究院招聘高层次人才笔试备考题库参考答案详解
评论
0/150
提交评论