知识大全 使用DatagramSocket发送、接收数据[1]

Posted

篇首语:历览千载书,时时见遗烈。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 使用DatagramSocket发送、接收数据[1]相关的知识,希望对你有一定的参考价值。

疯狂Java讲义:使用DatagramSocket发送、接收数据[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

   使用DatagramSocket发送 接收数据

  DatagramSocket本身只是码头 不维护状态 不能产生IO流 它的唯一作用就是接收和发送数据报 Java使用DatagramPacket来代表数据报 DatagramSocket接收和发送的数据都是通过DatagramPacket对象完成的

  先看一下DatagramSocket的构造器

  DatagramSocket() 创建一个DatagramSocket实例 并将该对象绑定到本机默认IP地址 本机所有可用端口中随机选择的某个端口

  DatagramSocket(int prot) 创建一个DatagramSocket实例 并将该对象绑定到本机默认IP地址 指定端口

  DatagramSocket(int port InetAddress laddr) 创建一个DatagramSocket实例 并将该对象绑定到指定IP地址 指定端口

  通过上面三个构造器中任意一个构造器即可创建一个DatagramSocket实例 通常在创建服务器时 我们创建指定端口的DatagramSocket实例 这样保证其他客户端可以将数据发送到该服务器 一旦得到了DatagramSocket实例之后 就可以通过如下两个方法来接收和发送数据

  receive(DatagramPacket p) 从该DatagramSocket中接收数据报

  send(DatagramPacket p) 以该DatagramSocket对象向外发送数据报

  从上面两个方法可以看出 使用DatagramSocket发送数据报时 DatagramSocket并不知道将该数据报发送到哪里 而是由DatagramPacket自身决定数据报的目的 就像码头并不知道每个集装箱的目的地 码头只是将这些集装箱发送出去 而集装箱本身包含了该集装箱的目的地

  当Client/Server程序使用UDP协议时 实际上并没有明显的服务器和客户端 因为两方都需要先建立一个DatagramSocket对象 用来接收或发送数据报 然后使用DatagramPacket对象作为传输数据的载体 通常固定IP 固定端口的DatagramSocket对象所在的程序被称为服务器 因为该DatagramSocket可以主动接收客户端数据

  下面看一下DatagramPacket的构造器

  DatagramPacket(byte buf[] int length) 以一个空数组来创建DatagramPacket对象 该对象的作用是接收DatagramSocket中的数据

  DatagramPacket(byte buf[] int length InetAddress addr int port) 以一个包含数据的数组来创建DatagramPacket对象 创建该DatagramPacket时还指定了IP地址和端口 这就决定了该数据报的目的

  DatagramPacket(byte[] buf int offset int length) 以一个空数组来创建DatagramPacket对象 并指定接收到的数据放入buf数组中时从offset开始 最多放length个字节

  DatagramPacket(byte[] buf int offset int length InetAddress address int port) 创建一个用于发送的DatagramPacket对象 也多指定了一个offset参数

  在接收数据前 应该采用上面的第一个或第三个构造器生成一个DatagramPacket对象 给出接收数据的字节数组及其长度 然后调用DatagramSocket 的方法receive()等待数据报的到来 receive()将一直等待(也就是说会阻塞调用该方法的线程) 直到收到一个数据报为止 如下代码所示

  //创建接受数据的DatagramPacket对象

  DatagramPacket packet=new DatagramPacket(buf )

  //接收数据

  socket receive(packet)

  发送数据之前 调用第二个或第四个构造器创建DatagramPacket对象 此时的字节数组里存放了想发送的数据 除此之外 还要给出完整的目的地址 包括IP地址和端口号 发送数据是通过DatagramSocket的方法send()实现的 send()根据数据报的目的地址来寻径以传递数据报 如下代码所示

  //创建一个发送数据的DatagramPacket对象

  DatagramPacket packet = new DatagramPacket(buf length address port)

  //发送数据报

  socket send(packet)

  当我们使用DatagramPacket来接收数据时 会感觉DatagramPacket设计得过于烦琐 对于开发者而言 只关心该DatagramPacket能放多少数据 而DatagramPacket是否采用字节数组来存储数据完全不想关心 但Java要求创建接收数据用的DatagramPacket时 必须传入一个空的字节数组 该数组的长度决定了该DatagramPacket能放多少数据 这实际上暴露了DatagramPacket的实现细节 接着DatagramPacket又提供了一个getData()方法 该方法又可以返回DatagramPacket对象里封装的字节数组 该方法更显得有些多余 如果程序需要获取DatagramPacket里封装的字节数组 直接访问传给 DatagramPacket构造器的字节数组实参即可 无须调用该方法

  当服务器(也可以客户端)接收到一个DatagramPacket对象后 如果想向该数据报的发送者 反馈 一些信息 但由于UDP是面向非连接的 所以接收者并不知道每个数据报由谁发送过来 但程序可以调用DatagramPacket的如下三个方法来获取发送者的IP和端口

  InetAddress getAddress() 返回某台机器的 IP 地址 当程序准备发送次数据报时 该方法返回此数据报的目标机器的IP地址 当程序刚刚接收到一个数据报时 该方法返回该数据报的发送主机的IP地址

  int getPort() 返回某台机器的端口 当程序准备发送此数据报时 该方法返回此数据报的目标机器的端口 当程序刚刚接收到一个数据报时 该方法返回该数据报的发送主机的端口

  SocketAddress getSocketAddress() 返回完整SocketAddress 通常由IP地址和端口组成 当程序准备发送此数据报时 该方法返回此数据报的目标SocketAddress;当程序刚刚接收到一个数据报时 该方法返回该数据报是源SocketAddress

  上面getSocketAddress方法的返回值是一个SocketAddress对象 该对象实际上就是一个IP地址和一个端口号 也就是说SocketAddress对象封装了一个InetAddress对象和一个代表端口的整数 所以使用SocketAddress对象可以同时代表IP地址和端口

  下面程序使用DatagramSocket实现Server/Client结构的网络通信程序 本程序的服务器端使用循环 次来读取DatagramSocket中的数据报 每当读到内容之后便向该数据报的发送者送回一条信息 服务器端代码如下

  程序清单 codes/ / /UdpServer java

  public class UdpServer

  

  public static final int PORT = ;

  //定义每个数据报的最大大小为 K

  private static final int DATA_LEN = ;

  //定义该服务器使用的DatagramSocket

  private DatagramSocket socket = null;

  //定义接收网络数据的字节数组

  byte[] inBuff = new byte[DATA_LEN];

  //以指定字节数组创建准备接受数据的DatagramPacket对象

  private DatagramPacket inPacket =

  new DatagramPacket(inBuff inBuff length)

  //定义一个用于发送的DatagramPacket对象

  private DatagramPacket outPacket;

  //定义一个字符串数组 服务器发送该数组的的元素

  String[] books = new String[]

  

   轻量级J EE企业应用实战

   基于J EE的Ajax宝典

   Struts 权威指南

   ROR敏捷开发最佳实践

  ;

  public void init()throws IOException

  

  try

  

  //创建DatagramSocket对象

  socket = new DatagramSocket(PORT)

  //采用循环接受数据

  for (int i = ; i < ; i++ )

  

  //读取Socket中的数据 读到的数据放在inPacket所封装的字节数组里

  socket receive(inPacket)

  //判断inPacket getData()和inBuff是否是同一个数组

  System out println(inBuff == inPacket getData())

  //将接收到的内容转成字符串后输出

  System out println(new String(inBuff

   inPacket getLength()))

  //从字符串数组中取出一个元素作为发送的数据

  byte[] sendData = books[i % ] getBytes()

  //以指定字节数组作为发送数据 以刚接受到的DatagramPacket的

  //源SocketAddress作为目标SocketAddress创建DatagramPacket

  outPacket = new DatagramPacket(sendData

  sendData length inPacket getSocketAddress())

  //发送数据

  socket send(outPacket)

  

  

  //使用finally块保证关闭资源

  finally

  

  if (socket != null)

  

  socket close()

  

  

  

  public static void main(String[] args)

  throws IOException

  

  new UdpServer() init()

  

  

  上面程序中粗体字代码就是使用DatagramSocket发送 接收DatagramPacket的关键代码 该程序可以接受 个客户端发送过来的数据

cha138/Article/program/Java/hx/201311/27259

相关参考

知识大全 在服务端接收和发送数据

Java网络编程从入门到精通(26):在服务端接收和发送数据  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看

知识大全 使用Socket类接收和发送数据

Java网络编程从入门到精通(13):使用Socket类接收和发送数据  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶

知识大全 使用Socket发送和接收消息[1]

使用Socket发送和接收消息[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &n

涉及小额汇划交易有哪些登记簿查询?

汇出登记簿、汇入登记簿、发送数据包登记簿、发送数据包明细登记簿、接收数据包登记簿、接收数据包明细登记簿、小额通用信息(含自由格式信息)登记簿、小额查询查复登记簿、小额退回处理登记簿、小额撤销处理登记簿

知识大全 使用Socket发送和接收消息[2]

使用Socket发送和接收消息[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &n

知识大全 使用Socket发送和接收消息[3]

使用Socket发送和接收消息[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &n

知识大全 使用Socket发送和接收消息[4]

使用Socket发送和接收消息[4]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &n

知识大全 vs.net打造发送与接收端程序

  本篇文章的主要开发环境是VisualStudioVisualStudio系列产品一直以来都提供了强大的控件功能然而我们利用这些控件可以编写出功能强大的应用程序本文主要利用微软的最新net开发工具为

知识大全 网络数据流的java处理

  郭洪锋()该文章对编写客户服务器应用的java程序员有所帮助可以解决程序在对方出现故障的时候继续稳定运行  前言java程序要处理很多的网络数据网络数据发送和接收以及数据流的处理是java程序要特

解码器是什么?

  解码器的作用是专用数据电缆接收来自控制主机发送的控制码,经其解码,放大输出,驱动云台的旋转,以及变焦镜头的变焦与聚焦。  通常,解码器的电压放大输出,对云台的驱动电压为AC24V,对通镜的驱动电压