【问题标题】:Help with proper design for generic Socket Server帮助设计通用 Socket 服务器
【发布时间】:2010-07-16 01:04:38
【问题描述】:

我在 java 中创建了一个通用的“SocketServer”类,它采用以下参数: String address, int port, Class socketProtocol, String encryptionType, int backlogSize

基本上,我希望其他开发人员能够在他们的项目中实例化这个类,并为加密、积压、地址、端口设置一些简单的选项......此时他们必须设计协议。 SocketProtocol 是一个启用 sendMessage 和 receiveMessage(以及其他一些)的接口。

此时,该类的用户应该只实现 SocketProtocol 并将该类(即 MySocketProto.class)传递给 SocketServer 实例,该实例将依次通过 .newInstance() 为每个传入连接实例化一个协议副本;

这有意义吗?有没有更简单的方法来建立这种类型的功能?我不喜欢将类类型传递给服务器的想法,这看起来很奇怪。

谢谢大家, 克里斯

【问题讨论】:

    标签: java oop architecture sockets


    【解决方案1】:

    在这种情况下我会使用Factory pattern。链接的 Wikipedia 示例有点冗长,但可以非常简单:

    public interface ISocketProtocolFactory {
        ISocketProtocol buildProtocol();
    }
    

    然后,您的 SocketServer 构造函数将获取一个实现 ISocketProtocolFactory 的实例,并要求它提供新的 ISocketProtocols。

    这将使您的用户在构造 ISocketProtocol 实例时更加灵活,注意拥有类参数的“讨厌”。

    【讨论】:

    • 我喜欢这个想法.. 它确实处理了类参数。那么,让我直截了当地说,ISocketProtocolFactory 实现会实例化 ISocketProtocol 的用户实现,然后返回实例化的对象吗?
    • 没错。您甚至可以为buildProtocol 添加参数,在某些情况下,用户可能会返回ISocketProtocol 的不同实现。但在大多数情况下,它只是return new MySocketProtocol()
    • 甜蜜。谢谢。听起来工厂设计模式符合要求。我对它很熟悉,但没想到在这种情况下使用它!
    【解决方案2】:

    我假设每个端口都有自己的协议。考虑到这一点,您将为端口指定它。

    我过去的做法是让实现者传入一个继承自的类:

    public Interface ProtocolInterface
    {
       public void serve(InputStream in, OutputStream out) throws IOException
    ...
    

    InputStream 和 OutputStream 是 Socket 的输入和输出

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-19
      • 1970-01-01
      • 2020-07-17
      • 2011-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多