基于CS的简单聊天程序211466宋余保

上传人:沈*** 文档编号:139742341 上传时间:2022-08-22 格式:DOC 页数:25 大小:733KB
收藏 版权申诉 举报 下载
基于CS的简单聊天程序211466宋余保_第1页
第1页 / 共25页
基于CS的简单聊天程序211466宋余保_第2页
第2页 / 共25页
基于CS的简单聊天程序211466宋余保_第3页
第3页 / 共25页
资源描述:

《基于CS的简单聊天程序211466宋余保》由会员分享,可在线阅读,更多相关《基于CS的简单聊天程序211466宋余保(25页珍藏版)》请在装配图网上搜索。

1、计算机网络课程设计任务书 学 院计算机与信息工程学院 专 业物联网工程课程名称计算机网络题 目基于C/S的简朴聊天程序完毕期限自6月9日至6月16日共1周内容及任务一、项目的目的 运用socket。实现客户与服务器间的信息互通。二、项目任务的重要内容和规定(1)一方面,设计一种登录程序。验证通过后才干进入聊天室。(2)顾客聊天室具有群发,私聊,输入昵称与端标语等基本设立。点击“连接”按钮实现与服务器的连接。点击“断开”按钮实现与服务器的断开连接。(3)服务器聊天室具有启动服务器,停止服务器,显示目前在线的顾客功能。点击“启动”按钮实现与服务器的连接。点击“停止”按钮实现与服务器的断开连接。(4

2、)当服务器与客户机连接成功后。可以互相接受和发送消息。当多种客户机启动时,服务器会创立子线程解决相应线程的消息。三、项目设计(研究)思路(1)设计环节:先画出聊天室的模型,布局。(2)设计要点:设计主类与子类,分别实现不同的功能(3)重要技术分析:需要掌握socket通信,swing和awt,io的简朴应用.(4)解决思路:先按照草稿图设计出聊天室布局。再写各个类的功能。简朴测试与修改代码。最后完善。四、具体成果形式和规定(见第三页)进度安排起止日期工作内容.6.1-.6.2绘出聊天室布局草稿图,查看资料.6.3-.6.7编写代码,初步实现各个类的功能,查看资料.6.8-.6.16查看资料,测

3、试与完善各个功能。主要参考资料1.Java2实用教程(第三版)编著者耿祥义张跃平清华大学出版社2.Java编程设计编著者刘海杰中国铁道出版社3.Java网络编程精解编著者孙卫琴电子工业出版社指引教师意见(签字): 年 月 日系(教研室)主任意见(签字): 年 月 日计算机网络课程设计阐明书学院名称: 计算机与信息工程学院 班级名称: 级物联网工程 学生姓名: 宋余保 学 号: 211466 题 目: 基于C/S的简朴聊天室 指引教师姓名: 赵欢欢 起止日期: .6.9-.6.15 一、 选题背景使用Socket实现网上聊天功能。顾客可以通过客户端连接到服务器端并进行网上聊天。聊天时可以启动多种

4、客户端。服务器端启动后,接受客户端发来的顾客名和密码验证信息。验证通过则以目前的聊天客户列表信息进行响应;此后接受客户端发来的聊天信息,转发给客户端指定的聊天客户(即私聊)或所有其她客户端;在客户断开连接后公示其退出聊天系统的信息。客户端启动后在GUI界面接受顾客输入的服务器端信息、账号和密码等验证客户的身份。验证通过则显示目前系统在线客户列表。客户可以与指定对象进行私聊,也可以向系统中所有在线客户发送信息。实现本程序需要理解网络基本知识,掌握C/S构造的工作特点,掌握数据构造、高档语言及网络编程知识,可以选择Visual C+、C或Java等语言实现。二、方案设计基于C/S的简朴聊天室可以实

5、现顾客与服务器间,服务器与多种顾客间的通信。聊天室程序一般需要完毕如下某些基本功能:(1)登录聊天室;(2)启动服务器;(3)关闭服务器;(4)顾客之间的聊天;(5)退出聊天室。本系统其体功能需求如下:(1)聊天室管理员经登录界面登录到管理界而,即系统的服务器端。顾客经登录界而都进入聊天大厅。(2)不管是管理员还是顾客都需一要在登录界面输入对的的顾客名和密码后才可以登录到各自的界面中去。(3)系统的两个重要界面都是为以便管理员和顾客操作的。一方面,管理员进入到管理界而后可以以便的启动/停止服务器,看到在线顾客的信息和聊人信息、。顾客进入到聊天大厅中可以聊天,查看服务器状态。(4) 一种顾客退出

6、聊天室对其她顾客不能产生影响,而服务器断开与客户端的连接则所有的顾客都失去与服务器的连接。(5)顾客的聊天信息录入,重写,发送,接受以便,快捷。(6)服务器状态,聊天信息和在线顾客人数及时刷新。(7)聊天室系统运营稳定、安全性高、三、具体设计服务器端(1)一方面实现的是服务器的GUI界面,如图3-1所示: 图3-1服务器GUI代码如下:/ 构造放法 public Server() frame = new JFrame(服务器); contentArea = new JTextArea(); contentArea.setEditable(false); contentArea.setForeg

7、round(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); sout

8、hPanel = 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(

9、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(端口

10、); 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(Toolk

11、it.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(

12、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; th

13、row new BindException(端标语已被占用,请换一种!); catch (Exception e1) e1.printStackTrace(); isStart = false; throw new BindException(启动服务器异常!); (3)再次是实现服务器与客户机连接机制,如果有客户机申请连接,则为此客户机创立线程,代码如下:/ 服务器线程 class ServerThread extends Thread private ServerSocket serverSocket; private int max;/ 人数上限 / 服务器线程的构造措施 public

14、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.getInput

15、Stream(); 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() + ,服务器在线人数已达上限,请稍后尝试连接

16、!); 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() +

17、 上线!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() +

18、下线!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

19、 = 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 messa

20、ge) 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) / 群发 f

21、or (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

22、= new JTextField(); txt_port = new JTextField(6666); txt_hostIp = new JTextField(127.0.0.1); 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 = ne

23、w 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.setBo

24、rder(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_

25、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.getResou

26、rce(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

27、().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 = ne

28、w 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.nextTok

29、en() != 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(usern

30、ame); 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 = stringT

31、okenizer.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(fra

32、me, 服务器缓冲区已满!, 错误, 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

33、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

34、 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(

35、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(bt

36、1); 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 );/文本框可以编辑

37、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(正在登陆!); /此时标签浮现。予

38、以提示 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.g

39、etText().equals(s1)&(!jpf.getText().equals(s2)/如果输入的文本不对的 lab.setText(顾客名或密码错误!); lab.setForeground(Color.red);/此时标签浮现。予以提示 lab.setVisible(true); (4)最后是给客户端界面添加了一种背景图片/* public void setBack()ImageIcon iicon=new ImageIcon(222.gif);JLabel lab_bg=new JLabel(iicon);add(lab_bg,-1);lab_bg.setSize(240, 180

40、);四、成果分析(或测试)(1)一方面启动服务器,如图4-1所示: 图4-1 服务器(2)另一方面登陆客户端,如图4-2所示: 图 4-2 登陆界面(3)验证通过之后会自动进入客户端聊天室,如图4-3所示: 图4-3 客户端界面(4)下面是对话部分,如图4-4所示: 图4-4 聊天界面五、结论(或总结)两周的课程设计结束了,我的收获很大。通过课程设计的编程和对编程过程中遇到的问题的思考,有效的提高了我对数据构造的结识和理解,切实的提高了我的编程能力,补全了我的局限性。通过这次课程设计,我巩固所了学过的知识,能用JAVA纯熟地运用其中的某些,进一步掌握了各个指令的功能是转向。课程设计是对我们所学

41、的这些东西一种综合的运用。在整个程序的编写中,调试占了很大部分的时间。要想写好程序,必须认真看待代码的每一种细节,还必须纯熟的掌握多种命令,这对程序的调试是非常重要的。通过这次实际动手能力的培养,我进一步熟悉了使用措施,基本达到了能独立阅读、编制和调试一定规模的水平。课程设计是对自己所学知识掌握限度最佳的检查,特别是对于某些细节问题。考试还并不能完全的阐明什么,由于考题都是某些单个的问题,大多只是知识的某一方面。而课程设计不同,我们要用到诸多的单个知识点,把她们综合起来运用到自己的课题当中。学了一种学期的数据构造,目前终于迎来了课程设计,固然是一种较好的锻炼自己的机会。在本次的课程设计也发现了

42、自己诸多的缺陷局限性之处,对于某些细节性的问题老出错,特别是一种标点的错误,很急人。对于有些知识掌握的不行,有的是模模糊糊的不牢固,虽然有的东西考试考过,但当它用到实际问题的时候,往往不懂得用哪,放哪。实践出真知。课程设计是个实践,虽然实际不长,但给我们对知识的运用,运用均有了较好的发挥。人多力量大这句话是真理啊,不懂得地方问同窗,不会的地方也问同窗,自己努力的同步跟别人共同进步,这就是合伙,学会合伙是我们后来必备的重要的一项人际技能。一种程序的完毕需要不断地修改才可以得到完善,人生正如那程序同样,只有不断地努力、奋斗、勇往直前,才可以完善自己,做最佳的自己。最后感谢同窗的协助,感谢教师的指引!六、参照文献1.Java2实用教程(第三版)编著者耿祥义张跃平清华大学出版社2.Java编程设计编著者刘海杰中国铁道出版社3.Java网络编程精解编著者孙卫琴电子工业出版社:3032.学生签名: 填表日期: 年 月 日

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!