- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这是绑定(bind)到所有 ip 接口(interface)和特定 udp 端口的简单情况:
int bindPort = 5555; // example, udp port number
DatagramSocket socket = new DatagramSocket(bindPort);
byte[] receiveData = new byte[1500];
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
...
socket.receive(receivePacket);
我如何知道我在哪个 ip 接口(interface)上收到数据包?
我可以看到有 getSocketAddress():
Gets the SocketAddress (usually IP address + port number) of the remote host that this packet is being sent to or is coming from.
但这会返回远程 ip+端口。我想知道本地 ip(本例中本地端口为 5555)。
是否有可能与标准。 Java 库?
最佳答案
我知道这个问题。为了阐明这样做的目的:您通过 UDP(通常是某种发现实现)收到一个数据包,并希望返回一个类似(“亲爱的客户,请从 http://<wtf-is-my-ip>:8080/thefile.txt
下载文件”)的回答。我的机器有三个 IP:127.0.0.1、192.168.x.x 和 10.x.x.x,目标是查明远程客户端将 UDP 数据包发送到 192.168.x.x,并且这个 IP 必须也适用于另一个连接.
来自weupnp project我发现了以下代码,它并不完美但对我有用:
private InetAddress getOutboundAddress(SocketAddress remoteAddress) throws SocketException {
DatagramSocket sock = new DatagramSocket();
// connect is needed to bind the socket and retrieve the local address
// later (it would return 0.0.0.0 otherwise)
sock.connect(remoteAddress);
final InetAddress localAddress = sock.getLocalAddress();
sock.disconnect();
sock.close();
sock = null;
return localAddress;
}
//DatagramPacket receivePacket;
socket.receive(receivePacket);
System.out.print("Local IP of this packet was: " + getOutboundAddress(receivePacket.getSocketAddress()).getHostAddress);
如果您在同一网络中有多个 IP,或者由于某些高级路由配置,代码可能会返回错误的 IP。但到目前为止,这是我能找到的最好的,并且对于大多数情况来说已经足够了。
关于Java,DatagramPacket接收,如何判断本地ip接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22045165/
我正在使用 UDP 传输实现客户端/服务器应用程序。这是我的代码的一部分: 客户端: InetAddress serverAddress = ... int serverPort = ... Data
我需要从 DatagramPacket 2 原始数据类型和字节数组中恢复; 我需要获得一个 unsigned long long 和一个 int 作为原始数据类型...当我尝试使用 System.ar
这是在回答 BufferedWriter only works the first time 时出现的 据我对 Java Doc 的理解(网上的许多帖子都证实了这一点)DatagramPacket 不
尝试将接收到的 DatagramPacket 转换为字符串,但我遇到了一个小问题。不确定最好的方法是什么。 我将要接收的数据大部分长度未知,因此我在接收端设置了一些缓冲区[1024]。问题是,假设我发
以下代码产生“找不到合适的构造函数”错误。我无法找出原因。 try { Sock = new DatagramSocket(); Inet
因此,在寻找合适的库后,我决定创建自己的库,这是其中的一部分。 try { DatagramSocket serverSocket = new DatagramSocket(client_po
在我的 Java 应用程序中,我通过 DatagramSocket 接收 DatagramPacket。我知道数据包可以包含的最大字节数,但实际上每个数据包长度都不同(不超过最大长度)。 假设 MAX
这个问题已经有答案了: Can not access object's properties(methods) from within the run method! Java Multithread
我正在创建一个 java 多人游戏,它解决了 LAN 上客户端和服务器之间不断发送 DatagramPackets 的问题。 客户端的 DatagramSocket 将随机停止从服务器接收数据包,因此
我编写了一个 Java 线程(可运行)来基本上存储 DatagramPackets 列表,如果列表的大小 > 0,它将发送列表中的第一项。 看来,除非我在 run 方法中放置大量 sleep ,否则线
我正在编写战舰游戏,以便使用 UDP 在同一网络中的两台计算机之间进行游戏。当我做出连接时,它不会引发期望,但信息只会朝着一个方向发展。我的意思是,计算机 A 正确地将坐标发送到计算机 B,但计算机
我正在使用 DatagramPacket 和 DatagramSocket 来创建客户端/服务器情况。我有一个带有简单客户端和服务器的工作项目。客户端将向服务器发送一个序列化对象,仅此而已。 下面显示
在java库中,http://download.java.net/jdk7/archive/b123/docs/api/java/net/DatagramPacket.html 我想使用此构造函数构造
这个问题在这里已经有了答案: DatagramPacket to string (6 个答案) 关闭 6 年前。 下面的代码打印 [B@40545a60,[B@40545a60abc exp 但我想
我正在构建一个基于 UDP 的应用程序来接收和发送多个数据包。 我可以为每次发送构建一个新的 DatagramPacket,或者在我的应用程序的生命周期中回收一个实例。 重用 DatagramPack
我正在实现一个客户端-服务器程序,并希望我的客户端在等待 5 秒后没有来自服务器的 ACK-Answer,发回相同的数据包... 我是这样弄的,如果可以的话请告诉我.. dp = new Datagr
问题: 假设您的传输速度高达 10 MB/s,那么回收 DatagramPacket 对象(而不是每次发送数据包时创建一个新对象)是否是一个好主意? 故事: 我正在创建一个 LAN 文件同步应用程序,
我正在制作一个 Java 桌面应用程序,我在其中录制来自麦克风的语音,并在 LAN 中实时将此语音数据发送到另一个计算机系统,反之亦然。 我可以通过麦克风录制声音并输出到系统中的扬声器。现在使用 UD
我正在使用 Datagramsocket 和 DatagramPacket 制作一个简单的 server_client 应用程序。我想做的是:一个客户端将数据发送到服务器,服务器将这些数据发送到另一个
我是整个 UDP 的新手(因为每个人都喜欢 TCP),需要问几个关于 Java 实现的问题。 我需要有人告诉我是否: Java发送的DatagramPackets由于以下原因自动分片网络配置和数据大小
我是一名优秀的程序员,十分优秀!