您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 商业计划书 > UDP局域网聊天软件的设计与开发报告
UDP局域网聊天软件的设计与开发-1-一、设计思想本课程设计主要是基于UDP的并用Java实现的简单的聊天程序。UDP用户数据报是在运输层的端到端抽象的逻辑信道中传送的。UDP在传送数据之前不需要先建立连接。对方的运输层在收到UDP报文后,不需要给出任何确认。虽然UDP不提供可靠交付,但在某些情况下UDP是一种最有效的工作方式。虽然UDP用户数据报只能提供不可靠的交付,但UDP在某些方面有其特殊的优点,它有即时通信的功能。比如说,使用聊天程序聊天的时候,省去的了跟对方通信的时候的链接的麻烦,直接进行通信。UDP只在IP的数据报服务之上增加了很少一点的功能,即端口的功能和差错检测的功能。UDP使用尽最大努力交付,即不保证可靠交付,同时也不使用拥塞控制。UDP是面向报文的。UDP没有拥塞控制,很适合多媒体通信的要求。UDP支持一对一、一对多、多对一和多对多的交互通信。发送方UDP对应用程序交下来的报文,在添加首部后就向下交付IP层。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。接收方UDP对IP层交上来的UDP用户数据报,在去除首部后就原封不动地交付上层的应用进程,一次交付一个完整的报文。Socket又称作套接字,它是使用标准Unix文件描述符(filedescriptor)和其它程序通讯的方式。使用send()和recv()让你更好的控制数据传输。在Java网络编程中,socket相当于应用程序的港口码头;在计算机网络中,套接字由ip地址和端口号组成,为进程之间通信提供地址。两个主机进行通信实际上就是两个主机中的应用进程互相通信,应用进程之间的通信又称为端到端的通信。为应用进程之间的通信提供运输服务的是运输层的运输协议,运输层需要有两种不同的运输协议,即面向连接的TCP和无连接的UDP。在Java中,用于实现基于UDP的聊天程序,使用两个重要的类(DatagramSocket类和DatagramPacket类)。DatagramSocket类表示用来发送和接收数据报包的套接字。数据报套接字是包投递服务的发送或接收点。每个在数据报套接字上发送或接收的包都是单独编址和路由的。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。在DatagramSocket上总是启用UDP广播发送。为了接收广播包,应该将DatagramSocket绑定到通配符地址。在某些实现中,将DatagramSocket绑定到一个更加具体的地址时广播包也可以被接收。DatagramPacket类表示数据报包。数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。不对包投递做出保证。服务程序工作在服务器的某个端口上,一旦启动服务,它将在这个端口上监听,等待客户程序发来请求,当有客户连接到该端口,accept()方法就返回一个Socket对象,可以用该对象获得一个输入输出流。服务器的套接字用服务器套接字类(ServerSocket)来建立。具体实现如下:(1)建立一个服务者,端口为5000。(2)服务者永远等待,一旦客户送来正确的请求,连接至该端口,accept()方法就返回一个Socket对象。(3)用返回的Socket对象创建数据输入流类的实例in。用返回的Socket对象创建数据输出流的实例out。以上实例in和out是服务者用于从客户接受输入信息和向客户程序发送信息所用。此外,还需要用方法readline()和println()读取或输出一行数据。(4)soc.close()关闭Socket。UDP局域网聊天软件的设计与开发-2-二、算法流程图本程序的核心算法流程图如下图所示:图1程序算法流程图三、源代码importjava.awt.AWTEvent;importjava.awt.Color;importjava.awt.Dimension;importjava.awt.Rectangle;importjava.awt.TextArea;importjava.awt.Toolkit;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.event.WindowEvent;importjava.io.IOException;importjava.net.DatagramPacket;importjava.net.DatagramSocket;importjava.net.InetAddress;importjava.net.SocketException;importjavax.swing.JButton;importjavax.swing.JCheckBox;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JOptionPane;importjavax.swing.JPanel;importjavax.swing.JTextField;用户1封装数据报解析数据报目的IP与主机IP比较接受消息用户2是否传输数据报丢弃发送数据报UDP局域网聊天软件的设计与开发-3-@SuppressWarnings(serial)publicclassUDPextendsJFrame{//创建主界面staticJPanelmainPane;//创建“发送信息”标签JLabelsendMSGLabel=newJLabel(发送信息:);//创建“输入对方ip地址”标签JLabelipAddressLabel=newJLabel();//创建“群聊”标签JLabelqunLabel=newJLabel(群聊);//创建发送文本框JTextFieldsendMSGText=newJTextField();//创建ip文本框JTextFieldipAddressText=newJTextField();//创建“发送”按钮JButtonsendMSGButton=newJButton(发送);//创建“群聊”选择框JCheckBoxqunCB=newJCheckBox();//创建聊天信息文本框staticTextAreaMSGText=newTextArea();//输入端口intIn=3001;//输出端口intOut=3000;//声明发送和接收数据包引用staticDatagramPacketsendDP,getDP;//声明发送和接收套接字引用staticDatagramSocketsendDS,getDS;//界面开关staticbooleanpackFrame=false;//群聊开关staticbooleanisQun=false;//程序主方法publicstaticvoidmain(String[]args){//创建UDP类实例UDPframe=newUDP();//判定主界面是否以创建if(packFrame){frame.pack();}else{frame.validate();}UDP局域网聊天软件的设计与开发-4-//放置窗体在屏幕中央DimensionscreenSize=Toolkit.getDefaultToolkit().getScreenSize();DimensionframeSize=frame.getSize();if(frameSize.heightscreenSize.height){frameSize.height=screenSize.height;}if(frameSize.widthscreenSize.width){frameSize.width=screenSize.width;}frame.setLocation((screenSize.width-frameSize.width)/2,(screenSize.height-frameSize.height)/2);frame.setVisible(true);//接受局域网消息while(true){try{//创建接受字符串Stringreceived=null;//创建接受数组byte[]array=newbyte[100];//创建接受数据包getDP=newDatagramPacket(array,array.length);//创建接受套接字getDS.receive(getDP);//判定消息是否为群发if(!getDP.getAddress().toString().equals(/+InetAddress.getLocalHost().getHostAddress().toString())){//如果为私聊,则显示以下消息MSGText.append(\n+getDP.getAddress().toString().substring(1)+说:);received=newString(getDP.getData(),0,getDP.getLength(),UTF-8);MSGText.append(received);}//捕获异常}catch(IOExceptionse){se.printStackTrace();}}}//重构构造方法UDP局域网聊天软件的设计与开发-5-publicUDP(){enableEvents(AWTEvent.WINDOW_EVENT_MASK);try{//构建主窗体mainPane=(JPanel)this.getContentPane();//设置主窗体的布局mainPane.setLayout(null);//设置主窗体的大小this.setSize(newDimension(363,500));//设置标题this.setTitle(基于UDP的局域网聊天室);//设置ip输入框的文字为“输入对方IP地址”ipAddressLabel.setText(输入对方IP地址:);//设置ip地址标签的位置ipAddressLabel.setBounds(newRectangle(12,20,109,23));//设置ip地址输入框的位置ipAddressText.setBounds(newRectangle(123,20,120,19));//设置群聊标签的位置qunLabel.setBounds(270,20,40,20);//设置群聊选择框的位置qunCB.setBounds(295,20,20,20);//为群聊选择框添加监听器qunCB.addActionListener(newActionListener(){//重写处理方法@OverridepublicvoidactionPerformed(ActionEvente){//将群聊选择框反选isQun=!isQun;//设置ip地址输入框为不可用ipAddressText.setEditable(!isQun);}});//设置聊天记录框的位置MSGText.setBounds(newRectangle(11,60,333,355));//设置聊天记录框为可用MSGText.setEditable(false);//设置聊天记录框背景色为白色MSGText.setBackground(Color.white);//设置发送消息标签的位置sendMSGLabel.setBounds(newRectangle(13,430,65,20));//设置发送文本框的位置sendMSGText.setBounds(newRectangle(80,430,190,20));//设置发送按钮的位置sendMSGButton.setBounds(newRectangle(280,430,65,20));UDP局域网聊天软件
本文标题:UDP局域网聊天软件的设计与开发报告
链接地址:https://www.777doc.com/doc-1904711 .html