正确的方法来实现客户端服务器GUI应用程序

时间:2013-12-24 20:49:58

标签: sockets design-patterns uml

我一直在寻找实现客户端/服务器应用程序GUI的正确方法。老实说,我没有找到任何有用的信息来解决这个问题。所以我做了一个简单的设计,想要告诉你,看到你们都在说。我想知道它是否正确,如果你可以改进或其他任何东西。这是 UML 服务器端伪代码。我希望你能思考,批评和建议。抱歉打字错误。

我的UML:

UML

伪代码

Gui Main Class

这是我们实例化类管理器客户端和服务器类的主类,我们将它们作为参数,客户端管理器实例,列表框(GUI组件)和侦听端口传递。

Class GUI_Main
{
    ListBox messageList;
    Server server;
    ClientManager clientMng;

    void init()
    {
        clientMng = new ClientManager();
    }

    void startServer() 
    {
        server = new Server(messageList, clientMng, 5555)
    }

    void stopServer()
    {
        server.stopServer();
    }
}

ClientManager

此类用于管理连接到我们服务器的客户端。

Class ClientManager
{
    void addClient(Client client)
    {
        { ... }
    }

    void removeClient(int Index) 
    {
        { ... }
    }

    void sendData(String data, int clientIndex) 
    {
        { ... }
    }
}

服务器

此类用于接受新连接,还显示从客户端接收的消息并在ListBox(GUI组件)中显示它们

Class Server implements ClientEvents 
{
    ListBox messageList;
    ClientManager clientMng;

    Public Server(...)
    {
        { ... }
    }

    void listenConnections()
    {
        { ... }
        Socket tempSocket = ssocket.accept();
        Client client = new Client(self, tempSocket);
        client.start();
        clientMng.addClient(client);
        { ... }
    }

    void stopServer()
    {
        { .... }
    }

    void onReceive(Client client, String data)
    {
        messageList.add(data);
    }   
}

ClientEvents

Interface ClientEvents
{
    void onReceive(Client client, String data);
}

客户端

此类用于与客户端交互,发送/接收数据

Class Client 
{
    ClientEvents server;

    Public Client( ... )
    {
        { ... }
    }

    void ioMonitor()
    {
        { ... }
        String data = socket.readData();
        server.onReceive(socket, data);
        { ... }
    }

    void sendData(String data)
    {
        { ... }
    }
}

提前致谢。问候。

1 个答案:

答案 0 :(得分:2)

到正确的UML类图:

  • 连接GUI-Server和GUI-ClientMgr都不好。

    • 您应该使用<< i>>绘制依赖关系(斜线) (实例化)从UI到这两个。
    • 关联箭头应从UI转到这两个
    • 关联箭头应该在UI端具有聚集(黑色菱形)并且在箭头的末端具有点(黑色圆圈)。
    • 这两个关联在UI方面必须具有多重性1,如果没有UI,它们就不存在。
  • 您可以将名称服务器用于服务器而不是服务器。这非常糟糕。

  • 客户端事件未标记为接口。

  • 服务器块应该具有简单的服务器名称。

  • 连接服务器 - ClientEvents必须是泛化关系,第二面有空三角形。
  • 将ClientEvents重命名为ClientEventsNotifier或其他内容。
  • 使用<< a>>绘制从ClientMgr到客户端的依赖关系(访问)就可以了。
  • 连接服务器 - 客户端应该颠倒。

内容:

在添加客户端时,我会在ClientManager中注册客户端侦听器。并在那里取消注册。您确定,它是服务器,谁需要客户端事件?