`
tanzhen-1988
  • 浏览: 52579 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java中的DatagramPacket与DatagramSocket的基础(转)

    博客分类:
  • java
阅读更多

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.发送方打印出接收方反馈的消息

 

  详细思路见代码:

 

 

  1. import java.net.DatagramPacket;  
  2. import java.net.DatagramSocket;  
  3. import java.net.InetAddress;  
  4.   
  5. public class Sender {  
  6.     public static void main(String[] args) {  
  7.         try {  
  8.             // 创建发送方的套接字,IP默认为本地,端口号随机  
  9.             DatagramSocket sendSocket = new DatagramSocket();  
  10.   
  11.             // 确定要发送的消息:  
  12.             String mes = "你好!接收方!";  
  13.   
  14.             // 由于数据报的数据是以字符数组传的形式存储的,所以传转数据  
  15.             byte[] buf = mes.getBytes();  
  16.   
  17.             // 确定发送方的IP地址及端口号,地址为本地机器地址  
  18.             int port = 8888;  
  19.             InetAddress ip = InetAddress.getLocalHost();  
  20.   
  21.             // 创建发送类型的数据报:  
  22.             DatagramPacket sendPacket = new DatagramPacket(buf, buf.length, ip,  
  23.                     port);  
  24.   
  25.             // 通过套接字发送数据:  
  26.             sendSocket.send(sendPacket);  
  27.   
  28.             // 确定接受反馈数据的缓冲存储器,即存储数据的字节数组  
  29.             byte[] getBuf = new byte[1024];  
  30.   
  31.             // 创建接受类型的数据报  
  32.             DatagramPacket getPacket = new DatagramPacket(getBuf, getBuf.length);  
  33.   
  34.             // 通过套接字接受数据  
  35.             sendSocket.receive(getPacket);  
  36.   
  37.             // 解析反馈的消息,并打印  
  38.             String backMes = new String(getBuf, 0, getPacket.getLength());  
  39.             System.out.println("接受方返回的消息:" + backMes);  
  40.   
  41.             // 关闭套接字  
  42.             sendSocket.close();  
  43.         } catch (Exception e) {  
  44.             e.printStackTrace();  
  45.         }  
  46.   
  47.     }  
  48. }  
  49.   
  50.   
  51.   
  52. import java.net.DatagramPacket;  
  53. import java.net.DatagramSocket;  
  54. import java.net.InetAddress;  
  55. import java.net.SocketAddress;  
  56.   
  57. public class Receive {  
  58.     public static void main(String[] args) {  
  59.         try {  
  60.             // 确定接受方的IP和端口号,IP地址为本地机器地址  
  61.             InetAddress ip = InetAddress.getLocalHost();  
  62.             int port = 8888;  
  63.   
  64.             // 创建接收方的套接字,并制定端口号和IP地址  
  65.             DatagramSocket getSocket = new DatagramSocket(port, ip);  
  66.   
  67.             // 确定数据报接受的数据的数组大小  
  68.             byte[] buf = new byte[1024];  
  69.   
  70.             // 创建接受类型的数据报,数据将存储在buf中  
  71.             DatagramPacket getPacket = new DatagramPacket(buf, buf.length);  
  72.   
  73.             // 通过套接字接收数据  
  74.             getSocket.receive(getPacket);  
  75.   
  76.             // 解析发送方传递的消息,并打印  
  77.             String getMes = new String(buf, 0, getPacket.getLength());  
  78.             System.out.println("对方发送的消息:" + getMes);  
  79.   
  80.             // 通过数据报得到发送方的IP和端口号,并打印  
  81.             InetAddress sendIP = getPacket.getAddress();  
  82.             int sendPort = getPacket.getPort();  
  83.             System.out.println("对方的IP地址是:" + sendIP.getHostAddress());  
  84.             System.out.println("对方的端口号是:" + sendPort);  
  85.   
  86.             // 通过数据报得到发送方的套接字地址  
  87.             SocketAddress sendAddress = getPacket.getSocketAddress();  
  88.   
  89.             // 确定要反馈发送方的消息内容,并转换为字节数组  
  90.             String feedback = "接收方说:我收到了!";  
  91.             byte[] backBuf = feedback.getBytes();  
  92.   
  93.             // 创建发送类型的数据报  
  94.             DatagramPacket sendPacket = new DatagramPacket(backBuf,  
  95.                     backBuf.length, sendAddress);  
  96.   
  97.             // 通过套接字发送数据  
  98.             getSocket.send(sendPacket);  
  99.   
  100.             // 关闭套接字  
  101.             getSocket.close();  
  102.         } catch (Exception e) {  
  103.             e.printStackTrace();  
  104.         }  
  105.     }  

  106. 转自:http://blog.csdn.net/pengchua/article/details/4398972
分享到:
评论

相关推荐

    网路编程-UDP-DatagramSocket、DatagramPacket

    在标签中提到的"源码"和"工具",暗示我们可以通过查看`DatagramSocket`和`DatagramPacket`的源码来理解其内部实现,同时,这些类是Java标准库的一部分,是开发网络应用时的常用工具。通过熟练掌握这两个类的使用,...

    java DatagramSocket 的上传文件客户端

    Java中的`DatagramSocket`是实现用户数据报协议(UDP)通信的核心类。UDP是一种无连接的、不可靠的传输层协议,相比TCP,它在效率和速度上有优势,但不保证数据的顺序和完整性。在Java网络编程中,`DatagramSocket`...

    DatagramSocket

    在Java网络编程领域中,`DatagramSocket` 是一个重要的类,它主要用于实现无连接的数据报服务,即UDP(User Datagram Protocol)协议。与面向连接的TCP(Transmission Control Protocol)不同,UDP是一种尽力而为的...

    DatagramSocket And DatagramPacket

    在Java的网络编程中,`DatagramSocket`和`DatagramPacket`是两个核心的类,它们用于实现UDP(User Datagram Protocol)协议的通信。UDP是一种无连接的、不可靠的传输层协议,适合于对实时性要求较高但对数据完整性...

    java网络编程,UDP,发送16进制报文。

    在Java中,我们使用`java.net.DatagramSocket`类来创建一个UDP套接字,用于发送和接收数据报。`DatagramPacket`类用于封装我们要发送的数据和目标地址。以下是一个简单的UDP客户端示例: ```java import java.io....

    Java 套接字编程Java 套接字编程

    随着互联网技术的不断发展与普及,网络编程成为现代软件开发中不可或缺的一部分。Java作为一种广泛应用的编程语言,提供了丰富的API支持网络编程,尤其是对于套接字(Socket)编程的支持。本文将详细介绍Java套接字...

    Java socket网络编程的基础示例

    Java中使用`java.net.DatagramSocket`和`java.net.DatagramPacket`类进行UDP编程。以下是一个简单的UDP服务器端和客户端示例: ```java // 服务器端 DatagramSocket serverSocket = new DatagramSocket(9999); // ...

    javaUDP实现服务器客户端大小写的转换

    在Java中,我们通常使用`java.net.DatagramSocket`类来处理UDP通信。这个类允许我们发送和接收UDP数据报(DatagramPacket)。首先,我们需要创建一个服务器端,它监听特定的端口,接收来自客户端的数据报,进行大小...

    传智播客Java教程 Java基础答疑公开课(二)

    在Java中,我们可以使用java.net包中的DatagramSocket和DatagramPacket类来进行UDP通信。 DatagramSocket用于创建一个UDP套接字,它可以发送和接收数据报。发送数据时,我们需要创建一个DatagramPacket对象,包含要...

    java简单实现udp协议消息发送

    1. 创建DatagramSocket:在Java中,我们首先需要创建一个DatagramSocket实例来绑定一个端口,这个端口用于接收和发送数据。例如: ```java DatagramSocket socket = new DatagramSocket(12345); ``` 这里的12345是...

    java使用udp协议和硬件进行数据收发处理

    总结来说,Java中的UDP网络编程涉及到创建和管理`DatagramSocket`,构造和解析`DatagramPacket`,以及处理可能的异常情况。开发者需要根据实际需求选择合适的方式实现数据的高效传输,同时注意处理可能出现的数据...

    Java软件开发实战 Java基础与案例开发详解 19-6 Datagram套接字 共8页.pdf

    根据给定文件的信息,我们可以提炼出关于Java软件开发中涉及Datagram套接字的重要知识点,以及相关的背景知识。以下是对这些知识点的详细解读: ### 1. Java基础概述 #### 1.1 什么是Java Java是一种广泛使用的...

    java udp 实现简单实例

    首先,我们来看一下UDP通信中的两个主要类:`DatagramPacket`和`DatagramSocket`。 1. `DatagramPacket`类: - `DatagramPacket`用于封装数据,并指定目标IP地址和端口号。在Java中,你可以通过它的构造函数设置...

    UDP通信方式实现.docx

    在 Java 中,UDP 编程使用 DatagramPacket 和 DatagramSocket 两个类来实现。DatagramPacket 是数据报包,DatagramSocket 是进行端到端通信的类。DatagramPacket 中包含要传输的数据和目的 Socket 的信息。 端口号...

    java UDP报文的发送与接收

    在Java中,我们可以使用`java.net.DatagramSocket`类来实现UDP通信。接下来,我们将详细讨论如何在Java中发送和接收UDP报文。 一、发送UDP报文 发送UDP报文主要涉及以下几个步骤: 1. **创建DatagramSocket**:...

    转 Java校正电脑时间(java 时间同步)

    这篇博客“转 Java校正电脑时间(java 时间同步)”主要探讨了如何在Java中实现这一功能。 首先,Java中的日期和时间API包括`java.util.Date`、`java.util.Calendar`,以及从Java 8开始引入的更现代的`java.time`包。...

    java Udp 收发结构体实例 Socket编程

    在Java中,我们首先创建一个`DatagramSocket`对象,然后创建一个`DatagramPacket`,指定要发送的数据(通常是字节数组)、目标IP地址和端口号。接着,调用`DatagramSocket.send()`方法将数据报发送出去。例如,`new...

    java UDP通信

    在Java中,我们可以使用java.net包中的DatagramSocket类和DatagramPacket类来实现UDP通信。 服务端的实现通常涉及以下步骤: 1. **创建DatagramSocket**:服务端首先需要创建一个DatagramSocket实例,这会绑定到...

    UDP.rar_UDP_UDP侦听_UDP发送_UDP接收_java接收端口

    在Java中,我们可以使用java.net包中的DatagramSocket类来实现UDP的通信。下面将详细介绍如何实现UDP的发送、接收以及端口监听。 **UDP发送** 在Java中,使用DatagramSocket类创建一个发送端的socket实例。首先创建...

    java-udp.rar_UDP Java_UDP java socket_java socket _java socket

    在`UDPServer.java`中,通常会创建一个`DatagramSocket`实例,监听特定的端口,然后进入一个循环,不断接收`DatagramPacket`。接收数据时,`DatagramSocket.receive()`方法会阻塞,直到有数据到达。收到数据后,...

Global site tag (gtag.js) - Google Analytics