Java服务器/客户端麻烦

时间:2015-03-24 16:35:15

标签: java arraylist

所以这是我们提出的问题:

  

为简单的客户端/服务器应用程序提供以下应用程序层网络协议。

     

客户端可以向服务器发送令牌(单词),将其添加到内存中的全局令牌列表中。令牌列表具有10个不同令牌的容量。令牌应按降序(反向)字典顺序存储在令牌列表中。   有三种类型的请求:SUBMIT,REMOVE和   QUIT。

     

协议详情:

     
      
  • 客户端请求(从客户端发送到服务器的消息):SUBMIT令牌   服务器:如果令牌列表尚未填满,请将令牌添加到全局令牌列表中(如果列表不   包含该令牌)或忽略它(如果相应的令牌已经在列表中)。在这两种情况下,   通过向客户端发送消息OK来响应。如果列表已满(包含10个令牌),请回复   消息ERROR给客户端。   token代表不包含空格的字符串,请参阅类Scanner(Java API)。   标记列表应随时按字典顺序排序。选择一个   用于表示令牌列表的适当数据结构。
  •   
  • 客户请求:删除令牌   服务器:如果令牌列表包含令牌,请将其从令牌列表中删除并回复客户端   消息确定。否则,回复ERROR。
  •   
  • 客户请求:退出   服务器:结束与该客户端的连接。没有回应。
  •   
     

Q1。为服务器创建一个(非企业级,非servlet-)Java类,该服务器可以通过客户端与客户端进行交互   互联网符合给定的协议。   这里不支持客户端的并发处理,只是顺序处理客户端(即,   只有在与客户端的连接结束后,新客户端才能连接到服务器,依此类推)。   服务器应该只维护一个永远不会被服务器清空的全局令牌列表   除非通过REMOVE请求(即,不是每个连接客户端的新空标记列表)。

到目前为止,这是我的尝试:

公共类服务器{

private Socket s;
private Scanner in;
private PrintWriter out;

public static void main(String[] args) throws IOException {
    ServerSocket server = new ServerSocket(6789);
    Server serverInstance = new Server();
    System.out.println("Server running. Waiting for a client to connect...");
    while(true) {
        serverInstance.s = server.accept();
        System.out.println("Client connected");
        serverInstance.run();
        System.out.println("Client disconnected. Waiting for a new client to connect...");
    }
}

public void run() {
    try {
        try {
            in = new Scanner(s.getInputStream());
            out = new PrintWriter(s.getOutputStream());
            doService(); // the actual service
        } finally {
            s.close();
        }
    } catch (IOException e) {
        System.err.println(e);
    }
}
public void doService() throws IOException {
    while(true) {
        if(!in.hasNext())
            return;
        String request = in.next();
        System.out.println("Request received: " + request);
        // (...) test for type of request here (not implemented)
        Request(request);
    }
}
public void Request(String request) {
    ArrayList<String> tokens = new ArrayList<String>(10);
    String amountStr = in.next();
    if(request.startsWith("SUBMIT")) {
        if(tokens.size() <= 10){
            out.println(tokens.add(amountStr)); //server response
            System.out.println( amountStr + " added to list");
        }
        else{System.out.println("Error");
        } 
    }
    else if(request.startsWith("REMOVE")) {
    out.println(tokens.remove(amountStr)); //server response
    System.out.println(amountStr + " removed from list");
    } 
    else if(request.equals("QUIT")){
    System.err.println("Program ended");
    }

    System.out.println(tokens);
    out.flush();
    }
}

public class Client {

public static void main(String[] args) throws IOException {
     Socket s = new Socket("localhost", 6789);
     InputStream instream = s.getInputStream();
     OutputStream outstream = s.getOutputStream();
     Scanner in = new Scanner(instream);
     PrintWriter out = new PrintWriter(outstream);
     String request = "SUBMIT hello \n";
     out.print(request);
     out.flush();
     String response = in.nextLine();
     System.out.println("Token: " + response);
     s.close();
    }

}

  

输出:

     

服务器正在运行。等待客户连接...

     

客户已连接

     

收到请求:提交

     

你好添加到列表

     

[你好]

     

客户端已断开连接等待新客户连接...

     

客户已连接

     

收到请求:提交

     

你好添加到列表

     

[喜]

     

客户端已断开连接等待新客户连接...

所以我让服务器工作,客户端可以连接到它并将一个令牌提交给arraylist,但每次新客户端向列表添加一个令牌时,它只是替换旧的,而不是添加到数组中。 [hi]替换[hello]而不是成为[hello,hi]。

对于REMOVE和QUIT请求,我真的不知道如何让它们正常工作。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

我觉得这是因为每次客户端要求提供服务时都会声明一个新的ArrayList。您致电run,致电Request,每次都宣布新的ArrayList

PS:更改Request方法的名称,应以小写字母开头:request()