我正在编写一个客户机-服务器应用程序,但在使用命令模式时遇到了问题。在我的程序中,服务器从客户端接收字符串输入命令,在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发送与客户端的通信。有什么好的方法来制作更多步骤的命令吗?
我想你是对的。为什么你不允许命令标识符和它的参数在一行中传递呢?我在想这样的事情:
>> 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类: 当我运行服务器和客户端时,一切正常。然后,当我尝试运行另一个客户端时,它只是挂在那儿,没有提示
问题内容: 我正在编写一个Java包,该包将由另一种语言(matlab)调用。如果我的matlab进程结束,我希望Java进程继续运行。每当MATLAB重新启动时,它都应该能够与现有的运行过程进行通信。因此,我认为我需要让Java应用程序通过客户端/服务器模型中的套接字进行通信。我设想具有一组简单的功能: startServer(主机,端口) runCommand(服务器,命令…) stopSer
我想在一些计算机之间建立点对点连接,这样用户就可以在没有外部服务器的情况下聊天和交换文件。我最初的想法如下: 我在服务器上制作了一个中央服务器插座,所有应用程序都可以连接到该插座。此ServerSocket跟踪已连接的套接字(客户端),并将新连接的客户端的IP和端口提供给所有其他客户端。每个客户端都会创建一个新的ServerSocket,所有客户端都可以连接到它。 换句话说:每个客户端都有一个Se