Java Networking: UDP DatagramSocket (翻译)
原文:http://tutorials.jenkov.com/java-networking/udp-datagram-sockets.html
- UDP vs. TCP
- Sending Data via a DatagramSocket
- Receiving Data via a DatagramSocket
DatagramSocket's are Java's mechanism for network communication via UDP instead of TCP. UDP is still layered ontop of IP. You can use Java's DatagramSocket both for sending and receiving UPD datagrams.
DatagramSocket类 是采用java网络通信机制中的UDP而不是TCP。UDP仍位于IP层的上面。 你可以用DatagramSocket类发送和接收UDP数据包。
UDP vs. TCP
UDP works a bit differently from TCP. When you send data via TCP you first create a connection. Once the TCP connection is established TCP guarantess that your data arrives at the other end, or it will tell you that an error occurred.
With UDP you just send packets of data (datagrams) to some IP address on the network. You have no guarantee that the data will arrive. You also have no guarantee about the order which UDP packets arrive in at the receiver. This means that UDP has less protocol overhead (no stream integrity checking) than TCP.
UDP is appropriate for data transfers where it doesn't matter if a packet is lost in transition. For instance, imagine a transfer of a live TV-signal over the internet. You want the signal to arrive at the clients as close to live as possible. Therefore, if a frame or two are lost, you don't really care. You don't want the live broadcast to be delayed just to make sure all frames are shown at the client. You'd rather skip the missed frames, and move directly to the newest frames at all times.
This could also be the case with a surveillance camera broadcasting over the internet. Who cares what happened in the past, when you are trying to monitor the present. You don't want to end up being 30 seconds behind reality, just because you want to show all frames to the person monitoring the camera. It is a bit different with the storage of the camera recordings. You may not want to lose a single frame when recording the images from the camera to disk. You may rather want a little delay, than not have those frames to go back and examine, if something important occurs.
Sending Data via a DatagramSocket
To send data via Java's DatagramSocket you must first create a DatagramPacket. Here is how that is done:
byte[] buffer = new byte[65508];
InetAddress address = InetAddress.getByName("jenkov.com"); DatagramPacket packet = new DatagramPacket(
buffer, buffer.length, address, 9000);
The byte buffer (the byte array) is the data that is to be sent in the UDP datagram. The length of the above buffer, 65508 bytes, is the maximum amount of data you can send in a single UDP packet.
The length given to the DatagramPacket constructor is the length of the data in the buffer to send. All data in the buffer after that amount of data is ignored.
The InetAddress instance contains the address of the node (e.g. server) to send the UDP packet to. TheInetAddress class represents an IP address (Internet Address). The getByName() method returns an InetAddressinstance with the IP address matching the given host name.
The port parameter is the UDP port the server to receiver the data is listeing on. UDP and TCP ports are not the same. A computer can have different processes listening on e.g. port 80 in UDP and in TCP at the same time.
To send the DatagramPacket you must create a DatagramSocket targeted at sending data. Here is how that is done:
DatagramSocket datagramSocket = new DatagramSocket();
To send data you call the send() method, like this:
datagramSocket.send(packet);
Here is a full example:
DatagramSocket datagramSocket = new DatagramSocket(); byte[] buffer = "0123456789".getBytes();
InetAddress receiverAddress = InetAddress.getLocalHost(); DatagramPacket packet = new DatagramPacket(
buffer, buffer.length, receiverAddress, 80);
datagramSocket.send(packet);
Receiving Data via a DatagramSocket
Receiving data via a DatagramSocket is done by first creating a DatagramPacket and then receiving data into it via the DatagramSocket's receive() method. Here is an example:
DatagramSocket datagramSocket = new DatagramSocket(80); byte[] buffer = new byte[10];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length); datagramSocket.receive(packet);
Notice how the DatagramSocket is instantiated with the parameter value 80 passed to its constructor. This parameter is the UDP port the DatagramSocket is to receive UDP packets on. As mentioned earlier, TCP and UDP ports are not the same, and thus do not overlap. You can have two different processes listening on both TCP and UDP port 80, without any conflict.
Second, a byte buffer and a DatagramPacket is created. Notice how the DatagramPacket has no information about the node to send data to, as it does when creating a DatagramPacket for sending data. This is because we are going to use the DatagramPacket for receiving data, not sending it. Thus no destination address is needed.
Finally the DatagramSocket's receive() method is called. This method blocks until a DatagramPacket is received.
The data received is located in the DatagramPacket's byte buffer. This buffer can be obtained by calling:
byte[] buffer = packet.getData();
How much data was received in the buffer is up to you to find out. The protocol you are using should specify either how much data is sent per UDP packet, or specify an end-of-data marker you can look for instead.
A real server program would probably call the receive() method in a loop, and pass all receivedDatagramPacket's to a pool of worker threads, just like a TCP server does with incoming connections (seeJava Multithreaded Servers for more details).
Java Networking: UDP DatagramSocket (翻译)的更多相关文章
- java之UDP(datagramsocket,datagramPacket)实例
import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import ...
- Java实现UDP之Echo客户端和服务端
Java实现UDP之Echo客户端和服务端 代码内容 采用UDP协议编写服务器端代码(端口任意) 编写客户机的代码访问该端口 客户机按行输入 服务器将收到的字符流和接收到的时间输出在服务器consol ...
- Java TCP/UDP网络通信编程
本文转自:http://www.cnblogs.com/cdtarena/archive/2013/04/10/3012282.html 网络应用中基本上都是TCP(Transmission Cont ...
- (Java学习笔记) Java Networking (Java 网络)
Java Networking (Java 网络) 1. 网络通信协议 Network Communication Protocols Network Protocol is a set of rul ...
- Java使用UDP发送数据到InfluxDB
最近在做压测引擎相关的开发,需要将聚合数据发送到InfluxDB保存以便实时分析和控制QPS. 下面介绍对InfluxDB的使用. 什么是InfluxDB InfluxDB是一款用Go语言编写的开源分 ...
- Java Socket UDP编程
package com; import java.io.IOException; import java.net.*; /** * UDP Client * * Created by Administ ...
- netty的Udp单播、组播、广播实例+Java的Udp单播、组播、广播实例
网络上缺乏netty的udp的单播.组播案例,经过一番学习总结之后终于把这两个案例调通,下面把这两个案例的代码放在这里分享一下. 首先推荐博文: http://colobu.com/2014/10/2 ...
- PL/SQL 调用JAVA使用UDP发送数据
步骤如下 1.直接在SQL命令中写入JAVA代码(用SYS帐号执行,不然权限等太麻烦) create or replace and resolve java source named udp as i ...
- Java垃圾回收手册翻译 - 什么是垃圾回收
Java垃圾回收手册翻译 - 什么是垃圾回收 初看之下,垃圾回收应该要做其名称之事 - 找到和丢掉垃圾.然而事实上它正好做着相反的事,垃圾回收会记录所有仍在使用中的对象,然后将其他标记为垃圾.谨记这点 ...
随机推荐
- Golang 代码检查工具
需要先安装 gometalinter工具 #!/bin/bash #should install #go get github.com/alecthomas/gometalinter #gometal ...
- HTML5 移动端的上下左右滑动问题
在移动端页面上,如果要实现[顶部轮播,手指触摸左右滑动]我的方案是,通过监听滑动,阻止默认事件来完成 div.addEventListener('touchmove',function(event){ ...
- poj3087 Shuffle'm Up(模拟)
Shuffle'm Up Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10766 Accepted: 4976 Des ...
- Navicat导入sql server数据库
1.新建连接 2. EXEC sp_attach_db @dbname = 'demo', (数据库的名字) @filename1 = 'G:\C#\超市管理系统\DB\CSGL.mdf', @f ...
- python学习之旅(四)
Python基础知识(3):基本数据类型之数字 一.基本数据类型 数字Number.字符串String.列表List.元组Tuple.集合Set.字典Dictionary 二.数字 Python3支持 ...
- PAT1018 Public Bike Management【dfs】【最短路】
题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805489282433024 题意: 给定一个图,一个目的地和每个节 ...
- 洛谷试炼场 - 关卡2-1 - 简单的模拟 - (Done)
最近这段时间感冒外加一些乱七八糟的事情,导致脑子严重僵化……只好刷刷基础(水)题巩固巩固基础(混混题数). 目录 P1003 铺地毯 P1067 多项式输出 P1540 机器翻译 P1056 排座椅 ...
- SQL Server 索引自动组织维护
公司的一个产品中的数据库,几个热点表因为主键和索引设计不合理,造成索引碎片过大,影响性能. 我尝试新建了一个索引碎片整理的定时任务,用于维护索引锁片和统计信息. 具体的过程如下: 本文原创,转发请表明 ...
- 【摘】Fiddler工具使用介绍
摘自:https://www.cnblogs.com/miantest/p/7289694.html Fiddler基础知识 Fiddler是强大的抓包工具,它的原理是以web代理服务器的形式进行工作 ...
- 目标检测(五)YOLOv1—You Only Look Once:Unified,Real-Time Object Detection
之前的目标检测算法大都采用proposals+classifier的做法(proposal提供位置信息,分类器提供类别信息),虽然精度很高,但是速度比较慢,也可能无法进行end-to-end训练.而该 ...