不使用Socket类创建网络数据包

时间:2014-01-02 21:38:37

标签: java sockets networking packets

我正在尝试对发送方IP地址,目标IP地址,发送方端口,目标端口和有效负载数据组合在一起的网络数据包进行编码/解码。

我一直在阅读不同的方法,并且无处不在建议使用Socket类 - 但是,我们不能在我们的程序中使用这样的真实网络类,因为它只是一个没有实际的模拟应用程序网络组件。

我对如何使用DatagramPacketDatagramSocket等类创建网络数据包感到困惑。有效负载数据为byte[]形式,IP地址为InetAddress。我假设我可能必须使用某种ByteArrayOutputStream将所有这些元素组合成一个byte[]类型的网络数据包。

对于我如何做到这一点的任何建议都将非常感激。

3 个答案:

答案 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。它对网络没有任何作用。

但在我看来,你应该在这里推广自己的数据包类。