这是我的问题,比我以前的帖子更详细。
我正在遵循一个规范,该规范说我必须编写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类作为两者之间的一个层。但是我不知道该怎么办
答案 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();
}
}