0

首先,为了让问题更容易理解,我对 Java 网络有一个相当了解,但是到目前为止我所做的所有网络都是发送命令-> 等待响应-> 重复. 最近我在业余时间尝试了一些有点不同的东西。我想连接到 Mud,我使用标准的泥客户端。但是,我开始思考并决定我是否可以创建一个服务器,然后连接到泥浆(所以,我会使用我的客户端连接到中间服务器,然后它会正确连接到泥浆) . 大多数情况下,这只是为了看看我一开始是否可以(我和几个朋友想建立游戏外聊天等),但我遇到了一些问题,现在想解决它们以供将来参考,因为它们看起来很公平重要的。

到目前为止,我设置了一个 ServerSocket,接受一个客户端连接,生成 BufferedReaders/PrintWriters 来保存输入和输出流(在每个新连接的线程内)。然后我在该客户端线程内生成第二个线程以连接到泥,然后不断循环读取行并将它们输出到客户端线程的输出流。客户端线程循环等待命令输入,并对其进行处理。

我不确定这种方法是否合适(正如我所提到的,我从未做过必须同时处理输入和输出的 Socket 编程)。主要问题是输出只是在几行后停止。服务器很好地连接到泥浆,它打印了大约 12 行左右的登录屏幕(我可以澄清这个数字,如果它很重要,双行间距使它有问题)。我环顾四周,在其他问题中提到需要发送字节序列(telnet 协商?我不熟悉该术语)以避免类似问题,但我找不到有关该问题的具体信息。

我相当确定这是我不知道的技术性问题,但是如果有人可以向我指出一些资源或提供通用解决方案等,那就太好了。

4

1 回答 1

0

如果我理解正确,您正在使用标准的 MUD 客户端通过您编写的中介/代理服务器连接到 MUD。

再次确保我在同一页面上:与您的代理的每个连接都会产生两个线程:一个收集客户端发送的字节并将它们转发到 MUD,另一个收集 MUD 发送的字节并转发它们给客户。

你的问题:

您的客户端只能从 MUD 中看到有限数量的字节。

理论:

您的 Telnet 协商理论是一个不错的理论。您需要在客户端和 MUD 之间发送不受干扰的八位字节,但 PrintWriter 旨在仅发送句柄编码的文本流。这可能会扰乱通过您的代理来回传输的一些非 ASCII 字节。

因为我最近一直在做类似的事情,所以我也想排除发生缓冲区溢出的可能性。如果您的每个代理线程都处于紧密的读写循环中,则不太可能,但我看到的情况与您完全相同,因为我定期轮询并写入太小而无法处理负载的缓冲区。

于 2017-12-10T02:23:58.143 回答