`
kaixuan0381
  • 浏览: 5083 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

基于UDP的DatagramPacket与DatagramSocket

阅读更多
1.基本概念:
  a.DatagramPacket与DatagramSocket位于java.net包中
  b.DatagramPacket表示存放数据的数据报,DatagramSocket表示接受或发送数据报的套接字
  c.由这两个类所有构成的网络链接是基于UDP协议,是一种不可靠的协议。
  之所以不可靠是因为发送方不负责数据是否发送成功,接收方收到数据时也不会   向发送方反馈成功消息,容易导致信息的丢失。
  但是这种协议却是快捷的,比如CS(半条命)游戏就是基于UDP协议,否则我们估计   要玩一次游戏后就会把机子砸了,所以我们可以看到游戏有时会失帧。
  2.使用方法:
  要建立基于UDP协议的链接,我们应该先建立套接字<DatagramSocket>(即发送站或接收站),之后通过套接字发送或接受数据<DatagramPacket>。
  我们先了解一下DatagramSocket和DatagramPacket类
  DatagramSocket类:
  构造方法:
  DatagramSocket():
  表示创建一个默认的套接字,并绑定到本地地址和一个随机的端口号
  DatagramSocket(int port):
  与上面不同的是,绑定到特定端口号,其它不变
  DatagramSocket(int port, InetAddress iad):
  表示创建一个套接字,绑定到特定的端口号及指定地址
  DatagramSocket(SocketAddress sad);
  表示创建一个套接字,绑定到特定的套接字地址
  小提示:所谓的本地地址我们可以这样来理解,我们通过“控制面板-本地连接-支持”中可以看到一个IP地址,这就是本地的IP地址,也暂且理解为本地地址。
  基本方法:
  close():
  关闭套接字
  recevie(DatagramPacket dp):
  接受数据报
  send(DatagramPacket dp):
 发送数据报
  这里触及了数据报,下面介绍数据报:
  DatagramPacket类:
  构造方法:(只列出主要的)
  接受类型:
  DatagramPacket(byte[] buf, int length):
  用来接受长度为length的buf数据(即数据存于字节数组buf中)
  发送类型:
  DatagramPacket(byte[] buf, int length, InetAddress address, int port);
  将length长的buf数据发送到指定的地址的端口号处
  DatagramPacket(byte[] buf, int length, SocketAddress address);
   将length长的buf数据发送到指定的套接字地址处
  有上面可知,我们发送数据时构造的数据报应该是发送类型的,而接受数据报时应该是接受类型的    
  开始书写代码
  代码意图:
  1.一个接收方,一个发送方
  2.当接收方收到发送方发送的消息后,打印发送的消息及发送方的地址和端口号,之后向发送反馈一条信息“接受方:我收到了!”
  3.发送方打印出接收方反馈的消息
  详细思路见代码:
[java] view plaincopyprint?
import java.net.DatagramPacket; 
import java.net.DatagramSocket; 
import java.net.InetAddress; 
 
public class Sender { 
    public static void main(String[] args) { 
        try { 
            // 创建发送方的套接字,IP默认为本地,端口号随机 
            DatagramSocket sendSocket = new DatagramSocket(); 
 
            // 确定要发送的消息: 
            String mes = "你好!接收方!"; 
 
            // 由于数据报的数据是以字符数组传的形式存储的,所以传转数据 
            byte[] buf = mes.getBytes(); 
 
            // 确定发送方的IP地址及端口号,地址为本地机器地址 
            int port = 8888; 
            InetAddress ip = InetAddress.getLocalHost(); 
 
            // 创建发送类型的数据报: 
            DatagramPacket sendPacket = new DatagramPacket(buf, buf.length, ip, 
                    port); 
 
            // 通过套接字发送数据: 
            sendSocket.send(sendPacket); 
 
            // 确定接受反馈数据的缓冲存储器,即存储数据的字节数组 
            byte[] getBuf = new byte[1024]; 
 
            // 创建接受类型的数据报 
            DatagramPacket getPacket = new DatagramPacket(getBuf, getBuf.length); 
 
            // 通过套接字接受数据 
            sendSocket.receive(getPacket); 
 
            // 解析反馈的消息,并打印 
            String backMes = new String(getBuf, 0, getPacket.getLength()); 
            System.out.println("接受方返回的消息:" + backMes); 
 
            // 关闭套接字 
            sendSocket.close(); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
 
    } 

 
 
 
import java.net.DatagramPacket; 
import java.net.DatagramSocket; 
import java.net.InetAddress; 
import java.net.SocketAddress; 
 
public class Receive { 
    public static void main(String[] args) { 
        try { 
            // 确定接受方的IP和端口号,IP地址为本地机器地址 
            InetAddress ip = InetAddress.getLocalHost(); 
            int port = 8888; 
 
            // 创建接收方的套接字,并制定端口号和IP地址 
            DatagramSocket getSocket = new DatagramSocket(port, ip); 
 
            // 确定数据报接受的数据的数组大小 
            byte[] buf = new byte[1024]; 
 
            // 创建接受类型的数据报,数据将存储在buf中 
            DatagramPacket getPacket = new DatagramPacket(buf, buf.length); 
 
            // 通过套接字接收数据 
            getSocket.receive(getPacket); 
 
            // 解析发送方传递的消息,并打印 
            String getMes = new String(buf, 0, getPacket.getLength()); 
            System.out.println("对方发送的消息:" + getMes); 
 
            // 通过数据报得到发送方的IP和端口号,并打印 
            InetAddress sendIP = getPacket.getAddress(); 
            int sendPort = getPacket.getPort(); 
            System.out.println("对方的IP地址是:" + sendIP.getHostAddress()); 
            System.out.println("对方的端口号是:" + sendPort); 
 
            // 通过数据报得到发送方的套接字地址 
            SocketAddress sendAddress = getPacket.getSocketAddress(); 
 
            // 确定要反馈发送方的消息内容,并转换为字节数组 
            String feedback = "接收方说:我收到了!"; 
            byte[] backBuf = feedback.getBytes(); 
 
            // 创建发送类型的数据报 
            DatagramPacket sendPacket = new DatagramPacket(backBuf, 
                    backBuf.length, sendAddress); 
 
            // 通过套接字发送数据 
            getSocket.send(sendPacket); 
 
            // 关闭套接字 
            getSocket.close(); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
    } 


测试已通过
  先启动接收方,然后启动发送方即可
分享到:
评论

相关推荐

    网路编程-UDP-DatagramSocket、DatagramPacket

    本篇将详细探讨UDP编程中的关键组件——`DatagramSocket`和`DatagramPacket`,以及如何利用它们进行数据的发送和接收。 `DatagramSocket`是Java提供的一个类,它代表了UDP通信中的一个端点。通过这个类,我们可以...

    基于UDP协议的Socket编程

    基于UDP协议的Socket编程主要涉及两个关键类:`DatagramPacket`和`DatagramSocket`,这两个类都位于Java的`java.net`包中。 `DatagramPacket`类是UDP通信的核心,它负责封装和解析实际传输的数据。当需要发送数据时...

    基于UDP的手机与电脑互相通信实例

    本文将深入探讨基于UDP(User Datagram Protocol)的手机与电脑之间的通信实例。UDP是一种无连接的传输层协议,它提供了快速的数据传输服务,但不保证数据的可靠性和顺序。这使得UDP在实时应用如在线游戏、视频流...

    编程实现基于UDP的PING (Java)

    通常,PING基于ICMP(Internet Control Message Protocol)协议,但在这个特定的课程设计中,我们将关注如何使用UDP(User Datagram Protocol)来实现类似的机制。下面将详细解释基于UDP的PING实现以及相关的Java...

    基于UDP的网络编程-1

    对于UDP,主要有两个关键类:DatagramSocket和DatagramPacket。 3. DatagramSocket类: DatagramSocket是发送和接收UDP数据报的类。通过创建DatagramSocket实例,我们可以绑定到特定的IP地址和端口号,然后使用...

    基于UDP的简单聊天室

    在Java中,实现UDP通信主要涉及两个类:`java.net.DatagramSocket`和`java.net.DatagramPacket`。`DatagramSocket`类代表一个UDP套接字,用于发送和接收数据报文。`DatagramPacket`则封装了要发送的数据和目标地址...

    基于UDP通信的聊天程序

    【标题】:“基于UDP通信的聊天程序” 【描述】:“基于UDP通信的聊天设计,设有注册和登陆。附有代码(全)” 【标签】:“UDP 计算机网络” 【正文】: UDP(User Datagram Protocol)是一种无连接的、不可靠...

    udp_Ping_JAVAping_javaudpping_java_基于UDP的PING_udp_Ping_

    UDP(User Datagram Protocol)是一种无...在给定的项目“udp_Ping_JAVAping_javaudpping_java_基于UDP的PING_udp_Ping”中,你可以找到实现这些功能的具体代码,进一步学习和理解Java如何操作UDP套接字进行数据通信。

    基于UDP的网络编程2

    在IT行业中,网络编程是构建分布式系统和网络应用的基础,而UDP(User Datagram Protocol)作为传输层协议之...在Java环境中,利用`DatagramSocket`和`DatagramPacket`类,我们可以轻松地创建UDP通信的客户端和服务端。

    基于UDP和TCP协议的Socket(网络编程/套接字)案例

    对于UDP,我们使用`DatagramSocket`来创建一个数据报Socket,通过`send(DatagramPacket)`发送数据,`receive(DatagramPacket)`接收数据。每个UDP数据报包含完整的源和目的地址信息,因此无需像TCP那样建立连接。 在...

    基于UDP协议的聊天程序

    此外,开发这样的聊天程序还需要熟悉Java的Socket编程,包括DatagramSocket类用于创建UDP套接字,以及DatagramPacket类用于封装和解封装数据报。开发者还需要具备良好的错误处理和异常处理能力,以应对网络波动、...

    java基于UDP协议的可靠通讯系统的设计与实现程序源码.rar

    Java基于UDP协议的可靠通信系统设计与实现是一个关键的网络编程课题,主要涉及到网络通信的基础原理、UDP协议的特性和如何克服其不可靠性。在这个项目中,源码分为"Client"和"Server"两个部分,分别代表客户端和...

    java基于UDP协议的聊天程序(可运行).zip

    Java基于UDP协议的聊天程序是一种实现网络通信的应用实例,它利用了UDP(User Datagram Protocol,用户数据报协议)这一无连接、不可靠的传输协议。UDP的特点在于其速度较快,因为不需要建立和维护连接,适合实时性...

    UDP通信方式实现.docx

    在上述文件中,还提供了一个完整的 UDP 单播服务器端代码实现,使用 DatagramSocket 和 DatagramPacket 两个类,实现基于 UDP 的用户登陆信息接收。 UDP 协议是一种无连接的、不可靠的、无序的通信协议,广泛应用于...

    java基于UDP协议的聊天程序(完整版).rar.rar

    在Java中,我们可以通过Java的Socket编程API来实现UDP通信,主要涉及两个类:`DatagramSocket`和`DatagramPacket`。`DatagramSocket`用于创建一个UDP套接字,它允许发送和接收数据报。`DatagramPacket`则用于封装要...

    基于 UDP 通信机制的航班显示系统(包 括服务器和客户端)的应用软件

    《基于UDP通信机制的航班显示系统应用软件详解》 在当今信息化时代,机场航班显示系统是旅客获取航班信息的重要途径,高效、稳定的通信机制对于确保系统正常运行至关重要。本项目中,我们采用UDP(User Datagram ...

    基于UDP网络通信系统的服务端程序设计课程设计

    * Java语言提供了多种方式来实现UDP编程,例如使用DatagramSocket类和DatagramPacket类来发送和接收数据报文。 * 在Java语言中,UDP编程可以使用以下步骤:创建 DatagramSocket 对象、设置服务器端口、发送数据报文...

    java聊天程序 基于udp协议

    Java聊天程序基于UDP协议,这是一种使用用户数据报协议(User Datagram Protocol)来实现网络通信的简单聊天工具。UDP是传输层的一种无连接协议,与TCP相比,它更注重速度和效率,而对数据的可靠传输则相对较少保障...

    android socket UDP 通信

    本程序“android socket UDP 通信”就是针对这种需求设计的,它实现了Android设备与服务器之间的UDP Socket通信,支持三次来回交互并能传递多条独立的数据。 首先,我们来理解UDP协议的基本概念。UDP是一种无连接的...

    基于udp的局域网聊天(代码,报告)

    2. **Java套接字编程**:在Java中,`java.net.DatagramSocket`类用于创建UDP套接字,`java.net.DatagramPacket`类用于封装数据和目标/源IP地址及端口号。开发时,需要创建发送和接收端的DatagramSocket,并通过...

Global site tag (gtag.js) - Google Analytics