`
heisalittlebird
  • 浏览: 20152 次
文章分类
社区版块
存档分类
最新评论

Java UDP通信(DatagramPacket类、DatagramSocket类、InetAddress类)

 
阅读更多

一、DatagramPacket类:

如果把DatagramSocket比作创建的港口码头,那么DatagramPacket就是发送和接收数据的集装箱。
构造函数:一个用来接收数据,一个用来发送数据
public DatagramPacket(byte[] buf,int length) //接收数据
构造 DatagramPacket 用来接收长度为 ilength 的包。
public DatagramPacket(byte[] buf,int length,InetAddress address,int port)
构造数据报文包用来把长度为 ilength 的包传送到指定宿主的指定的端口号。
getAddress()
返回接收或发送此数据报文的机器的 IP 地址。
getData()
返回接收的数据或发送出的数据。
getLength()
返回发送出的或接收到的数据的长度。
getPort()
返回接收或发送该数据报文的远程主机端口号。

二、DatagramSocket类

此类表示用来发送和接收数据报包的套接字。 数据报套接字是包投递服务的发送或接收点。
DatagramSocket(int port) 创建数据报套接字并将其绑定到本地主机上的指定端口。
DatagramSocket(int port, InetAddress laddr) 创建数据报套接字,将其绑定到指定的本地地址。

receive(DatagramPacket p)
从此套接字接收数据报包。
void send(DatagramPacket p)
从此套接字发送数据报包。
bind(SocketAddress addr)
将此 DatagramSocket 绑定到特定的地址和端口。
void close()
关闭此数据报套接字。
void connect(InetAddress address, int port)
将套接字连接到此套接字的远程地址。
void connect(SocketAddress addr)
将此套接字连接到远程套接字地址(IP 地址 + 端口号)。
void disconnect()
断开套接字的连接。
getInetAddress()
返回此套接字连接的地址。
InetAddress getLocalAddress()
获取套接字绑定的本地地址。

三、InetAddress类
InetAddress用于表示计算机IP地址的一个类,而在日常应用中的IP地址用"192.168.0.1",
"
WWW.it315.org"等字符串格式表示的。
getByName方法
getHostAddress方法

四、UDP通信示例代码:

发送端代码UdpSend.java:

import java.net.*;

public class UdpSend {
public static void main(String[] args) throws Exception{
DatagramSocket ds=new DatagramSocket();
String strInfo="Hello Taohx";
ds.send(new DatagramPacket(strInfo.getBytes(),strInfo.length(),
InetAddress.getByName("59.64.157.93"),3000));
ds.close();
}
}

接收代码UdpRecv.java:

import java.net.*;
public class UdpRecv {
public static void main(String[] args) throws Exception{
DatagramSocket ds=new DatagramSocket(3000);
byte [] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,1024);
ds.receive(dp);
String strInfo= new String(dp.getData(),0,dp.getLength())+
" from "+dp.getAddress().getHostAddress()+":"+dp.getPort();
System.out.println(strInfo);
ds.close();

}
}

注意:若发送中文信息时,因为中文字符占两个字节,故发送代码 ds.send要修改如下才可正确地发送中文信息,

ds.send(new DatagramPacket(strInfo.getBytes(),strInfo.getBytes().length,
InetAddress.getByName("59.64.157.93"),3000));

***********************************************************************************************************

在Java中操纵UDP

  使用位于JDK中Java.net包下的DatagramSocket和DatagramPacket类,可以非常方便地控制用户数据报文。

  在描述它们之前,必须了解位于同一个位置的InetAddress类。InetAddress实现了Java.io. Serializable接口,不允许继承。它用于描述和包装一个Internet IP地址,通过三个方法返回InetAddress实例:

getLocalhost():返回封装本地地址的实例。

getAllByName(String host):返回封装Host地址的InetAddress实例数组。

getByName(String host):返回一个封装Host地址的实例。其中,Host可以是域名或者是一个合法的IP地址。

DatagramSocket类用于创建接收和发送UDP的Socket实例。和Socket类依赖SocketImpl类一样,DatagramSocket类的实现也依靠专门为它设计的DatagramScoketImplFactory类。DatagramSocket类有3个构建器:

DatagramSocket():创建实例。这是个比较特殊的用法,通常用于客户端编程,它并没有特定监听的端口,仅仅使用一个临时的。

DatagramSocket(int port):创建实例,并固定监听Port端口的报文。

DatagramSocket(int port, InetAddress localAddr):这是个非常有用的构建器,当一台机器拥有多于一个IP地址的时候,由它创建的实例仅仅接收来自LocalAddr的报文。

值得注意的是,在创建DatagramSocket类实例时,如果端口已经被使用,会产生一个SocketException的异常抛出,并导致程序非法终止,这个异常应该注意捕获。DatagramSocket类最主要的方法有4个:

Receive(DatagramPacket d):接收数据报文到d中。receive方法产生一个“阻塞”。

Send(DatagramPacket d):发送报文d到目的地。

SetSoTimeout(int timeout):设置超时时间,单位为毫秒。

Close():关闭DatagramSocket。在应用程序退出的时候,通常会主动释放资源,关闭Socket,但是由于异常地退出可能造成资源无法回收。所以,应该在程序完成时,主动使用此方法关闭Socket,或在捕获到异常抛出后关闭Socket。

“阻塞”是一个专业名词,它会产生一个内部循环,使程序暂停在这个地方,直到一个条件触发。

DatagramPacket类用于处理报文,它将Byte数组、目标地址、目标端口等数据包装成报文或者将报文拆卸成Byte数组。应用程序在产生数据包是应该注意,TCP/IP规定数据报文大小最多包含65507个,通常主机接收548个字节,但大多数平台能够支持8192字节大小的报文。DatagramPacket类的构建器共有4个:

DatagramPacket(byte[] buf, int length, InetAddress addr, int port):从Buf数组中,取出Length长的数据创建数据包对象,目标是Addr地址,Port端口。

DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port):从Buf数组中,取出Offset开始的、Length长的数据创建数据包对象,目标是Addr地址,Port端口。

DatagramPacket(byte[] buf, int offset, int length):将数据包中从Offset开始、Length长的数据装进Buf数组。

DatagramPacket(byte[] buf, int length):将数据包中Length长的数据装进Buf数组。

DatagramPacket类最重要的方法就是getData()了,它从实例中取得报文的Byte数组编码。

简单的实例说明

{接收数据的服务器}


byte[] buf = new byte[1000];

DatagramSocket ds = new DatagramSocket(12345);

//开始监视12345端口

DatagramPacket ip = new DatagramPacket(buf, buf.length);

//创建接收数据报的实例

while (true)

{

ds.receive(ip);

//阻塞,直到收到数据报后将数据装入IP中

System.out.println(new String(buf));

}


{发送数据的客户端}


InetAddress target = InetAddress.getByName(“www.xxx.com“);

//得到目标机器的地址实例

DatagramSocket ds = new DatagramSocket(9999);

//从9999端口发送数据报

String hello = “Hello, I am come in!”;

//要发送的数据

byte[] buf = hello.getBytes();

//将数据转换成Byte类型

op = new DatagramPacket(buf, buf.length, target, 12345);

//将BUF缓冲区中的数据打包

ds.send(op);

//发送数据

ds.close();

//关闭连接

分享到:
评论

相关推荐

    网路编程-UDP-DatagramSocket、DatagramPacket

    `DatagramSocket`是Java提供的一个类,它代表了UDP通信中的一个端点。通过这个类,我们可以创建一个socket,用于发送和接收数据报(datagrams)。数据报是UDP的基本传输单位,它们不保证顺序到达,也不保证每个数据...

    java UDP通信

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

    Java-Oracle-UDP通信

    在Java编程中,我们通常使用`java.net`包中的`DatagramSocket`类来处理UDP通信,而在Oracle数据库环境中,我们可以结合触发器、存储过程和服务器端Java类来实现更复杂的业务逻辑。 首先,让我们了解UDP通信的基本...

    用Java实现一个UDP通信模型

    在Java中,我们主要通过`java.net.DatagramSocket`类来实现UDP通信。下面,我们将分别讲解客户端(Sender)和服务器端(Receiver)的实现。 **服务器端(Receiver):** 1. 创建`DatagramSocket`实例,绑定到特定...

    UDP.rar_UDP_UDP 协议_UDP 通信协议_java udp

    在Java中,我们可以使用java.net包下的DatagramSocket类和DatagramPacket类来实现UDP的网络通信。 ### UDP协议特性 1. **无连接**:UDP在发送数据之前不需要建立连接,每个数据报文都是独立发送的,因此它不保证...

    java语言UDP通信

    总结来说,Java语言中的UDP通信主要涉及`DatagramSocket`和`DatagramPacket`类,它们分别用于建立连接和封装数据。通过创建这两个对象,我们可以实现UDP客户端与服务器之间的通信,以及点对点通信。在实际应用中,...

    Java_udp.rar_java udp

    总结,Java UDP编程涉及`DatagramSocket`和`DatagramPacket`类的使用,通过它们实现数据的发送和接收。理解这些核心概念和API,能帮助开发者有效地构建基于UDP的应用,如实时通信、文件传输等场景。在实际开发中,要...

    Java UDP 实现简单聊天功能

    在Java中,我们通常使用`java.net.DatagramSocket`类来实现UDP通信。`DatagramSocket`是UDP的基础,它负责发送和接收数据报。首先,我们需要创建一个`DatagramSocket`实例来监听特定的端口,这个端口就是其他客户端...

    android 和java实现UDP通信

    - **DatagramSocket**: 在Java中,我们使用`java.net.DatagramSocket`类来创建一个UDP套接字,可以用来发送和接收数据报。 - **DatagramPacket**: `java.net.DatagramPacket`用于封装我们要发送的数据和接收的数据...

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

    在Java中,我们通过`java.net.DatagramSocket`类来创建一个UDP套接字,用于数据的发送和接收。以下是一个简单的UDP数据发送示例: ```java import java.net.DatagramPacket; import java.net.DatagramSocket; ...

    UDP.rar_java udp_udp例子

    总结来说,Java中的UDP通信涉及`DatagramSocket`和`DatagramPacket`类的使用,它们分别用于建立套接字和封装数据报。UDP协议提供了高效但不可靠的传输,适合实时性要求高但对数据完整性不敏感的应用场景,如在线视频...

    JavaUDP开发简单聊天系统

    首先,Java提供了`java.net.DatagramSocket`类来处理UDP通信。`DatagramSocket`用于发送和接收数据报,每个数据报包含数据和目的地址。创建一个`DatagramSocket`实例,我们就能开始发送和接收数据。 1. **创建...

    UDP_Java.rar_java udp client

    首先,我们要了解Java中的`java.net`包,这个包提供了处理网络通信的基本类,如`DatagramSocket`和`DatagramPacket`,它们是实现UDP通信的核心工具。 1. **DatagramSocket**:`DatagramSocket`是Java UDP通信的主要...

    java UDP报文的发送与接收

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

    java udp 实现简单实例

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

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

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

    java udp 通讯,java中实现UDP通讯

    在Java中,我们通常使用`java.net`包中的`DatagramSocket`类和`DatagramPacket`类来实现UDP通信。 1. **DatagramSocket类**: `DatagramSocket`是Java中用来发送和接收UDP数据报的类。创建一个`DatagramSocket`...

    UDP通信过程详解+附Java实现方式(wcb2003)

    2. **准备数据**:UDP通信的数据通常封装在`java.net.DatagramPacket`对象中。开发者需要创建一个字节数组来存放要发送的数据,并创建一个`DatagramPacket`实例,将数据和目标IP地址、端口号传入。 3. **发送数据**...

    java实现udp的发送信息和接受信息.rar

    在Java中,我们主要使用`java.net.DatagramSocket`类来处理UDP通信。`DatagramSocket`提供了发送和接收数据报的能力,每个数据报由`java.net.DatagramPacket`类表示,包含数据和目标/源IP地址及端口号。 1. **创建...

    java实现的tcpudp通信

    ### Java 实现 TCP/UDP 通信详解 #### 实验背景及意义 随着互联网技术的不断发展,网络编程成为了软件开发中不可或缺的一部分。TCP/IP 协议作为互联网的基础协议,其重要性不言而喻。Java 作为一种广泛应用的编程...

Global site tag (gtag.js) - Google Analytics