单一实例客户端连接器



图片表明您有一个聊天程序,您希望在其中向服务器发送和接收数据。 将客户端连接转换为单例是否明智?或者这会破坏数据流。

我的客户端单例示例:

public class Client {
    private static Client client;
    private final int portNumber = 7070;
    private Socket socket;
    private Client(){
        connect();
    }
    public static synchronized Client getClient(){
        if (client == null) {
            client = new Client();
        }
        return client;
    }
    public void connect(){
        try {
            InetAddress adr = InetAddress.getByName("localhost");
            socket = new Socket(adr, portNumber);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

您的代码有两个问题:

  • 单例非常不灵活。如果要在将来实现负载平衡或连接池,则束手无策。只允许一个连接。那么重新连接呢?你如何摆脱旧连接并创建一个新连接?

  • 在构造函数内部连接(或任何有副作用的操作)不是一个好的做法。想象一下对此类进行单元测试

所以我不建议单例连接对象。而是使用Client connect()方法创建一个ClientConnections管理器类。此管理器类跟踪所有打开的连接,可以缓存它们,关闭未使用的连接,定期测试等。 ClientConnections是单例的更好候选者。

如果不希望每个客户端有多个连接,则使用单一实例客户端是有意义的。在大多数情况下,这应该没问题,除非您希望支持同时发送多个文件。

相关内容

最新更新