[英]What happens if I just send to UDP socket and dont recive
我有一個 UDP 客戶端的最小實現:
final class UdpClient {
private final DatagramSocket socket;
private final InetAddress address;
private final Integer port;
UdpClient(URI location) {
port = location.getPort();
try {
socket = new DatagramSocket();
address = InetAddress.getByName(location.getHost());
} catch (SocketException | UnknownHostException e) {
throw new RuntimeException("Error setting up UDP connection", e);
}
}
void sendData(String msg) {
byte[] buf = msg.getBytes();
DatagramPacket packet
= new DatagramPacket(buf, buf.length, address, port);
try {
socket.send(packet);
} catch (IOException e) {
LOG.warn("Failed to send data {}", e.getMessage());
}
}
public void close() {
socket.close();
}
}
現在我開始質疑這是否是一個有效的實現,因為我從未收到回復。 我不關心回復會有什么后果? 在沒有明確得到答復的情況下,這甚至是一個有效的實現嗎?
我提出問題的原因是我擔心如果我從不進行顯式接收,可能會有一些潛在的緩沖區正在填滿。 此客戶端可用於發送回復的服務器或未發送回復的服務器。
現在我開始質疑這是否是一個有效的實現,因為我從未收到回復。
這是一個有效的實現。
我不關心回復會有什么后果?
唯一真正的后果是客戶端將無法判斷它正在發送數據包的服務器是否正在接收它們。
這對你來說可能是可以接受的。
在沒有明確得到答復的情況下,這甚至是一個有效的實現嗎?
從 Java 和 UDP 規范的角度來看,它是有效的。
這是否有意義......我們無法判斷......因為你沒有解釋你為什么要這樣做。
我提出問題的原因是我擔心如果我從不進行顯式接收,可能會有一些潛在的緩沖區正在填滿。
沒有......你的意思。 可能有一個出站包緩沖區,它可能會溢出,但這只會發生在某些類型的網絡鏈接上,不會因為沒有收到回復而觸發。 (如果鏈接很慢並且不能足夠快地發送數據,可能會發生這種情況。但如果發生這種情況,客戶端的操作系統應該悄悄地將數據包從緩沖區中刪除。您的應用程序不會知道正在發生的事情。)
但是,您的實施存在一些有問題的方面:
問題#1
address = InetAddress.getByName(location.getHost());
您忽略了 URI 的“協議”。 因此,例如,如果 URI 是托管“http”服務的資源,您最終會在(通常)端口 80 上向主機發送 UDP 數據包。但 Web 服務器不會在端口 80 上偵聽 UDP 數據包。您發送的數據包可能會被忽略。
問題#2
throw new RuntimeException("Error setting up UDP connection", e);
UDP 是無連接的,因此您無需建立連接。 此外,此時實際上沒有數據包被發送到遠程主機。 您實際所做的唯一一件事就是嘗試將遠程服務器的 DNS 名稱解析為 IP 地址。
問題 #3
LOG.warn("Failed to send data {}", e.getMessage());
確實,您到了無法發送數據包的地步。 但是,如果您沒有收到此異常,則您唯一知道的是您已導致數據包開始其旅程。 你不知道數據包是否已經離開了客戶端機器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.