使用通信层在客户端和服务器之间进行通信 - java

这是我的问题,比我以前的帖子更详细。
我正在遵循一个规范,该规范说我必须编写Comms类来进行客户端和服务器之间的通信:

编写一个Comms类,该类将处理服务器应用程序和客户端应用程序之间的通信。提供一种“ sendMessage”方法,该方法允许每个客户端将消息对象发送到服务器,并且服务器将消息发送到特定客户端。应用程序还需要通过调用Comms类的“ receiveMessage”方法来检查传入的消息。这些类型可能会有所不同,具体取决于要发送/接收的消息的类型。
为了进行此分配,您可以假定服务器和客户端应用程序在同一台计算机上运行(但在单独的JVM中)。
[...]所有I / O操作必须驻留在Comms类中。仅通过上面的发送/接收方法允许访问它们。

我当前的Comms类如下:https://ghostbin.com/paste/jnar2
Server类相当大,但我只在其中包含构造函数和示例方法,客户端以及它使用的某些数据结构都必须调用它:https://ghostbin.com/paste/tsqhc
最后,Client类中没有太多注释,也许除了其构造函数之外:https://ghostbin.com/paste/cvdvx
我不知道从哪里开始-我想我打算从Client内部调用Server的方法,以某种方式使用Comms类作为两者之间的一个层。但是我不知道该怎么办

参考方案

这是我认为Comm类的外观的大致模板。注意:在这里,我使用的是“纯”字符串,而不是消息对象。对于对象,您可以改用包裹在套接字周围的ObjectInputStream / ObjectOutputStream。

public class Comm {
    private BufferedReader in;
    private PrintWriter out;

    public Comm(Socket sock) throws IOException {
        this.in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
        this.out = new PrintWriter(sock.getOutputStream());
    }

    public void sendMessage(String message) {
        out.println(message);
        out.flush()
    }

    //This is blocking until line is received from socket.
    public String recieveMessage() {
        return in.readLine();
    }
}

此实现的关键思想是Comm类中没有仅服务器或仅客户端的组件,因此客户端/服务器都可以使用此类。在客户端,您将通过地址/端口启动套接字,而在服务器端通过ServerSocket监听启动套接字。

客户端:

public class Client {

    private Comm clientIO;
    private Socket sock;

    public Client(String addr, int port) throws UnknownHostException, IOException {
        sock = new Socket(addr, port);
        clientIO = new Comm(sock);
    }

    public static void main(String[] args) throws UnknownHostException, IOException {
        Client c = new Client("localhost", 15000);
        c.clientIO.sendMessage("getDishes()");
        String returned = c.clientIO.recieveMessage();
        System.out.println(returned);
        c.sock.close();
    }

}

服务器端:

public class Server {

    private Comm serverIO;
    private ServerSocket serverSock;

    public Server(int port) throws IOException {
        serverSock = new ServerSocket(port);
    }

    public static void main(String[] args) throws UnknownHostException, IOException {   
        Server s = new Server(15000);
        Socket sock = s.serverSock.accept();
        s.serverIO = new Comm(sock);
        String command = s.serverIO.recieveMessage();
        if (command.equals("getDishes()")) {
            s.serverIO.sendMessage("Correct command");
        } else {
            s.serverIO.sendMessage("Unknown command");
        }
        sock.close();
        s.serverSock.close();
    }
}

JAVA:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java:BigInteger,如何通过OutputStream编写它 - java

我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…

Java DefaultSslContextFactory密钥库动态更新 - java

我有一个使用org.restlet.engine.ssl.DefaultSslContextFactory的现有应用程序和一个在服务器启动时加载的密钥库文件。我有另一个应用程序,该应用程序创建必须添加的证书服务器运行时动态地更新到密钥库文件。为此,我在代码中创建了证书和私钥,然后将其写入到目录。该目录由bash脚本监视,该脚本检查是否有新文件,如果出现,它将…

Java-如何将此字符串转换为日期? - java

我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…