基于UDP协议的聊天程序设计报告_第1页
基于UDP协议的聊天程序设计报告_第2页
基于UDP协议的聊天程序设计报告_第3页
基于UDP协议的聊天程序设计报告_第4页
基于UDP协议的聊天程序设计报告_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

编号 计算机网络课程设计计算机网络课程设计 题 目 基于 UDP 的聊天程序 系 别 计算机科学与工程学院 摘要 随着网络技术的发展及人们生活的需求 网络聊天已越来越受到人 们的青睐 网络聊天已经成为人们工作生活中传递信息 交流感情的重要 工具 给人们带来了很大的方便 本课题是开发一个基于 UDP 的局域网 聊天系统 运用软件工程的设计流程 综合运用数据库编程技术 Windows 程序设计技术 网络通讯技术 此网络聊天工具采用客户端 服务器 C S 模式 客户端采用 UDP 与服务器连接 客户端与客户端之间通过 UDP 互相通讯 服务器端具有服务器端口设置 此聊天工具能实现多人聊 天功能 适用于局域网使用的网络聊天工具 其操作简单 灵活性好 运 行也比较稳定 关键词关键词 网络通讯 客户端 服务器模型 用户数据报协议 套接字 0 一 需求分析一 需求分析 1 1 课程设计目的 开发一个专用于实现两台计算机之间即时通讯的 软件 以方便两台计算机之间信息的交流 在连接并通信时 尤其 是近程的即时通讯 彻底的脱离了远程的服务器 避免了和远程服务 器连接时过多的浪费网络资源 并且避免了服务器忙或与服务器无法 连接时 浪费过多时间用于和服务器建立连接 因此 这个软件是极 具适应性和实用性的即时通讯软件 本次课程设计的目的是学习基于 UDP 协议实现网络聊天程序 已达到学会面向无连接方式的程序设计 方法并理解网络编程中面向无连接的概念 1 2 课程设计的内容 用户数据报 UDP 是一个无连接协议 使 用这种协议时 并不需要在两台计算机之间建立固定的连接 也就是 说 通信双方没有服务器和客户机之分 它们之间进行的是对等通信 所以它的优势很明显 是现代通信不可或缺的一部分 所以 利用 它的优势设计一个可以聊天的软件 实现两台计算机间的即时通讯 1 3 课程设计要求 基于 UDP 协议实现的聊天和一对多的聊天 提 供友好的用户界面 便于用户进行操作 二二 UDPUDP 协议的理解 协议的理解 UDP 协议是英文 UserDatagramProtocol 的缩写 即用户数据报协议 主要用来支持那些需要在计算机之间传输数据的网络应用 包括网络视频 1 会议系统在内的众多的客户 服务器模式的网络应用都需要使用 UDP 协议 UDP 协议从问世至今已经被使用了很多年 虽然其最初的光彩已经被一些 类似协议所掩盖 但是即使是在今天 UDP 仍然不失为一项非常实用和可 行的网络传输层协议 UDP 协议直接位于 IP 网际协议 协议的顶层 UDP 协议的主要作用是将网络数据流量压缩成数据报的形式 一个典型的 数据报就是一个二进制数据的传输单位 每一个数据报的前 8 个字节用来 包含报头信息 剩余字节则用来包含具体的传输数据 UDP 协议使用端口 号为不同的应用保留其各自的数据传输通道 正是采用这一机制实现对同 一时刻内多项应用同时发送和接收数据的支持 数据发送一方 可以是客 户端或服务器端 将 UDP 数据报通过源端口发送出去 而数据接收一方则 通过目标端口接收数据 有的网络应用只能使用预先为其预留或注册的静 态端口 而另外一些网络应用则可以使用未被注册的动态端口 因为 UDP 报头使用两个字节存放端口号 所以端口号的有效范围是从 0 到 65535 一般来说 大于 49151 的端口号都代表动态端口 数据报的长度是指包括 报头和数据部分在内的总的字节数 因为报头的长度是固定的 所以该域 主要被用来计算可变长度的数据部分 又称为数据负载 数据报的最大长 度根据操作环境的不同而各异 从理论上说 包含报头在内的数据报的最 大长度为 65535 字节 不过 一些实际应用往往会限制数据报的大小 有 时会降低到 8192 字节 UDP 协议使用报头中的校验值来保证数据的安全 2 校验值首先在数据发送方通过特殊的算法计算得出 在传递到接收方之后 还需要再重新计算 如果某个数据报在传输过程中被第三方篡改或者由于 线路噪音等原因受到损坏 发送和接收方的校验计算值将不会相符 由此 UDP 协议可以检测是否出错 UDP 协议并不提供数据传送的保证机制 如 果在从发送方到接收方的传递过程中出现数据报的丢失 协议本身并不能 做出任何检测或提示 由于排除了信息可靠传递机制 将安全和排序等功 能移交给上层应用来完成 极大降低了执行时间 使速度得到了保证 三三 UDPUDP 协议特点协议特点 1 UDP 传送数据前并不与对方建立连接 即 UDP 是无连接的 在传输 数据前 发送方和接收方相互交换信息使双方同步 2 UDP 不对收到的数据进行排序 在 UDP 报文的首部中并没有关于数 据顺序的信息 如 TCP 所采用的序号 而且报文不一定按顺序到达的 所以接收端无从排起 3 UDP 对接收到的数据报不发送确认信号 发送端不知道数据是否被正 确接收 也不会重发数据 4 UDP 传送数据较 TCP 快速 系统开销也少 5 由于缺乏拥塞控制 congestion control 需要基于网络的机制来减小 因失控和高速 UDP 流量负荷而导致的拥塞崩溃效应 换句话说 因为 UDP 发送者不能够检测拥塞 所以像使用包队列和丢弃技术的路由器这样 3 的网络基本设备往往就成为降低 UDP 过大通信量的有效工具 数据报拥塞 控制协议 DCCP 设计成通过在诸如流媒体类型的高速率 UDP 流中增加主 机拥塞控制来减小这个潜在的问题 从以上特点可知 UDP 提供的是无 连接的 不可靠的数据传送方式 是一种尽力而为的数据交付服务 四四 基于基于 C SC S 的多客服端相互通信原理分析 的多客服端相互通信原理分析 在 C S 模式中 它是在分散式 集中式 以及分布式基础上发展起来 的一种新模型 目前大多数网络通信以及应用都属于这种模型 C S 模式 将一个网络事务分为两部分 一部分是客户端 Client 他为用户提供网络 请求服务的接口 另一部分是服务端 Server 它负责接受用户对服务的 请求 并将这些服务透明的提供给用户 既适用于实际应用的程序 又实 用于真正的计算装置 举例来说 我们到饭店吃饭时 要首先提出请求吃 什么 属于客户端 饭店服务员根据请求提供相应的服务 属于服务端 至于相应的饭菜是由哪一个厨师来做 则由饭店的服务员去联系 而客户 端只需要和服务器打交道就行了 从程序实现上来说 客户端和服务器打 交道实际上是两个进程打交道 服务端启动 server 进程 并等待客户端与 其联系 而客户端则启动客户进程和服务器打交道 当服务器进程处理完 一个客服进程请求的信息之后 由接着等待其他客户的请求 五 五 套接字编程原理分析 套接字编程原理分析 4 图 1 1 套接字编程原理图 注释 socket 使用前创建一个新的套接字 bind 将套接 字地址与所创建的套接字号联系起来 send 与 recv 数据的发 送与接收 closesocket 关闭套接字 5 六 概要设计 概要设计 服务器 客户机甲客户机乙客户机丙 图 2 1 整体框架设计图 服务器端主要实现的功能是启动一个监听的进程 开放自己的端口号为 7777 不断的监听是否有新的客服端进程向自己发送连接请求 为每一个 主动连接自己的客户端设置一个 ID 号设置一个 threads 的容器用来管理客 户端的线程 与客户端建立连接 实现 socket 通信 对于服务器端是先接 受数据流然后再发送数据流 客服端发送过来的信息经服务器端然后转发 到其他所有的客户端 服务器端相当于中间的桥梁 客户端要求主要实现的功能是建立一个图形的界面 用于显示聊天信息 等 并且建立与服务器端的通信 主动的向服务器端发送连接请求 然后 6 对输入文本框注册事件监听并且发送给客服端 不断的监听服务器端发来 的信息 然后显示出来 七 详细设计七 详细设计 服务器端 服务器端 7 创建服务端接口 建立一个 seversocket 的类 svsocket 创建一个容器用来管理客户端进程 开始监听 监听是否有客户端连 接 有的话与其建立连接 分配 ID 监听线程 监听端口是否有消息传入 如果有的话接收信息 再将信息发送到其他的所有的客服端 当某客户离开 结束他与其他人的通信 为客户端连接创建线程 从容器 vector 中删除该线程 表示该线程已经离开聊天室 结束两者之间连接 图 7 1 服务器端整体设计流程图 客户端建立一个 seversocket 的类 并且创建一个 vector 用来管理客 8 户端的线程 然后就开始检测 如果有客户端请求与服务器连接就与其建 立 socket 连接 创建进程设置 ID 告诉其他的客户端有新的客户端接入 然后开始监听所有的客户端线程如果有信息通过端口进入就接受然后再发 送给其他客户端 如果有客户端退出 就会告诉其他的客户端并且关闭与 该客户端的 socket 连接 然后在 vector 里面删除相应的线程 主界面 服务器界面 当运行服务器端则出现 运行客服端登录 9 10 11 心得体会心得体会 经过两个星期的学习和实践 我也算是顺利的完成了计算机网络课程 设计 同时对计算机网络有一个大致的了解 在实践过程中遇到了很多的 困难 感觉自己很难将理论与实践相结合 觉得我们学习的那些知识也派 不上用场 通过这次课设 我深刻的认识到实践与理论必须 要想结合才能 使所学的知识变成可用的 通过自己的努力和老师同学们的帮助 多了一 种看待问题的角度 我也发现了我所学知识不扎实 只是走马观花的应付 考试 在以后的学习中需要时刻的告诫自己 踏踏实实做好每一步 本次课程设计是利用 java 语言编写的 虽说自己以前接触过这种语言 12 但是经过这两周的学习 我受益匪浅 首先 我进一步弄懂了 JAVA 语言 的编程方法和原则 并学会了编写 java 程序 其次 使我更深层次的理解 到 JAVA 语言是一种面向对象的语言 具有可视化编程的特点且代码具有 可移植等特点 本次课程设计是实现一个 UDP 即时通讯程序 经过编写程 序和运行 调试程序 我对 java 语言有了更深的了解 另外 使我对 UDP 协议的特点和工作过程有了更深的了解 UDP 协议提供无连接的 不可靠 的服务 它工作于传输层 是传输层的重要协议之一 最后 UDP 协议是 利用客户端和服务器端模型来实现传输的 本次课程设计使我明白了知识 的重要性 同时也更加懂得实践更不可少 我们要经常把所学的知识运用 到实践 这样 才能充分的融会贯通 同时 也使我认识到自己动手能力 太差 为我以后的学习和发展提供了一个警钟 本次课程设计的过程中 虽然遇到了不少问题 但最后还是成功的完成了 这次课设对于我而言是有很大的收获 懂得独立寻找资料学习 这是最 大的收获 在以后的工作中肯定会面临不懂得问题 有了这次课设的经验 就能够去独立学习并解决困难 主要代码 package server import java awt Container import java awt event ActionEvent import java awt event ActionListener 13 import java awt event WindowAdapter import java awt event WindowEvent import java io DataInputStream import java io DataOutputStream import java io IOException import java io ObjectInputStream import java io ObjectOutputStream import ServerSocket import Socket import java util ArrayList import java util Date import javax swing JButton import javax swing JFrame import javax swing JLabel import javax swing JOptionPane import javax swing JScrollBar import javax swing JScrollPane import javax swing JTextArea import javax swing JTextField public class server extends JFrame private JTextArea allmsg private JTextField currnum totalnum copyright chatmsg private JButton send private JScrollPane js int num1 num2 port num1 当前在线人数 num2 总上线人数 port 服 务端口号 private ServerSocket ss ArrayList lists 存放所有在线用户 public server super 聊天室服务器端 this setSize 310 660 this setLocation 200 50 14 lists new ArrayList num1 num2 0 port 7777 currnum new JTextField 当前在线人数 num1 currnum setEnabled false totalnum new JTextField 上线总人数 num2 totalnum setEnabled false allmsg new JTextArea allmsg append 系统消息 n allmsg setEditable false allmsg setLineWrap true 允许自动换行 js new JScrollPane allmsg 为JTextArea添加滚动条 chatmsg new JTextField 在此输入系统信息 chatmsg addActionListener new ActionListener public void actionPerformed ActionEvent arg0 String str chatmsg getText trim if equals str sendmsg new Date toLocaleString 系统消息 str chatmsg setText else JOptionPane showMessageDialog null 消息不能为空 错误 JOptionPane OK OPTION chatmsg setText 发送信息后 将输入栏中的信息清空 15 send new JButton 发送 send addActionListener new ActionListener public void actionPerformed ActionEvent arg0 String str chatmsg getText trim if equals str sendmsg new Date toLocaleString 系统消息 str chatmsg setText else JOptionPane showMessageDialog null 消息不能为空 错误 JOptionPane OK OPTION chatmsg setText 发送信息后 将输入栏中的信息清空 addcomponettocontainer this addWindowListener new WindowAdapter public void windowClosing WindowEvent we sendmsg SYSTEM CLOSED 向客户端发送服务器关闭信息 destory start 启动连接服务 public void addcomponettocontainer Container c this getContentPane c setLayout null currnum setBounds 20 15 130 20 totalnum setBounds 155 15 125 20 js setBounds 10 50 280 500 chatmsg setBounds 10 560 180 30 send setBounds 220 560 70 30 copyright setBounds 10 600 280 20 16 c add currnum c add totalnum c add js c add chatmsg c add send c add copyright this setVisible true this setResizable false public void start boolean isStarted false 用于标记服务器是否已经正常启动 try this ss new ServerSocket port isStarted true this allmsg append new Date toLocaleString 服务器启动 端口 port n while isStarted Socket client this ss accept 监听客户端的连接 DataInputStream in new DataInputStream client getInputStream String name in readUTF user u new user u name name u socket client lists add u 将该用户加到列表中去 num1 num2 currnum setText 当前在线人数 num1 totalnum setText 上线总人数 num2 this allmsg append new Date toLocaleString u name 登录 n new Thread new ClientThread u start 为该用户启动一个通 信线程 catch IOException e 17 System out println 服务器已经启动 System exit 0 class ClientThread implements Runnable user user null boolean isConnected true DataInputStream dis null DataOutputStream dos null public ClientThread user u this user u try this dis new DataInputStream this user socket getInputStream this dos new DataOutputStream this user socket getOutputStream catch IOException e TODO Auto generated catch block e printStackTrace public void run readmsg 读取客户的聊天信息 public void readmsg while isConnected try String msg dis readUTF if quit try this dis close this dos close this user socket close this isConnected false catch IOException ioe ioe printStackTrace finally this isConnected false if dis null this dis close if dos null this dos close if this user socket null this user socket close lists remove this user 从列表中删除该用户 currnum setText 当前在线人数 num1 allmsg append new Date toLocaleString this user name 退出 n else sendmsg msg catch IOException e e printStackTrace 将信息进行转发 public void sendmsg String msg user us new user DataOutputStream os null if lists size 0 19 for int i 0 i lists size i us user lists get i try os new DataOutputStream us socket getOutputStream os writeUTF msg catch IOException e e printStackTrace else JOptionPane showMessageDialog null 当前无用户在线 发送消息失败 失败 JOptionPane OK OPTION public void destory try this ss close catch IOException e TODO Auto generated catch block e printStackTrace this dispose public static void main String args new server package client import java awt 20 import javax swing import java awt event import java io import public class client extends JFrame private JTextField name private JTextField ip private JButton ok cancle public Socket socket public client super 登录框 this setSize 400 80 this setLocation 100 100 name new JTextField 昵称 ip new JTextField 127 0 0 1 ok new JButton 登录 cancle new JButton 取消 ok addActionListener new listenEvent cancle addActionListener new listenEvent addcomponettocontainer this setDefaultCloseOperation EXIT ON CLOSE public void addcomponettocontainer Container c this getContentPane c setLayout null name setBounds 10 10 100 30 ip setBounds 120 10 100 30 ok setBounds 230 10 70 30 cancle setBounds 310 10 70 30 21 c add name c add ip c add ok c add cancle this setVisible true this setResizable false public class listenEvent implements ActionListener public void actionPerformed ActionEvent event TODO Auto generated method stub if event getSource ok String n name getText trim String i ip getText trim if equals n equals i JOptionPane showMessageDialog null 昵称 IP不能够为空 错误 JOptionPane OK OPTION else login n i if event getSource cancle name setText ip setText public void login String name String ip try 22 socket new Socket ip 7777 DataOutputStream out new DataOutputStream socket getOutputStream out writeUTF name out flush 强制输出缓存中的内容 out close new ClientFrame name socket destroywindow catch UnknownHostException e JOptionPane showMessageDialog null 找不到主机地址 IP错误 网络故障 错误 JOptionPane OK OPTION catch IOException e public void destroywindow this dispose public static void main String args new client package server import public class user String name Socket socket 23 package client import java awt Color import java awt Container import java awt event ActionEvent import java awt event ActionListener import java awt event WindowAdapter import java awt event WindowEvent import java io DataInputStream import java io DataOutputStream import java io IOException import Socket import java util Date import javax swing JButton import javax swing JFrame import javax swing JOptionPane import javax swing JScrollPane import javax swing JTextArea import javax swing JTextField public class ClientFrame extends JFrame private JTextArea allmsg private JTextField welcome copyright chatmsg private JButton send private JScrollPane js private boolean isConnected true public DataOutputStream out public DataInputStream in public Socket s null String nic 保存用户昵称 24 初始化客户端资源 1 获取从LoginFrame传递过来的参数 2 初始化界面元素 3 初始化通信所需要的资源 EG 输入 输出流 DataInputStream DataOutputStream public ClientFrame String name Socket socket this setSize 310 660 this setLocation 290 50 this setTitle 聊天室客户端 指定窗口的标题 this s socket 接收从LoginFrame中传递过来的Socket this nic name 说 welcome new JTextField 欢迎您来到聊天室 100 welcome setBackground Color blue welcome setEnabled false copyright new JTextField all copyright TOP king copyright setEnabled false allmsg new JTextArea allmsg setEditable false allmsg append 系统消息 欢迎登录在线聊天室 n js new JScrollPane allmsg 为JTextArea添加滚动条 chatmsg new JTextField 在此输入聊天信息 chatmsg addActionListener new listen send new JButton 发送 send addActionListener new listen 添加事件监听器 try 25 out new DataOutputStream s getOutputStream in new DataInputStream s getInputStream catch IOException e JOptionPane showMessageDialog null 系 统异常 错误 JOptionPane OK CANCEL OPTION addcomponettocontainer 当用户关闭窗口时进行相关的处理 eg Socket Data Input Output Stream 的关闭 this addWindowListener new WindowAdapter public void windowClosing WindowEvent we sendmsg quit 向服务器端发送关闭信息 isConnected false destory 销毁窗口资源 new Thread new linread start 启动读取信息线程 public void addcomponettocontainer C

温馨提示

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

评论

0/150

提交评论