【问题标题】:UDP programming in JavaJava中的UDP编程
【发布时间】:2012-03-19 07:19:55
【问题描述】:

我应该使用 UDP 创建自己的“可靠传输协议”并用 java 编写。然而,为了使它成为一个更有条理的实现,我希望通过扩展创建我自己版本的 DatagramPacket 类,添加一些字节头以在从远程主机接收时读取,并传递这种新型数据包并传递这种新类型的数据包。通过类型转换的常规 DatagramSocket,或者也可以扩展 DatagramSocket 类以实现更多方法。原来 DatagramPacket 类是最终的,我太固执了,不能放弃我的想法。任何人都知道解决此问题的任何方法来实现发送这种自定义数据包类型的能力?提前致谢!

【问题讨论】:

    标签: java network-programming udp


    【解决方案1】:

    提供替代行为的子类化是一种方法,但正如您所注意到的,它并不总是可行的。你能想出一个基于composition rather than inheritance的解决方案吗?

    看看你是否可以通过将你的类 have-a DatagramPacket 作为成员变量来使其工作,通过将你的类的方法包装在 DatagramPacket 周围来增强它的行为。

    听起来您最终仍想发送 DatagramPackets,但除了 DatagramSocket 已经做的事情之外,还要进行一些特殊处理。这是我想到的一个设计(我相信还有很多其他的):

    class JayPacket {
    
        private byte[] payload; // Payload without any flow control bytes
    
        // Other flow control magic
    
        public DatagramPacket asDatagramPacket() {
            // Package this instance's payload plus your flow control bytes 
            // into a DatagramPacket
        }
    
        public static JayPacket fromDatagramPacket(DatagramPacket datagramPacket) {
            // Parse the control bytes out of the given DatagramPacket 
            // and construct a JayPacket
        }
    }
    

    然后另一个类将围绕DatagramSocket 管理JayPacket <--> DatagramPacket 转换。

    【讨论】:

    • 一开始我认为这会起作用,但我认为不会。 DatagramSocket 类的方法 'send' 只接受一个 DatagramPacket 作为参数。我开始认为在有效负载中包含字符并在收到数据时解析数据可能更容易。想到任何优点/缺点?
    • 我在我的设计中添加了一个示例,看看它是否有帮助!
    • 啊,我明白你的意思了。我认为这两种方法的工作量可能相同。我会玩弄它。非常感谢!
    • @JayElrod,严格来说,如果您的NewDatagramSocket.send 不像DatagramSocket 那样接受“传统”DatagramPacket,那么NewDatagramSocket 不是 @ 987654332@。只需创建自己的“套接字”类。 :)
    • @wks,如何创建一个以相同方式发送数据包的套接字类?我需要这个协议至少类似于 UDP,没有任何已建立的连接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 2014-08-16
    相关资源
    最近更新 更多