[英]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.