我正在尝试对发送方IP地址,目标IP地址,发送方端口,目标端口和有效负载数据组合在一起的网络数据包进行编码/解码。
我一直在阅读不同的方法,并且无处不在建议使用Socket
类 - 但是,我们不能在我们的程序中使用这样的真实网络类,因为它只是一个没有实际的模拟应用程序网络组件。
我对如何使用DatagramPacket
或DatagramSocket
等类创建网络数据包感到困惑。有效负载数据为byte[]
形式,IP地址为InetAddress
。我假设我可能必须使用某种ByteArrayOutputStream
将所有这些元素组合成一个byte[]
类型的网络数据包。
对于我如何做到这一点的任何建议都将非常感激。
答案 0 :(得分:0)
您的用例令人困惑。您正在创建联网应用程序,但您永远不会将您的应用程序放在网络上?这对我来说毫无意义。
在Java中,SocketFactory创建套接字(http://docs.oracle.com/javase/7/docs/api/javax/net/SocketFactory.html)。您可以实现自己的SocketFactory来生成Socket的自定义子类,以创建所需的所有非网络Socket项。但是,如果没有实际的网络层,我不知道如何让这些非网络套接字进行通信,以便您可以测试诸如“服务器是否收到我发送的数据包”之类的内容。
此外,我认为你不需要一个真正的网络来做Socket的东西。 localhost loopback就是为了这个目的。
我想我只是对你的问题感到困惑。
答案 1 :(得分:0)
我认为您只想创建/编辑字节[]或读取字节[]
因为数据报包只不过是byte [] !!!
您可能会想到以下方法:
byte[] package; //it sould be at least 20 byte and conform to TCP/IP IPv4
public static byte[] getSourceIp(byte[] package){
byte[] sourceIp = new byte[4];
//System.arraycopy(package, 96, sourceIp, 4); //way shorter
for (int i = 0; i < 4; i ++){
sourceIp [i] = package[i+12]; //12=offset for source ip @ipv4
}
return sourceIp;
}
public static void setSourceIp(byte[] sourceIp , byte[] package){
for (int i = 0; i < 4; i ++){
package[i+12] = sourceIp[i]; //12=offset for source ip @ipv4
}
}
让我们断言你byte []包符合TCP / IP IPv4协议,并且至少160位(20byte)长... http://en.wikipedia.org/wiki/IPv4
答案 2 :(得分:-1)
您可以使用DatagramPacket。它对网络没有任何作用。
但在我看来,你应该在这里推广自己的数据包类。