在自定义 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 协议可能很困难:
您要么必须跟踪频道中的所有用户,要么更改JOIN
、PART
、QUIT
KICK
和NICK
上用户的客户端视图(并解析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 客户端中发送聊天的主要内容,如果未能解决你的问题,请参考以下文章