我正在开发一个基于Java的IRC客户端,作为学习Java和编写网络应用程序的更多方法。
我设计的客户主要工作,除非我发布消息。消息顺利通过,但仅限于第一个空格。我已经尝试了一切:我已经将我的文本转换为StringArray,转换为循环中的字节数组。但每次只发布预定消息的第一个单词。
这是我认为相关的代码部分,虽然我很乐意在必要时发布整个代码(它只有几百行,我可以删除不重要的部分):
public void send(String msg) throws UnsupportedEncodingException {
if ( ! msg.startsWith("/")) {
msg = ("PRIVMSG " + chan + " " + msg);
// DEBUG confirm that msg == command+chan+userText
System.out.println(msg);
} else if ( msg.toUpperCase().startsWith("/JOIN ")) {
// System.out.println("\nJoin mode");
chan = msg.substring(6);
msg = (msg.toUpperCase().substring(1) + "\r\n");
} else { // some other command
msg = (msg.toUpperCase().substring(1) + "\r\n");
}
System.out.println(msg);
ostream.print(msg + " \r\n"); // doesn't work
ostream.flush();
}
}
我也试过这样的事情:
CRS = msg.split("\\s+");
CharSequence chars = msg;
ostream.printf( "%s,\r\n", msg); // doesn't work
ostream.print( String.join(" ", CRS) + "\r\n" ); // nope
而且:
ostream.append(chars);
ostream.append("\r\n"); // nope
我还尝试了以上所有字节数组。
但是,这种方法确实有效:
// this, however, works as expected
void pong(String ping) {
String msg = "PONG " + ping;
byte[] bs = null;
bs = (msg.substring(1) + "\r\n").getBytes();
try {
ostream.write(bs);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
我也尝试将我的OutputStream
对象(与IRC服务器的连接)更改为PrintStream。相同的结果。
我不理解OutputStream怎么样?
答案 0 :(得分:2)
IRC协议要求您转义包含带前一个冒号的空格的消息(":")。我认为你的代码确实有效,你还没有正确实现IRC协议。
尝试制作PRIVMSG
命令:
msg = ("PRIVMSG " + chan + " :" + msg);
只有第一个单词出现,因为IRC服务器忽略第一个空格后的尾随内容。有效消息应如下所示:
PRIVMSG #target :Hello, world