在自定义 IRC 客户端中发送聊天

Posted

技术标签:

【中文标题】在自定义 IRC 客户端中发送聊天【英文标题】:Sending chat in custom IRC client 【发布时间】:2013-09-20 13:12:56 【问题描述】:

我正在用 java 编写一个自定义 IRC 客户端,我可以在聊天中接收消息,但我不知道如何发送聊天消息。我查看了 IRCHelp.org,但我并不真正理解“伪 BNF 中的消息格式”部分,我相信这是我可能正在寻找的部分。

    这是我要找的部分吗?

    如果不是,我应该看哪个部分?

【问题讨论】:

【参考方案1】:

看看RFC 1459。 它也使用了伪BNF,但实际上很容易理解。

例子:

4.4.1私信

命令:PRIVMSG 参数:<receiver>,<receiver> <text to be sent>

PRIVMSG 用于在用户之间发送私人消息。 是消息接收者的昵称。也能 是用逗号分隔的名称或频道列表。

参数也可以是主机掩码 (#mask) 或服务器 掩码($掩码)。在这两种情况下,服务器只会发送 PRIVMSG 给那些拥有匹配掩码的服务器或主机的人。口罩必须 至少有 1(一)个“。”在其中并且没有通配符跟随 最后的 ”。”。存在此要求是为了防止人们发送消息 到“#”或“$”,这将广播给所有用户;从 经验,这是滥用而不是负责任和适当地使用。 通配符是 '*' 和 '?'人物。这个扩展为 PRIVMSG 命令仅对 Operator 可用。

数字回复:

      ERR_NORECIPIENT                 ERR_NOTEXTTOSEND
      ERR_CANNOTSENDTOCHAN            ERR_NOTOPLEVEL
      ERR_WILDTOPLEVEL                ERR_TOOMANYTARGETS
      ERR_NOSUCHNICK
      RPL_AWAY

例子:

:Angel PRIVMSG Wiz :Hello are you receiving this message ?

;Angel 给 Wiz 的消息。

PRIVMSG Angel :yes I'm receiving it !receiving it !

给天使的消息。

PRIVMSG jto@tolsun.oulu.fi :Hello !

向服务器上的客户端发送消息

请注意,实现 IRC 协议可能很困难:

您要么必须跟踪频道中的所有用户,要么更改JOINPARTQUITKICKNICK 上用户的客户端视图(并解析NAMES回复您的加入,或者每次您需要该频道中 NAMES 的用户列表时询问服务器。对于客户端(显示用户列表),您必须跟踪它。 IRC 颜色:有人说这是在客户端 (mIRC) 中实施过的最糟糕的想法,但它们存在并且大多数客户都支持它们。如果您不这样做,请剥离它们(它们以 \x02\x03 开头) CTCP 支持 CTCP 很重要: 有些服务器要求在连接时回复VERSION,有些服务器甚至不允许没有客户端的客户端。 ACTION ctcps 很常见,用于 /me 命令。 DCC ctcps 很常见,用于文件传输、建立直接聊天连接和发送加密消息。 为用户提供一种注入常用命令的方法。大多数客户端支持使用/raw/quote,有些甚至将所有未知命令发送到服务器。 提供/kick/op...的常用别名...

【讨论】:

【参考方案2】:

我不知道您是在请求 IRC RFC/协议帮助还是实际代码,因为您没有提供任何当前代码。当您建立到服务器的读取流时,将所有内容输出到您的控制台。有很多事情要处理,但这样做会非常清楚协议的工作原理。至于协议中的一些代码:

BufferedWriter writer = new BufferedWriter(new InputStreamReader(socket.getInputStream());

writer.writeLine("PRIVMSG <destination> :<message>\r\n");
writer.flush();

显然上述需要try-catch

接收来自用户的私人消息将采用以下格式:

:<sender-nickname>!<sender-ident>@<sender-server> PRIVMSG <your-nickname> :<the-senders-message>

例子:

:StephenHero!SHPC@google.com PRIVMSG Mast3rPlan :Hello Master Plan!

许多 IRC 服务器响应命令都遵循这种语法,[换句话说]:

:SENDER COMMAND RECIPIENT :MESSAGE

【讨论】:

【参考方案3】:

我认为您最好的选择可能是使用 IRC 库。 IRC 协议相当简单,但同时也很大,编写一个完整的库实际上是相当多的工作。另一方面,由于 IRC 是基于文本的协议,因此很容易自己编写。

您为什么不看看其中之一:

JerkLib - 使用 NIO 并且是事件驱动的 Sorcix' sIRC - 非常紧凑的库,使用监听器 PircBot - 而不是写 irc 机器人 IRClib - 整齐有序的紧凑 irc 库,支持 SSL

如果您确定要自己编写实现,可以查看this。

【讨论】:

我查看了您的链接。这是针对 IRC 机器人的。我想做的是创建一个 IRC 客户端。我正在使用该代码从服务器输出,但我不确定如何发送聊天。我只是将聊天写到服务器,还是必须PRIVMSG整个频道或其他什么? @SolomonKim:你想PRIVMSG #channel :message here。 This 可能会对您有所帮助。

以上是关于在自定义 IRC 客户端中发送聊天的主要内容,如果未能解决你的问题,请参考以下文章

python irc客户端没有识别响应

最好的办公室聊天? [关闭]

C#中的IRC库[关闭]

如何在 IRC 服务器中发送消息聊天?

用于聊天窗口 irc 的 GTK 最好的小部件是啥? [关闭]

C# IRC 和 Twitch 空闲断开连接?