Java网络编程:UDP DatagramSocket-Java-优质IT资源分享社区

admin
管理员
管理员
  • UID1
  • 粉丝29
  • 关注4
  • 发帖数581
  • 社区居民
  • 忠实会员
  • 原创写手
阅读:212回复:0

  Java网络编程:UDP DatagramSocket

楼主#
更多 发布于:2016-05-22 15:02

DatagramSocket类是java经过UDP通信的途径。UDP仍坐落IP层的上面。

你能够用DatagramSocket类发送和接纳UDP数据包。

UDP 和TCP

UDP作业方式和TCP有点不一样。当你经过TCP发送数据时,你先要创立衔接。一旦TCP衔接建立了,TCP会确保你的数据传递到对端,否则它将通知你已发作的错误。

仅仅用UDP来发送数据包(datagrams)到网络间的某个IP地址。你不能确保数据会不会抵达。你也不能确保UDP数据包抵达接纳方的指令。这意味着UDP比TCP有更少的协议开支(无完整检查流)。

当数据传输过程中不在乎数据包是不是丢掉时,UDP就对比合适这么的数据传输。比方,网上的电视信号的传输。你期望信号抵达客户端时尽也许地挨近直播。因而,假如丢掉一两个画面,你一点都不在乎。你不期望直播延迟,值想确保一切的画面显现在客户端。你宁可越过丢掉的画面,期望一向看到最新的画面。

这种状况也会发作在网上摄像机直播节目中。谁会关怀曩昔发作的啥,你只想显现当时的画面。你不期望比实际状况慢30s完毕,只由于你想看到摄像机显现给观众的一切画面。这跟摄像机录像有点不一样。从摄像机录制画面到磁盘,你不期望丢掉一个画面。你也许还期望有点延迟,假如有严重的状况发作,就不需求倒回去检查画面。

经过DatagramSocket发送数据

经过Java的DatagramSocket类发送数据,首要需求创立DatagramPacket。如下:

buffer = new byte[65508]; InetAddress address =

new DatagramPacket(buffer, buffer.length, address,9000);

字节缓冲块(字节数组)即是UDP数据包中用来发送的数据。缓冲块上限长度为65508字节,是单一UDP数据包发送的最大的数据量。

数据包结构函数的长度即是缓存块中用于发送的数据的长度。一切多于最大容量的数据都会被疏忽。

包含节点(例如服务器)地址的InetAddress实例带着节点(如服务器)的地址发送的UDP数据包。InetAddress类表示一个ip地址(网络地址)。getByName()办法回来带有一个InetAddress实例,该实例带有匹配主机名的ip地址。

端口参数是UDP端口服务器用来接纳正在监听的数据。UDP端口和TCP端口是不一样的。一台电脑一起有不一样的进程监听UDP和TCP

80端口。

为了发送数据包,你需求创立DatagramSocket来发送数据。如下:

DatagramSocketdatagramSocket = new

DatagramSocket();

调用send()办法发送数据,像这么:

datagramSocket.send(packet);

完整示例:

DatagramSocketdatagramSocket = new

DatagramSocket();byte[] buffer =

"0123456789".getBytes();InetAddressreceiverAddress =

InetAddress.getLocalHost();DataframPacket packet = new DatagramPacket( buffer,

buffer.length, receiverAddress,80);datagramSocket.send(packet);

从DatagramSocket获取数据

从DataframSocket获取数据时,首要创立DataframPacket

,然后经过DatagramSocket类的receive()办法接纳数据。例如:

DatagramSocketdatagramSocket = new

DatagramSocket(80);byte[] buffer = new byte[10];DatagramPacket packet = new

DatagramPacket(buffer, buffer.length);datagramSocket.receive(packet);

留意DatagramSocket是怎么经过传递参数80到它的结构器初始化的。这个参数是UDP端口的DatagramSocket用来接纳UDP数据包的。像之前说到的,TCP和UDP端口是不一样的,也不堆叠。你能够有俩个不一样的进程一起在端口80监听TCP和UDP,没有任何抵触。

第二,字节缓存块和DatagramPacket创立了。留意DatagramPacket是没有对于节点怎么发送数据的信息的,当创立一个方数据的DatagramPacket时,它会直到这个信息。这即是为啥咱们会用DatagramPacket接纳数据而不是发送数据。因而没有方针地址是有必要的。

最终,调用DatagramSocket的receive()办法。直到数据包接纳到停止,这个办法都是堵塞的。

接纳的数据坐落DatagramPacket的字节缓冲块。缓冲块能够经过调用getData()取得:

byte[] buffer = packet.getData();

缓冲块接纳了多少的数据需求你去找出来。你用的协议应该界说每个UDP包发多少数据,活着界说一个你能找到的数据完毕标记。

一个真正的服务端程序也许会在一个loop中调用receive()办法,传送一切接纳到的DatagramPacket到作业的线程池中,就像TCP服务器处理请求衔接一样(检查Java

Multithreaded Servers获取更多详情)

优质IT资源分享社区为你提供此文。

本站有大量优质Java教程视频,资料等资源,包含java基础教程,高级进阶教程等等,教程视频资源涵盖传智播客,极客学院,达内,北大青鸟,猎豹网校等等IT职业培训机构的培训教学视频,价值巨大。欢迎点击下方链接查看。

java教程视频

优质IT资源分享社区(www.itziyuan.top)
一个免费,自由,开放,共享,平等,互助的优质IT资源分享网站。
专注免费分享各大IT培训机构最新培训教学视频,为你的IT学习助力!

!!!回帖受限制请看点击这里!!!
!!!资源失效请在此版块发帖说明!!!

[PS:按 CTRL+D收藏本站网址~]

——“优质IT资源分享社区”管理员专用签名~

本版相似帖子

游客