JAVA中UDP使用
UDP协议
在有些应用程序中,保持最快的速度比保证每一位数据都正确到达更重要。例如,在实时音频或视频中,丢失数据包只会作为干扰出现。干扰是可以容忍的,但当TCP请求重传或等待数据包到达而它却迟迟不到时,音频流中就会出现尴尬的停顿,这让人无法接受的。在其他应用中,可以在应用层实现可靠性传输。例如:如果客户端向服务器发送一个短的UDP请求,倘若制定时间内没有响应返回,它会认为这个包已丢失。域名系统就是采用这样的工作方式。事实上,可以用UDP实现一个可靠的文件传输协议,而且很多人确实是这样做的:网络文件系统,简单FTP都使用了UDP协议。在这些协议中由应用程序来负责可靠性。java中的UDP实现分为两个类:DatagramPacket和 DatagramSocket。DatagramPacket类将数据字节填充到UDP包中,这称为数据报。 DatagramSocket来发送这个包。要接受数据,可以从DatagramSocket中接受一个 DatagramPack对象,然后从该包中读取数据的内容。
这种职责的划分与TCP使用的Socket和ServerSocket有所不同。首先,UDP没有两台主机间唯一连接的概念,它不需要知道对方是哪个远程主机。它可以从一个端口往多个主机发送信息,但是TCP是无法做到的。其次,TCP socket把网络链接看作是流:通过从Socket得到的输入和输出流来收发数据。UDP不支持这一点,你处理总是单个数据包。填充在一个数据报中的所有数据会以包的形式进行发送,这些数据要么作为一个组要么全部接收,要么全部丢弃。一个包不一定与下一个包相关。给定两个包,没有办法知道哪个先发哪个后发。对于流来说,必须提供数据的有序队列,与之不同,数据报会尽可能快的蜂拥到接收方。
一个UDP客户端
package com.dy.xidian;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class DaytimeUDPClient {
private final static int PORT = 13;
private static final String HOSTNAME = "www.xdysite.cn";
public static void main(String[] args) {
//传入0表示让操作系统分配一个端口号
try (DatagramSocket socket = new DatagramSocket(0)) {
socket.setSoTimeout(10000);
InetAddress host = InetAddress.getByName(HOSTNAME);
//指定包要发送的目的地
DatagramPacket request = new DatagramPacket(new byte[1], 1, host, PORT);
//为接受的数据包创建空间
DatagramPacket response = new DatagramPacket(new byte[1024], 1024);
socket.send(request);
socket.receive(response);
String result = new String(response.getData(), 0, response.getLength(), "ASCII");
System.out.println(result);
} catch (IOException e) {
e.printStackTrace();
}
}
}
一个UDP服务器
package com.dy.xidian;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.util.Date;
public class DaytimeUDPServer {
private final static int PORT = 13;
public static void main(String[] args) {
try (DatagramSocket socket = new DatagramSocket(PORT)) {
while (true) {
try {
DatagramPacket request = new DatagramPacket(new byte[1024], 1024);
socket.receive(request);
String daytime = new Date().toString();
byte[] data = daytime.getBytes("ASCII");
DatagramPacket response = new DatagramPacket(data, data.length, request.getAddress(), request.getPort());
socket.send(response);
System.out.println(daytime + " " + request.getAddress());
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
JAVA中UDP使用的更多相关文章
- Java 中UDP原理机制及实现方式介绍(建议阅读者阅读前了解下Java的基础知识,一方便理解)
1.基本概念介绍: 首先得简单介绍下UDP. UDP( User Datagram Protocol )协议是用户数据报,在网络中它与TCP协议一样用于处理数据包.在OSI模型中,在第四层——传输层, ...
- Java中UDP协议的基本原理和简单用法
UDP协议是非面向连接的,相对于TCP协议效率较高,但是不安全.UDP协议类似发信息的过程,不管接收方是在线还是关机状态,都会把信息发送出去.但是如果接收方不处于接收信息的状态,发送出去的数据包就会丢 ...
- Java中udp/tcp的发送和接收
InetAddress UDP例程: 发送数据: 接收数据: 结果: TCP例程: 发送数据: 接收数据: 结果:
- Java中的TCP/UDP网络通信编程
127.0.0.1是回路地址,用于测试,相当于localhost本机地址,没有网卡,不设DNS都可以访问. 端口地址在0~65535之间,其中0~1023之间的端口是用于一些知名的网络服务和应用,用户 ...
- Java中的UDP应用
我在<JavaSE项目之聊天室>中通过遵守TCP协议的ServerSocket与Socket实现了聊天室的群聊窗口.同时,在介绍OSI与TCP/IP参考模型时,也曾提及TCP与UDP(全称 ...
- Java中的UDP协议编程
一. UDP协议定义 UDP协议的全称是用户数据报,在网络中它与TCP协议一样用于处理数据包.在OSI模型中,在第四层——传输层,处于IP协议的上一层.UDP有不提供数据报分组.组装和不能对数据包 ...
- 在Java中实现UDP协议编程(DatagramSocket/DatagramPacket)
1.什么是UDP协议? UDP( User Datagram Protocol )协议是用户数据报,在网络中它与TCP协议一样用于处理数据包.在OSI模型中,在第四层——传输层,处于IP协议的上一层. ...
- Java中的网络编程
Java中的网路编程主要是Java的Socket编程,属于JavaEE中的高级的部分,以下内容是对java网路编程的一个小结,代码都是经过编译调试的 C/S程序应用:客户/服务器模式,如QQ客户端 ...
- Java实现UDP之Echo客户端和服务端
Java实现UDP之Echo客户端和服务端 代码内容 采用UDP协议编写服务器端代码(端口任意) 编写客户机的代码访问该端口 客户机按行输入 服务器将收到的字符流和接收到的时间输出在服务器consol ...
随机推荐
- 学习《深入理解C#》—— 泛型 (第三章3.1---3.2)
泛型是什么? 泛型(generic)是C# 2.0和通用语言运行时(CLR)的一个新特性.泛型为.NET框架引入了类型参数(type parameters)的概念.类型参数使得设计类和方法时,不必确定 ...
- iOS开发之 -- 帧动画的使用
在项目的开发过程中,我们经常会遇到使用动画的时候,比如我们在请求接口直接开始一个动画,请求结束后结束动画,下面我就给大家展示一个很方便的帧动画的用法: 代码如下: .h #import <Fou ...
- Java Web项目BlogAutoGenerator编写日志1
使用的数据库是MySQL,所以首先要在MySQL中创建database和表.建立数据库article_db,建立表blog,如下: create database article_db DEFAULT ...
- SQL ALTER TABLE 命令
SQL ALTER TABLE 命令 SQL ALTER TABLE 命令用于添加.删除或者更改现有数据表中的列. 你还可以用 ALTER TABLE 命令来添加或者删除现有数据表上的约束. 语法: ...
- 一 Android Studio 打包Egret App
测试环境: Android Studio 2.3.2 Egret Engine 5.0.14 Egret Support5.0.12 官网教程:http://developer.egret.com/c ...
- oracle 存储过程返回结果集
好久没上来了, 难道今天工作时间稍有空闲, 研究了一下oracle存储过程返回结果集. 配合oracle临时表, 使用存储过程来返回结果集的数据读取方式可以解决海量数据表与其他表的连接问题. 在存储过 ...
- 如何使用iOS 开发证书 和 Profile 文件
如果你想在 iOS 设备(iPhone/iPad/iTouch)上调试, 需要有 iOS 开发证书和 Profile 文件. 在你拿到这两个文件之后,该如何使用呢? 证书使用说明: 1. iOS 开 ...
- 记一个在docker中运行多线程event_loop.run_forever()的bug
问题简介 我写爬虫,用到了asyncio相关的事件循环,新建了一个线程去run_forever(),在docker中运行.后来程序有异常,主线程挂了,但是竟然不报错.查了很久,才找出来. 如果你新建一 ...
- Java中对List集合的常用操作(转载)
目录: list中添加,获取,删除元素: list中是否包含某个元素: list中根据索引将元素数值改变(替换): list中查看(判断)元素的索引: 根据元素索引位置进行的判断: 利用list中索引 ...
- R语言中基于聚类的离群点挖掘
思路:首先,通过K-means算法将数据点划分为成若K个簇:然后计算每一个数据对象到最近簇的中心距离,来与离群点设置的阈值进行比较,以此来判别该数据对象是否是离群点. 1.读取数据 data<- ...