java使用UDP

Java中通信可以使用的协议包括TCP协议和UDP协议

UDP协议概念

UDP协议的全称是用户数据报协议 ,在网络中它与TCP协议一样用于处理数据包,但它是一种无连接的协议。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。

综上所述:UDP不提供可靠地保证,保证数据准确按序到达目的地

为什么要使用UDP

在选择使用协议的时候,选择UDP必须要谨慎?在网络质量令人不十分满意的环境下,UDP协议数据包丢失会比较严重?但是由于UDP的特性:它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频?视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响?比如我们聊天用的ICQ和OICQ就是使用的UDP协议?

使用步骤

JAVA中UDP的核心类是DatagramSocket和DatagramPacket

具体使用步骤:

1、新建一个DatagramSocket;

2、通过DatagramPacket承接包;

3、使用receive方法接收;

4、读取数据转换为字符串

在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?

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

样例代码

{接收数据的服务器}
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();//关闭连接

时间: 2024-10-14 21:08:54

java使用UDP的相关文章

Java TCP/UDP socket 编程流程总结

最近正好学习了一点用java socket编程的东西.感觉整体的流程虽然不是很繁琐,但是也值得好好总结一下. Socket Socket可以说是一种针对网络的抽象,应用通过它可以来针对网络读写数据.就像通过一个文件的file handler就可以都写数据到存储设备上一样.根据TCP协议和UDP协议的不同,在网络编程方面就有面向两个协议的不同socket,一个是面向字节流的一个是面向报文的. 对socket的本身组成倒是比较好理解.既然是应用通过socket通信,肯定就有一个服务器端和一个客户端.

netty的Udp单播、组播、广播实例+Java的Udp单播、组播、广播实例

网络上缺乏netty的udp的单播.组播案例,经过一番学习总结之后终于把这两个案例调通,下面把这两个案例的代码放在这里分享一下. 首先推荐博文: http://colobu.com/2014/10/21/udp-and-unicast-multicast-broadcast-anycast/#Netty%E4%B8%8E%E5%8D%95%E6%92%AD%EF%BC%8C%E7%BB%84%E6%92%AD netty的Udp单播.组播.广播实例+Java的Udp单播.组播.广播实例, 这些代

JAVA实现UDP组播聊天程序

分类: Java 一.实验环境 编程语言:Java1.5(运行在JVM(Java Virsual Machine)) 开发工具:eclipce3.2 测试环境:局域网 二.实验目的 社会已经进入信息时代,网络技术在飞速发展.大量应用都依赖于从一个主机向多个主机或者从多个主机向多个主机发送同一信息的能力,在Internet上分布的数目可能达数十万台,这些都需要更高的带宽,并且大大超出了单播的能力.一种能最大限度地利用现有带宽的重要技术是IP组播. 三.组播聊天程序的实现: /** * 该程序实现了

[java]基于UDP的Socket通信Demo

java课编程作业:在老师给的demo的基础上实现客户端发送数据到服务器端,服务器端接受客户端后进行数据广播. 整体功能类似于聊天室,代码部分不是太难,但是在本机测试的时候出现这样的问题: 服务端通过将每一个Socket客户端的IP存入Set集合,每次接受到数据后都向当前所有的IP转发.但是本机演示的时候所有开的ChatClient客户端都是同一IP,怎么测试呢? 解决办法就是本机测试时候服务端向多个不同的端口转发就好了,这样跑起来的客户端是在不同端口上进行监听的(只是为了实现广播,实际应用下还

java使用UDP协议传输数据

UDP协议(User Datagram Protocol,用户数据报协议)不同于TCP协议,它是不可能靠的,但是它比TCP协议具有更快的传输速度,UDP发送的数据单元称为数据报,当网络传输UDP传输UDP数据报是无法保证数据能够到达目的地,也无法保证按发送的顺序到达目的地,也就是说先发送了"hello",再发送了"world",但接收方可能会先收到"world",再收到"hello",也有可能收不到数据,为什么呢?因为它是不可

[Java] Tcp/udp 简单通信

本文转自  我自己的博客guozeyiblog.cn 欢迎来访 效果图: //UDP通信 import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.net.*; import javax.swing.*; class send extends JFrame implements ActionL

Java使用UDP发送数据到InfluxDB

最近在做压测引擎相关的开发,需要将聚合数据发送到InfluxDB保存以便实时分析和控制QPS. 下面介绍对InfluxDB的使用. 什么是InfluxDB InfluxDB是一款用Go语言编写的开源分布式时序.事件和指标数据库,无需外部依赖.该数据库现在主要用于存储涉及大量的时间戳数据,如DevOps监控数据,APP metrics, loT传感器数据和实时分析数据. InfluxDB特征: 无结构(无模式):可以是任意数量的列(tags). 可以设置metric的保存时间. 支持与时间有关的相

java下udp的DatagramSocket 发送与接收

发送 package cn.stat.p4.ipdemo; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.InetSocketAddress;

java中UDP传输协议

package pack; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; /*public class Demo { public static void main(Stri