我有一个休息端点,我想使用UDP访问它,例如Java Datagram。我知道尝试甚至不是最好的做法,但是我最近的项目有一些硬件限制。硬件只能进行UDP调用,而我现有的服务已搁置,即http/https。
我正在寻找可以重复使用现有服务的任何方式。我尝试了关注代码,但收到了UnknownHostException
。
public class UDPClinet {
public static void main(String[] args) {
String hostname = "https://jsonplaceholder.typicode.com/posts/1";
int port = 80;
try {
InetAddress address = InetAddress.getByName(hostname);
DatagramSocket socket = new DatagramSocket();
while (true) {
DatagramPacket request = new DatagramPacket(new byte[1], 1, address, port);
socket.send(request);
byte[] buffer = new byte[512];
DatagramPacket response = new DatagramPacket(buffer, buffer.length);
socket.receive(response);
String quote = new String(buffer, 0, response.getLength());
System.out.println(quote);
System.out.println();
Thread.sleep(10000);
}
} catch (SocketTimeoutException ex) {
System.out.println("Timeout error: " + ex.getMessage());
ex.printStackTrace();
} catch (IOException ex) {
System.out.println("Client error: " + ex.getMessage());
ex.printStackTrace();
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
是否可以实现可以通过UDP调用的REST FARK。
是。(请参阅下文(
您可以通过UDP调用现有的Restful服务吗?
可能没有。当然不是没有很多工作。
实际上,使用HTTP或HTTP在TCP/IP连接上实施了典型的RESTFUL服务。不可能使用UDP直接与基于TCP的服务进行交谈。IP级数据包将具有错误的协议系列,并且该服务的操作系统不会将其路由到服务。
但是,(从技术上讲(有可能通过任何能够发送消息的运输来实施静止的服务。休息原则是运输方案的不可知论。
问题将是找到一个支持RESTFUL UDP 和(常规(RESTFUL http 同时。
的服务框架。还有其他几个实际问题:
udp不可靠,如果您发送不适合使用默认MTU(1500字节(的数据包的数据机,这将加剧。因此,如果您想通过UDP实施一个重新的服务,则需要密切关注请求和响应有效载荷的大小。
HTTPS使用TLS,以便客户端能够验证服务器的真实性,然后发送加密数据。UDP上的TLS是可能的(称为DTLS(,并由JCSE支持,但是在典型的Restful/HTTP框架中使用它可能具有挑战性。
如果您想进行此操作,请查找实现CoAP(约束应用程序协议-RFC 7252(和DTLS的重新框架。
您可能会查看可用的COAP实现,请参见COAP.TECHNOLOGY概述。尽管我是Java的CoAP/DTLS实施的Eclipse/Californium的委员会,但我建议尝试一下。
COAP还将交叉代理定义为HTTP。Google Cloud教程中有一个示例。它使用较旧的加州版本作为基础。加州本身具有更新代理exmaple(但不可用于Google Cloud的开箱即用(,请参见Californium -Proxy2。
是的,现在有一个Internet标准用于UDP上的休息,它的名称为受约束的应用程序prodocoal -coap。COAPP以RFC 7252开头的一系列互联网标准定义。
COAP解决了此问题的早期答案中提出的问题,包括使用UDP上的重传使其可靠,并使用DTLS提供安全性。
COAP已设计为在低至10 KIB RAM和100 KIB代码空间(RFC 7228(的微控制器上工作。此外,它使用4个字节的二进制固定标头和可变长度选项(例如可选的HTTP标头(