java socket datagramsocket_Java UDP通信:Java DatagramSocket类和DatagramPacket类

java socket datagramsocket_Java UDP通信:Java DatagramSocket类和DatagramPacket类在TCP/IP协议的传输层除了一个TCP协议之外,还有一个UDP协议。UDP协议是用户数据报协议的简称,也用于网络数据的传输。虽然UDP协议是一种不太可靠的协议,但有时在需要较快地接收数据并且可以忍受较小错误的情况下,UDP就会表现出更大的优势。下面是在Java中使用UDP协议发送数据的步骤。使用DatagramSocket()创建一个数据包套接字。使用Datag…

大家好,又见面了,我是你们的朋友全栈君。

在 TCP/IP 协议的传输层除了一个 TCP 协议之外,还有一个 UDP 协议。UDP 协议是用户数据报协议的简称,也用于网络数据的传输。虽然 UDP 协议是一种不太可靠的协议,但有时在需要较快地接收数据并且可以忍受较小错误的情况下,UDP 就会表现出更大的优势。

下面是在 Java 中使用 UDP 协议发送数据的步骤。

使用 DatagramSocket() 创建一个数据包套接字。

使用 DatagramPacket() 创建要发送的数据包。

使用 DatagramSocket 类的 send() 方法发送数据包。

接收 UDP 数据包的步骤如下:

使用 DatagramSocket 创建数据包套接字,并将其绑定到指定的端口。

使用 DatagramPacket 创建字节数组来接收数据包。

使用 DatagramPacket 类的 receive() 方法接收 UDP 包。

DatagramPacket 类

java.net 包中的 DatagramPacket 类用来表示数据报包,数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。表 1 和表 2 简单介绍了 DatagramPacket 的构造方法和常用方法。

表1 DatagramPacket的构造方法

构造方法

说明

DatagramPacket(byte[] buf,int length)

构造 DatagramPacket,用来接收长度为 length 的数据包。

DatagramPacket(byte[] buf,int offset,

int length)

构造 DatagramPacket,用来接收长度为 length 的包,在缓

冲区中指定了偏移量。

DatagramPacket(byte[] buf,int length,

InetAddress address,int port)

构造 DatagramPacket,用来将长度为 length 的包发送到指

定主机上的指定端口。

DatagramPacket(byte[] buf,int length,

SocketAddress address)

构造数据报包,用来将长度为 length 的包发送到指定主机上

的指定端口。

DatagramPacket(byte[] buf,int offset,

int length,InetAddress address,int port)

构造 DatagramPacket,用来将长度为 length 偏移量为 offset

的包发送到指定主机上的指定端口。

DatagramPacket(byte[] buf,int offset,

int length,SocketAddress address)

构造数据报包,用来将长度为 length、偏移量为 offset 的包发

送到指定主机上的指定端口。

表2 DatagramPacket的常用方法

方法

说明

InetAddress getAddress()

返回某台机器的 IP 地址,此数据报将要发往该机器或者

从该机器接收。

byte[] getData()

返回数据缓冲区。

int getLength()

返回将要发送或者接收的数据的长度。

int getOffset()

返回将要发送或者接收的数据的偏移量。

int getPort()

返回某台远程主机的端口号,此数据报将要发往该主机或

者从该主机接收。

getSocketAddress()

获取要将此包发送或者发出此数据报的远程主机的

SocketAddress(通常为 IP地址+端口号)。

void setAddress(InetAddress addr)

设置要将此数据报发往的目的机器的IP地址。

void setData(byte[] buf)

为此包设置数据缓冲区。

void setData(byte[] buf,int offset,

int length)

为此包设置数据缓冲区。

void setLength(int length)

为此包设置长度。

void setPort(int port)

设置要将此数据报发往的远程主机的端口号。

void setSocketAddress(SocketAddress

address)

设置要将此数据报发往的远程主机的

SocketAddress(通常为 IP地址+端口号)。

DatagramSocket 类

DatagramSocket 类用于表示发送和接收数据报包的套接字。数据报包套接字是包投递服务的发送或接收点。每个在数据报包套接字上发送或接收的包都是单独编址和路由的。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。

DatagramSocket 类的常用构造方法如表 3 所示。

表3 DatagramSocket 的构造方法

构造方法

说明

DatagramSocket()

构造数据报包套接字并将其绑定到本地主机上任何可用的端口。

DatagramSocket(int port)

创建数据报包套接字并将其绑定到本地主机上的指定端口。

DatagramSocket(int portJnetAddress addr)

创建数据报包套接字,将其绑定到指定的本地地址。

DatagramSocket(SocketAddress bindaddr)

创建数据报包套接字,将其绑定到指定的本地套接字地址。

DatagramSocket 类的常用方法如表 4 所示。

表4 DatagramSocket 的常用方法

方法

说明

void bind(SocketAddress addr)

将此 DatagramSocket 绑定到特定的地址和端口。

void close()

关闭此数据报包套接字。

void connect(InetAddress address,int port)

将套接字连接到此套接字的远程地址。

void connect(SocketAddress addr)

将此套接子连接到远程套接子地址(IP地址+端口号)。

void disconnect()

断开套接字的连接。

InetAddress getInetAddress()

返回此套接字连接的地址。

InetAddress getLocalAddress()

获取套接字绑定的本地地址。

int getLocalPort()

返回此套接字绑定的本地主机上的端口号。

int getPort()

返回此套接字的端口。

例 1

编写 UDP 程序,要求客户端程序可以向服务器端发送多条数据,服务器端程序可以接收客户端发送的多条数据并将其信息输出在控制台,主要步骤如下所示。

(1) 创建一个类作为客户端,在 main() 方法定义一个 DatagramSocket 对象和一个 DatagramPacket 对象并初始化为 null。然后再定义一个 InetAddress 对象和一个端口号并分别进行初始化,代码如下所示。

public static void main(String[] args) { DatagramSocket ds=null; DatagramPacket dpSend=null; InetAddress ia=InetAddress.getByName(“127.0.0.1”); int port=3021; }

(2) 使用 DatagramSocket 的 send(DatagramPacket p) 方法向服务器端发送数据报包,使用循环的方式完成 5 次数据的发送,每发送 1 次数据线程休眠 1000 毫秒,数据发送完毕调用 close() 方法,关闭 DatagramSocket 对象,代码如下。

try { ds=new DatagramSocket(); for(int i=0;i<5;i++) { byte[] data=(“我是 UDP 客户端”+i).getBytes(); dpSend=new DatagramPacket(data,data.length,ia,port); ds.send(dpSend); Thread.sleep(1000); } ds.close(); } catch(IOException | InterruptedException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); }

(3) 创建一个类作为服务器端,在 main() 方法中定义一个 DatagramSocket 对象和一个 DatagramPacket 对象并初始化为 null,再定义一个端口号,代码如下所示。

public static void main(String[] args) { DatagramSocket ds=null; DatagramPacket dpReceive=null; int port=3021; }

(4) 如果成功连接到 UDP 服务器则输出“UDP 服务器已启动。。。”。循环接收客户端发送的数据,并将其发送的内容以及IP地址等信息输出到控制台,代码如下所示。

try { ds=new DatagramSocket(port); System.out.println(“UDP服务器已启动。。。”); byte[] b=new byte[1024]; while(ds.isClosed()==false) { dpReceive=new DatagramPacket(b, b.length); try { ds.receive(dpReceive); byte[] Data=dpReceive.getData(); int len=Data.length; System.out.println(“UDP客户端发送的内容是:” + new String(Data, 0, len).trim()); System.out.println(“UDP客户端IP:” + dpReceive.getAddress()); System.out.println(“UDP客户端端口:” + dpReceive.getPort()); } catch(IOException e) { e.printStackTrace(); } } } catch(SocketException e1) { // TODO 自动生成的 catch 块 e1.printStackTrace(); } }

(5) 最后关闭 DatagramSocket 对象。执行服务器端程序,运行结果如下所示。

UDP服务器已启动。。。

(6) 再运行客户端程序,控制台的输出结果如下所示。

UDP客户端发送的内容是:我是UDP客户端0 UDP客户端IP:/127.0.0.1 UDP客户端端口:53472 UDP客户端发送的内容是:我是UDP客户端1 UDP客户端IP:/127.0.0.1 UDP客户端端口:53472 UDP客户端发送的内容是:我是UDP客户端2 UDP客户端IP:/127.0.0.1 UDP客户端端口:53472 UDP客户端发送的内容是:我是UDP客户端3 UDP客户端IP:/127.0.0.1 UDP客户端端口:53472 UDP客户端发送的内容是:我是UDP客户端4 UDP客户端IP:/127.0.0.1 UDP客户端端口:53472

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/132505.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • qxdm使用教程_log命令

    qxdm使用教程_log命令(一)、首先保证PC机和手机串口(或并口)之间连接畅通,这个可以从QXDM工具的系统栏看出,如果是MSM6000的项目,系统栏会显示“COMX:SURF6000-ZRF6000”;如果是MSM6025的项目,系统栏会显示“COMX:SURF6025-ZRF6025”。其中X为某个串口,比如COM1,X=1等。(二)、QXDM打开后,先配置好messageview要打印的信息,具体的配置如

    2022年10月2日
    0
  • Linux 查看Redis 的版本

    Linux 查看Redis 的版本1.redis-server–version和redis-server-v查询结果2.redis-cli–version和redis-cli-v查询结果注:因为redis的server与cli同时安装,所以二者查出的结果基本一致。…

    2022年5月27日
    43
  • mysql listagg函数_Oracle函数之LISTAGG「建议收藏」

    mysql listagg函数_Oracle函数之LISTAGG「建议收藏」最近在学习的过程中,发现一个挺有意思的Oracle函数,它可实现对列值的拼接。下面我们来看看其具体用法。最近在学习的过程中,发现一个挺有意思的Oracle函数,它可实现对列值的拼接。下面我们来看看其具体用法。用法:对其作用,官方文档的解释如下:Foraspecifiedmeasure,LISTAGGordersdatawithineachgroupspecifiedinth…

    2022年9月6日
    2
  • 服务器基础知识全解(汇总版)[通俗易懂]

    服务器基础知识全解(汇总版)[通俗易懂]服务器基础知识全解(汇总版)https://www.zack.cn/archives/729本文对服务器知识进行了汇总,并添加了服务器基准测试和认证章节,内容包括9大章节,从服务器的概念、服务器重要部件技术和架构组成,并且对磁盘、RAID知识,网卡等知识做了深度详细介绍。说明:部分内容首发“智能计算芯世界”微信公众号。简单来说,服务器就是在网络中为其他客户机提供服务的计算机;具有高性能、高可靠、高IO数据传输能力等特点,企业从基础的邮件、打印到核心应用如ERP、数据库等业务,再到我们所熟

    2022年9月10日
    0
  • 一步步学习SPD2010–第十章节–SP网站品牌化(12)–关键点

    一步步学习SPD2010–第十章节–SP网站品牌化(12)–关键点1.      SPD提供了许多工具帮助你管理CSS样式和文件2.      SPD使用一系列配置选项来决定它如何添加CSS标签到你的页面。3.      SPFoundation和SPServer主要的CSS是corev4.css。

    2022年6月21日
    24
  • linux 软连接 创建/查看/删除[通俗易懂]

    linux 软连接 创建/查看/删除[通俗易懂]linux软件连接创建/查看/删除1、建立软链接具体用法是:ln-s源文件目标文件。源:实际存放文件的位置当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。-s是代号(symbolic)的意思注意:ln的链接…

    2022年9月26日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号