当前位置: 首页 > 知识库问答 >
问题:

客户端-服务器应用程序命令模式

向俊贤
2023-03-14

我正在编写一个客户机-服务器应用程序,但在使用命令模式时遇到了问题。在我的程序中,服务器从客户端接收字符串输入命令,在HashMap中为输入找到合适的命令,执行它并返回返回值。我在弄清楚如何编写需要不止一步的命令时遇到了问题(命令必须要求客户机提供额外的参数,然后应该返回最终结果)。

命令界面

public interface Command {
    public String execute();    
}

服务器与客户端的通信

 try  {
        ServerSocket serverSocket = new ServerSocket(port);
        Command c;

        while(true) {

            Socket clientSocket = serverSocket.accept();
            PrintWriter clientSocketWriter = new PrintWriter(clientSocket.getOutputStream(), true);

            BufferedReader clientSocketReader = new BufferedReader(new 
                  InputStreamReader(clientSocket.getInputStream()));

            String inputLine;

        //server recieves String command from client and sends back the result while semaphore is true
            while (Main.semaphore) {
                inputLine = clientSocketReader.readLine();
                c = CommandFactory.getCommandByName(inputLine);
                clientSocketWriter.println(c.execute());
            }

            serverSocket.close();
            clientSocketWriter.close();
            clientSocketReader.close();
            clientSocket.close();
        }

    } catch(Exception e) {
        e.printStackTrace();
    }

一步到位,毫无问题

public class CommandHelp implements Command {
    @Override
    public String execute() {
        //returns string of all commands
        return CommandFactory.getCommandByNames();
} 

我不知道如何编写一个命令,它需要一个额外的参数来执行,它不能在不知道的情况下立即返回结果。命令应该返回x元素的排列次数(客户端应该选择)。

public class CommandPermutationsCount implements Command {

    @Override
    public String execute() {
      //can't return anything yet
    }


    public long getPermutations(int elementsCount) {
         long result = 1;

         for (int factor = 2; factor <= elementsCount; factor++) {
            result *= factor;
         }
        return result;
    }

}

我有一个想法,使命令无效,而不是字符串,但这样我就不能通过clientSocketWriter发送与客户端的通信。有什么好的方法来制作更多步骤的命令吗?

共有1个答案

臧弘和
2023-03-14

我想你是对的。为什么你不允许命令标识符和它的参数在一行中传递呢?我在想这样的事情:

>> permute -a 12
>> shuffle -a [1, 2, 7, 6, 5, 3, 1]
>> add -a 4 -a 5

通过允许使用参数指定命令,您的CommandFactory将类似于:

class CommandFactory {
    public static Command parseCommand(String commandLine) {
        // Tokenize commandLine:
        // - First word is commandId
        // - Tokens following '-a' string are arguments
        // Return CommandHelp if no command with provided commandId is found
        return CommandHelp(commandLine);
    }
}

现在,您可以创建从抽象的命令继承的特定命令实现,如下所示:

abstract class Command {
    private final String commandId;
    private final String commandArguments;

    Command(String commandId, List<String> commandArguments) {
        this.commandId = commandId;
        this.commandArguments = commandArguments;
    }

    abstract String execute();
}
 类似资料:
  • 问题内容: 我正在尝试以客户端/服务器方式制作Java应用程序。客户端是SWT中的GUI,它显示来自服务器的数据。服务器已连接到数据库。 好的,对此感到抱歉,我确定这是一个经典问题,但我不知道如何开始。 在我为他们工作的一个项目中,他们实施了很多魔术来透明地调用Glassfish服务器。 我不想使用Glassfish服务器。我只想要简单的Java语言。但是代理的概念似乎很酷。 你有这种想法或例子吗

  • 我正在使用autobahn运行一个websocket服务器来补充我的Django应用程序。有时,我需要从Django向websocket服务器发送消息,该服务器使用websocket-client模块可以很好地工作。我想改用WAMP协议,因为RPC/PubSub API看起来很棒,但python客户机代码是作为扭曲的协议实现的,我不知道如何强制使用它,即像函数调用一样,而不是从某个外部事件循环中使

  • 我正在试用一个简单的示例。我能够运行服务器应用程序和客户端应用程序来彼此通信。我现在需要了解一个教程,说明两个客户机如何通过服务器相互通信。 我怎么能这么做?有人能给我指出一个好的教程或者解释如何在Java中实现这一点吗

  • 问题内容: 我正在尝试使用我一直在努力的客户端/服务器程序实现多线程。我需要允许多个客户端同时连接到服务器。我目前有4类:客户端,服务器,协议和用于处理线程的工作器。以下代码是我对这些类的拥有的代码: SocketServer类: SocketClient类别: 协议类别: ClientWorker类: 当我运行服务器和客户端时,一切正常。然后,当我尝试运行另一个客户端时,它只是挂在那儿,没有提示

  • 我想在一些计算机之间建立点对点连接,这样用户就可以在没有外部服务器的情况下聊天和交换文件。我最初的想法如下: 我在服务器上制作了一个中央服务器插座,所有应用程序都可以连接到该插座。此ServerSocket跟踪已连接的套接字(客户端),并将新连接的客户端的IP和端口提供给所有其他客户端。每个客户端都会创建一个新的ServerSocket,所有客户端都可以连接到它。 换句话说:每个客户端都有一个Se

  • 问题内容: 我正在编写一个Java包,该包将由另一种语言(matlab)调用。如果我的matlab进程结束,我希望Java进程继续运行。每当MATLAB重新启动时,它都应该能够与现有的运行过程进行通信。因此,我认为我需要让Java应用程序通过客户端/服务器模型中的套接字进行通信。我设想具有一组简单的功能: startServer(主机,端口) runCommand(服务器,命令…) stopSer