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

时间:2019-04-25 11:01:15

标签: 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类作为两者之间的一个层。但是我不知道该怎么办

1 个答案:

答案 0 :(得分:0)

这是我认为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();
    }
}