簡體   English   中英

Java服務器/客戶端故障

[英]Java Server / Client Trouble

所以這是我們得到的問題:

為簡單的客戶端/服務器應用程序提供了以下應用程序層網絡協議。

客戶端可以將令牌(單詞)發送到服務器,服務器將它們添加到內存中的全局令牌列表中。 令牌列表可容納10個不同的令牌。 標記應以降序(反向)詞典順序存儲在標記列表中。 共有三種類型的請求:提交,刪除和退出。

協議詳細:

  • 客戶端請求(從客戶端發送到服務器的消息):提交令牌服務器:如果令牌列表尚未滿,請將令牌添加到全局令牌列表中(如果該列表尚不包含該令牌)或忽略它(如果相應的令牌已在列表中)。 在兩種情況下,都通過向客戶端發送OK消息來響應。 如果列表已經滿了(包含10個令牌),則用消息ERROR響應客戶端。 token代表不包含空格的字符串,請參見類Scanner(Java API)。 標記列表應隨時按字典順序降序排列。 選擇一個合適的數據結構來表示令牌列表。
  • 客戶端請求:REMOVE令牌服務器:如果令牌列表中包含令牌,請從令牌列表中將其刪除,然后使用消息OK答復客戶端。 否則,以錯誤答復。
  • 客戶端請求:QUIT Server:終止與該客戶端的連接。 沒有反應。

Q1。 為服務器創建一個(非企業,非servlet)Java類,該類可以根據給定協議通過Internet與客戶端進行交互。 在此,不支持對客戶端的並發處理,而僅支持與客戶端的順序處理(即,僅在與客戶端的連接結束后,新客戶端才能連接到服務器,依此類推)。 服務器應該僅維護一個全局令牌列表,除非通過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 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請求,我真的不知道如何使它們正常工作。

任何幫助將非常感激。

在我看來,這是因為您每次客戶端請求服務時都聲明一個新的ArrayList 您調用run ,然后調用Request ,每次都聲明一個新的ArrayList

PS:更改Request方法的名稱,應以小寫字母開頭: request()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM