如何识别网络应用程序(Java)的多个命令

如何识别网络应用程序(Java)的多个命令,java,sockets,networking,chat,protocols,Java,Sockets,Networking,Chat,Protocols,我想为一些实践构建一个客户机-服务器应用程序。我以一个简单的聊天开始,这并不难做到。我还可以通过简单地拆分字符串来识别不同的命令,例如“command:msg”。但我认为这可能有点不方便。所以我想知道是否有更好的方法来实现这一点。我在那边绊倒了: 最后它说: 然而,另一种更优雅的解决方案是在一组流类后面抽象协议。头构造和插入的细节可以由流类自动处理,然后客户机将保留与以前大致相同的接口:客户机将消息写入流,但不是刷新流,而是调用附加适当头并发送封装消息的方法 我真的不知道那是什么意思。有人能解释

我想为一些实践构建一个客户机-服务器应用程序。我以一个简单的聊天开始,这并不难做到。我还可以通过简单地拆分字符串来识别不同的命令,例如“command:msg”。但我认为这可能有点不方便。所以我想知道是否有更好的方法来实现这一点。我在那边绊倒了: 最后它说:

然而,另一种更优雅的解决方案是在一组流类后面抽象协议。头构造和插入的细节可以由流类自动处理,然后客户机将保留与以前大致相同的接口:客户机将消息写入流,但不是刷新流,而是调用附加适当头并发送封装消息的方法


我真的不知道那是什么意思。有人能解释一下吗,或者更好,给我一个代码示例。也许还有其他的方法吗?

下面是一个相当成功的聊天网络用于协议的方法

下面是使用IRC协议实现的命令列表


您可以将这些命令实现为一组流类。用户发出一个命令,您的stream类处理标头构造和插入流的细节。

假设您希望发送封装为所发送链接的消息:

|ID | len |消息内容|

“在一组流类后面抽象协议”的意思是创建扩展流类的类,这些流类将为您在封装的消息上添加正确的ID和长度

例如,对于发送两种消息的扩展PrintWriter:

ID 1-正常消息

ID 2-错误消息

class MyProtocolPrintWriter extends PrintWriter {

    public static final int NORMAL_MESSAGE = 1;
    public static final int ERROR_MESSAGE = 2;

    //put the constructor

    public void writeMessage(String message) {
        println(
            String.format(
            "%02x%02d%s", NORMAL_MESSAGE, message.length(), message));
    }

    public void writeErrorMessage(String message) {
        println(
            String.format(
            "%02x%02d%s", ERROR_MESSAGE, message.length(), message));
    }

}

哦,现在我明白了。但我仍然必须在服务器端拆分字符串,以查看它是错误消息还是正常消息。但既然没有分隔符,怎么能做到呢?我查了一下,找到了MessageFormat。它包含一个解析器。您认为这样做更好吗?您可以在字符串中添加分隔符,或者使这些标题字段的大小固定(如示例中所示,2个字符表示十六进制)。在MessageFormat javadoc中,parse()方法存在许多缺陷。对于像示例这样的简单命令,编写代码来解析并不困难。好的,我将看看我将做什么。我想我会写一个小解析器。感谢您的帮助:]