【问题标题】:Receiving data from a mud with sockets - telnet negotiation?从带有套接字的泥浆中接收数据 - telnet 协商?
【发布时间】:2017-12-10 10:47:03
【问题描述】:

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

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

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

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

【问题讨论】:

  • 一些代码片段将有助于尝试查看您的问题。登录屏幕是否正常超过 12 行,而您的服务器只有 12 行?
  • 您应该查找 telnet 协议 (RFC854)。大多数泥浆和泥浆客户端都实现了它(有些比其他更好)。可能是您缺乏谈判导致问题,但正如 patheros 指出的那样,我们需要更多信息。
  • 您应该使用Input/OutputStreams,而不是ReadersWriters。 Telnet 协议包含二进制数据,Reader 会破坏它。

标签: java mud


【解决方案1】:

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

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

你的问题:

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

理论:

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

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

【讨论】:

    猜你喜欢
    • 2020-03-13
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 2021-12-16
    • 2023-03-11
    • 2012-06-13
    • 2016-08-04
    相关资源
    最近更新 更多