




已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机网络课程设计任务书 学 院计算机与信息工程学院 专 业物联网工程课程名称计算机网络题 目基于C/S的简单聊天程序完成期限自2014年6月9日至2014年6月16日共1周内容及任务一、项目的目的 利用socket。实现客户与服务器间的信息互通。二、项目任务的主要内容和要求(1)首先,设计一个登录程序。验证通过后才能进入聊天室。(2)用户聊天室具有群发,私聊,输入昵称与端口号等基本设置。点击“连接”按钮实现与服务器的连接。点击“断开”按钮实现与服务器的断开连接。(3)服务器聊天室具有启动服务器,停止服务器,显示当前在线的用户功能。点击“启动”按钮实现与服务器的连接。点击“停止”按钮实现与服务器的断开连接。(4)当服务器与客户机连接成功后。能够互相接受和发送消息。当多个客户机启动时,服务器会创建子线程处理对应线程的消息。三、项目设计(研究)思路(1)设计步骤:先画出聊天室的模型,布局。(2)设计要点:设计主类与子类,分别实现不同的功能(3)主要技术分析:需要掌握socket通信,swing和awt,io的简单应用.(4)解决思路:先按照草稿图设计出聊天室布局。再写各个类的功能。简单测试与修改代码。最后完善。四、具体成果形式和要求(见第三页)进度安排起止日期工作内容2014.6.1-2014.6.2绘出聊天室布局草稿图,查看资料2014.6.3-2014.6.7编写代码,初步实现各个类的功能,查看资料2014.6.8-2014.6.16查看资料,测试与完善各个功能。主要参考资料1.Java2实用教程(第三版)编著者耿祥义张跃平清华大学出版社20062.Java编程设计编著者刘海杰中国铁道出版社20063.Java网络编程精解编著者孙卫琴电子工业出版社指导教师意见(签字): 年 月 日系(教研室)主任意见(签字): 年 月 日计算机网络课程设计说明书学院名称: 计算机与信息工程学院 班级名称: 2012级物联网工程 学生姓名: 宋余保 学 号: 2012211466 题 目: 基于C/S的简单聊天室 指导教师姓名: 赵欢欢 起止日期: 2014.6.9-2014.6.15 一、 选题背景使用Socket实现网上聊天功能。用户可以通过客户端连接到服务器端并进行网上聊天。聊天时可以启动多个客户端。服务器端启动后,接收客户端发来的用户名和密码验证信息。验证通过则以当前的聊天客户列表信息进行响应;此后接收客户端发来的聊天信息,转发给客户端指定的聊天客户(即私聊)或所有其他客户端;在客户断开连接后公告其退出聊天系统的信息。客户端启动后在GUI界面接收用户输入的服务器端信息、账号和密码等验证客户的身份。验证通过则显示当前系统在线客户列表。客户可以与指定对象进行私聊,也可以向系统中所有在线客户发送信息。实现本程序需要了解网络基础知识,掌握C/S结构的工作特点,掌握数据结构、高级语言及网络编程知识,可以选择Visual C+、C或Java等语言实现。二、方案设计基于C/S的简单聊天室可以实现用户与服务器间,服务器与多个用户间的通信。聊天室程序通常需要完成以下一些基本功能:(1)登录聊天室;(2)启动服务器;(3)关闭服务器;(4)用户之间的聊天;(5)退出聊天室。本系统其体功能需求如下:(1)聊天室管理员经登录界面登录到管理界而,即系统的服务器端。用户经登录界而都进入聊天大厅。(2)不论是管理员还是用户都需一要在登录界面输入正确的用户名和密码后才可以登录到各自的界面中去。(3)系统的两个主要界面都是为方便管理员和用户操作的。首先,管理员进入到管理界而后可以方便的启动/停止服务器,看到在线用户的信息和聊人信息、。用户进入到聊天大厅中可以聊天,查看服务器状态。(4) 一个用户退出聊天室对其他用户不能产生影响,而服务器断开与客户端的连接则所有的用户都失去与服务器的连接。(5)用户的聊天信息录入,重写,发送,接收方便,快捷。(6)服务器状态,聊天信息和在线用户人数及时刷新。(7)聊天室系统运行稳定、安全性高、三、详细设计服务器端(1)首先实现的是服务器的GUI界面,如图3-1所示: 图3-1服务器GUI代码如下:/ 构造放法 public Server() frame = new JFrame(服务器); contentArea = new JTextArea(); contentArea.setEditable(false); contentArea.setForeground(Color.blue); txt_message = new JTextField(); txt_max = new JTextField(30); txt_port = new JTextField(6666); btn_start = new JButton(启动); btn_stop = new JButton(停止); btn_send = new JButton(发送); btn_stop.setEnabled(false); listModel = new DefaultListModel(); userList = new JList(listModel); southPanel = new JPanel(new BorderLayout(); southPanel.setBorder(new TitledBorder(写消息); southPanel.add(txt_message, Center); southPanel.add(btn_send, East); leftPanel = new JScrollPane(userList); leftPanel.setBorder(new TitledBorder(在线用户); rightPanel = new JScrollPane(contentArea); rightPanel.setBorder(new TitledBorder(消息显示区); centerSplit = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftPanel, rightPanel); centerSplit.setDividerLocation(100); northPanel = new JPanel(); northPanel.setLayout(new GridLayout(1, 6); northPanel.add(new JLabel(人数上限); northPanel.add(txt_max); northPanel.add(new JLabel(端口); northPanel.add(txt_port); northPanel.add(btn_start); northPanel.add(btn_stop); northPanel.setBorder(new TitledBorder(配置信息); frame.setLayout(new BorderLayout(); frame.add(northPanel, North); frame.add(centerSplit, Center); frame.add(southPanel, South); frame.setSize(600, 400); /frame.setSize(Toolkit.getDefaultToolkit().getScreenSize();/设置全屏 int screen_width = Toolkit.getDefaultToolkit().getScreenSize().width; int screen_height = Toolkit.getDefaultToolkit().getScreenSize().height; frame.setLocation(screen_width - frame.getWidth() / 2, (screen_height - frame.getHeight() / 2); frame.setVisible(true); (2)其实实现服务器的启动代码如下/ 启动服务器 public void serverStart(int max, int port) throws .BindException try clients = new ArrayList(); serverSocket = new ServerSocket(port); serverThread = new ServerThread(serverSocket, max); serverThread.start(); isStart = true; catch (BindException e) isStart = false; throw new BindException(端口号已被占用,请换一个!); catch (Exception e1) e1.printStackTrace(); isStart = false; throw new BindException(启动服务器异常!); (3)再次是实现服务器与客户机连接机制,如果有客户机申请连接,则为此客户机创建线程,代码如下:/ 服务器线程 class ServerThread extends Thread private ServerSocket serverSocket; private int max;/ 人数上限 / 服务器线程的构造方法 public ServerThread(ServerSocket serverSocket, int max) this.serverSocket = serverSocket; this.max = max; public void run() while (true) / 不停的等待客户端的链接 try Socket socket = serverSocket.accept(); if (clients.size() = max) / 如果已达人数上限 BufferedReader r = new BufferedReader( new InputStreamReader(socket.getInputStream(); PrintWriter w = new PrintWriter(socket .getOutputStream(); / 接收客户端的基本用户信息 String inf = r.readLine(); StringTokenizer st = new StringTokenizer(inf, ); User user = new User(st.nextToken(), st.nextToken(); / 反馈连接成功信息 w.println(MAX服务器:对不起, + user.getName() + user.getIp() + ,服务器在线人数已达上限,请稍后尝试连接!); w.flush(); / 释放资源 r.close(); w.close(); socket.close(); continue; ClientThread client = new ClientThread(socket); client.start();/ 开启对此客户端服务的线程 clients.add(client); listModel.addElement(client.getUser().getName();/ 更新在线列表 contentArea.append(client.getUser().getName() + client.getUser().getIp() + 上线!rn); catch (IOException e) e.printStackTrace(); (4)再次是实现服务器的消息发送和接受的处理机制,代码如下:public void run() / 不断接收客户端的消息,进行处理。 String message = null; while (true) try message = reader.readLine();/ 接收客户端消息 if (message.equals(CLOSE)/ 下线命令 contentArea.append(this.getUser().getName() + this.getUser().getIp() + 下线!rn); / 断开连接释放资源 reader.close(); writer.close(); socket.close(); / 向所有在线用户发送该用户的下线命令 for (int i = clients.size() - 1; i = 0; i-) clients.get(i).getWriter().println( DELETE + user.getName(); clients.get(i).getWriter().flush(); listModel.removeElement(user.getName();/ 更新在线列表 / 删除此条客户端服务线程 for (int i = clients.size() - 1; i = 0; i-) if (clients.get(i).getUser() = user) ClientThread temp = clients.get(i); clients.remove(i);/ 删除此用户的服务线程 temp.stop();/ 停止这条服务线程 return; else dispatcherMessage(message);/ 转发消息 catch (IOException e) e.printStackTrace(); / 转发消息 public void dispatcherMessage(String message) StringTokenizer stringTokenizer = new StringTokenizer(message, ); String source = stringTokenizer.nextToken(); String owner = stringTokenizer.nextToken(); String content = stringTokenizer.nextToken(); message = source + 说: + content; contentArea.append(message + rn); if (owner.equals(ALL) / 群发 for (int i = clients.size() - 1; i = 0; i-) clients.get(i).getWriter().println(message + (多人发送); clients.get(i).getWriter().flush(); 客户端:(1)首先是实现客户端的GUI 界面,如图3-2所示: 图3-2 客户端GUI代码如下:public Client() textArea = new JTextArea(); textArea.setEditable(false); textArea.setForeground(Color.blue); textField = new JTextField(); txt_port = new JTextField(6666); txt_hostIp = new JTextField(); txt_name = new JTextField(xiaoqiang); btn_start = new JButton(连接); btn_stop = new JButton(断开); btn_send = new JButton(发送); listModel = new DefaultListModel(); userList = new JList(listModel); northPanel = new JPanel(); northPanel.setLayout(new GridLayout(1, 7); northPanel.add(new JLabel(端口); northPanel.add(txt_port); northPanel.add(new JLabel(服务器IP); northPanel.add(txt_hostIp); northPanel.add(new JLabel(姓名); northPanel.add(txt_name); northPanel.add(btn_start); northPanel.add(btn_stop); northPanel.setBorder(new TitledBorder(连接信息); rightScroll = new JScrollPane(textArea); rightScroll.setBorder(new TitledBorder(消息显示区); leftScroll = new JScrollPane(userList); leftScroll.setBorder(new TitledBorder(在线用户); southPanel = new JPanel(new BorderLayout(); southPanel.add(textField, Center); southPanel.add(btn_send, East); southPanel.setBorder(new TitledBorder(写消息); centerSplit = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftScroll, rightScroll); centerSplit.setDividerLocation(100); frame = new JFrame(客户机); / 更改JFrame的图标: / frame.setIconImage(Toolkit.getDefaultToolkit().createImage(Client.class.getResource(light.jpg); frame.setLayout(new BorderLayout(); frame.add(northPanel, North); frame.add(centerSplit, Center); frame.add(southPanel, South); frame.setSize(600, 400); int screen_width = Toolkit.getDefaultToolkit().getScreenSize().width; int screen_height = Toolkit.getDefaultToolkit().getScreenSize().height; frame.setLocation(screen_width - frame.getWidth() / 2, (screen_height - frame.getHeight() / 2); frame.setVisible(true); (2)其次是实现消息的接受和发送处理机制,代码如下:不断接受服务器发来的消息以及处理消息的内容:public void run() String message = ; while (true) try message = reader.readLine(); StringTokenizer stringTokenizer = new StringTokenizer( message, /); String command = stringTokenizer.nextToken();/ 命令 if (command.equals(CLOSE)/ 服务器已关闭命令 textArea.append(服务器已关闭!rn); closeCon();/ 被动的关闭连接 return;/ 结束线程 else if (command.equals(ADD) / 有用户上线更新在线列表 String username = ; String userIp = ; if (username = stringTokenizer.nextToken() != null & (userIp = stringTokenizer.nextToken() != null) User user = new User(username, userIp); onLineUsers.put(username, user); listModel.addElement(username); else if (command.equals(DELETE) / 有用户下线更新在线列表 String username = stringTokenizer.nextToken(); User user = (User) onLineUsers.get(username); onLineUsers.remove(user); listModel.removeElement(username); else if (command.equals(USERLIST) / 加载在线用户列表 int size = Integer .parseInt(stringTokenizer.nextToken(); String username = null; String userIp = null; for (int i = 0; i size; i+) username = stringTokenizer.nextToken(); userIp = stringTokenizer.nextToken(); User user = new User(username, userIp); onLineUsers.put(username, user); listModel.addElement(username); else if (command.equals(MAX) / 人数已达上限 textArea.append(stringTokenizer.nextToken() + stringTokenizer.nextToken() + rn); closeCon();/ 被动的关闭连接 JOptionPane.showMessageDialog(frame, 服务器缓冲区已满!, 错误, JOptionPane.ERROR_MESSAGE); return;/ 结束线程 else / 普通消息 textArea.append(message + rn); catch (IOException e) e.printStackTrace(); catch (Exception e) e.printStackTrace(); 发送:btn_send.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) send(); ); public void sendMessage(String message) writer.println(message); writer.flush(); (3)再次是实现客户端登陆界面的以及功能的实现,如图3-3所示: 图3-3 登录界面代码如下public class LaunchClient extends JFrame implements ActionListener private static final String args = null; String s1=chzu;/用户名 String s2=333;/密码 JPanel jp=new JPanel(); JTextField jtf=new JTextField(); JPasswordField jpf=new JPasswordField(); JLabel lab=new JLabel();/一个可以提示登陆成功或失败的标签lab JLabel lab1=new JLabel(用户名); JLabel lab2=new JLabel(密 码); JButton bt1=new JButton(登录); JButton bt2=new JButton(重置); public LaunchClient() super(用户登录); jp.setLayout(null); /* jp.setBackground(Color.pink);*/ lab.setBounds(80,10,200,20);/设置x,y轴坐标,长度,宽度 lab1.setBounds(20,30,60,25); lab2.setBounds(20,70,60,25); jtf.setBounds(80,30,120,20); jpf.setBounds(80,70,120,20); bt1.setBounds(80, 100, 60,25); bt2.setBounds(141,100, 60,25); jp.add(lab1); jp.add(jtf); jp.add(lab2); jp.add(jpf); jp.add(bt1); jp.add(bt2); jp.add(lab); add(jp); lab1.setForeground(Color.blue); lab2.setForeground(Color.blue); bt1.setForeground(Color.blue); bt2.setForeground(Color.blue); bt1.addActionListener(this);/注册监听器 bt2.addActionListener(this); lab.setVisible(false);/验证之前 此标签lab暂时隐藏 jtf.setEditable(true );/文本框可以编辑 jpf.setEditable(true ); jp.setOpaque(false); this.setSize(240, 160); this.setVisible(true); setBack();/添加背景 SuppressWarnings(deprecation)public void actionPerformed(ActionEvent e)if( jtf.getText().equals(s1)&(jpf.getText().equals(s2)/如果输入的用户名和密码都正确 if(e.getSource()=bt1) lab.setText(正在登陆!); /此时标签出现。给予提示 lab.setVisible(true);/如果点击登陆 try / 一段延时Thread.sleep(1000); catch (InterruptedException e1) / TODO 自动生成的 catch 块e1.printStackTrace(); this.dispose(); /自动销毁当前窗口 new Client(); /new一个Client()对象,启动Client程序. else if(e.getSource()=bt2)/如果点击重置按钮,将用户名和密码文本设为空 jtf.setText(); jpf.setText(); else if( !jtf.getText().equals(s1)&(!jpf.getText().equals(s2)/如果输入的文本不正确 lab.setText(用户名或密码错误!); lab.setForeground(Color.red);/此时标签出现。给予提示 lab.setVisible(true); (4)最后是给客户端界
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 榛树类种子创新创业项目商业计划书
- 水生植物环保监测设备创新创业项目商业计划书
- 油菜籽油美食指南创新创业项目商业计划书
- 建筑数据分析服务创新创业项目商业计划书
- 座椅按摩与健康监测一体化创新创业项目商业计划书
- 水果物流配送方案创新创业项目商业计划书
- 屠宰场废弃物资源化利用技术创新创业项目商业计划书
- 家庭关系调和创新创业项目商业计划书
- 2025年太原市二级造价师考试题库含完整答案(各地真题)
- 2025年监理工程师【管理+三控+法规+案例】考后真题及答案及解析
- 大象版(2024)小学科学一年级上册教学设计(附教材目录)
- 接收预备党员表决票(样式)
- 品牌合作协议书合同范本
- 中小学教育管理干部考核试题及答案
- 养老院预防老人食品药品误食
- 装配式建筑装饰装修技术 课件 模块二 装配式楼地面
- 地下室转让合同协议书
- 物理化学实验B智慧树知到期末考试答案章节答案2024年北京科技大学
- 基层医疗卫生机构访谈问卷
- (正式版)HGT 6270-2024 防雾涂料
- 美业市场培训课程课件
评论
0/150
提交评论