gpt4 book ai didi

java - 管理基于文本的客户端-服务器连接的最佳方式是什么?

转载 作者:行者123 更新时间:2023-11-30 09:49:38 25 4
gpt4 key购买 nike

我想编写一个基于客户端-服务器的小型文本游戏,它可以处理多个客户端连接并持续影响游戏状态。我想知道处理多个连接的最佳方法是什么,以便命令按照它们到达服务器的顺序进行处理。

理想情况下,我不打算利用多线程,至少在命令处理级别。我可以接受每个客户端都有一个单独的线程(以便在每个线程上进行阻塞 IO),只要我可以在之后的单个线程中统一处理。

由于客户端和服务器之间的唯一通信将是文本,我不确定如何最好地建立通信。如果我选择阻塞 IO,我将如何使处理排队以在单个线程中发生?

或者,如果我选择非阻塞 IO 并使用选择器查询客户端何时写入服务器,我如何在不使用设置大小的 ByteBuffer 的情况下读取未知/无限长度的字符串?非阻塞也有利于将处理保持在单个线程中,因为它可以在客户端发送新数据时从客户端连接中读取。但是,当我尝试使用 read/writeUTF 实现它时,我遇到了 IllegalBlockingModeException heh。

任何关于如何以我未提及的方式执行此操作的问题或建议的答案将不胜感激!我对客户端和服务器相当陌生,所以我不知道 java.io 还是 java.nio 最合适。

抱歉这个令人费解的问题。我想我逃跑了。

最佳答案

意见不一,但我肯定会为每个客户端使用一个线程。然后可以通过 LinkedBlockingQueue 或仅通过同步的 LinkedList 与单个处理线程进行通信。

每个客户端线程上的类似内容:

public class Client implements Runnable, ResponseOutput {

private final BufferedReader br;
private final PrintWriter pw;

public Client(Socket s) {
br = new BufferedReader(new InputStreamReader(s.getInputStream()));
pw = new PrintWriter(s.getOutputStream());
}

// defined by the ResponseOutput interface
public void sendReply(String reply) {
pw.println(reply);
}

public void run() {
try {
while (true) {
String s = br.readLine();
if (s==null)
break;
Processor.queue(new Processor.InputItem(this, s));
}
} catch (IOException ioe) {
... error handling ...
}
}
}

然后这个用于处理:

public class Processor implements Runnable {
static public class InputItem {
final ResponseOutput client;
final String command;

public InputItem(ResponseOutput client, String command) {
this.client = client;
this.command = command;
}
}

static private Processor instance;
static public void queue(InputItem item) {
instance.commandQueue.add(item);
}

private BlockingQueue<InputItem> commandQueue;

public void run() {
try {
while (true) {
InputItem item = commandQueue.take();
String reply = doStuff(item.command);
item.client.sendReply(reply);
}
} catch (InterruptedException ie) {
... error handling ....
}
}
}

InputItem 类中,您还可以包含对任何需要更新的游戏状态的引用。由于只有处理线程在更改它,因此您可以在没有任何同步的情况下执行此操作。

关于java - 管理基于文本的客户端-服务器连接的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5702161/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com