所以这是我们提出的问题:
为简单的客户端/服务器应用程序提供以下应用程序层网络协议。
客户端可以向服务器发送令牌(单词),将其添加到内存中的全局令牌列表中。令牌列表具有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请求,我真的不知道如何让它们正常工作。
非常感谢任何帮助。
答案 0 :(得分:1)
我觉得这是因为每次客户端要求提供服务时都会声明一个新的ArrayList
。您致电run
,致电Request
,每次都宣布新的ArrayList
。
PS:更改Request
方法的名称,应以小写字母开头:request()