OutputStream.write只在Java中编写String的一部分

时间:2018-05-16 22:49:33

标签: java

我正在开发一个基于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怎么样?

1 个答案:

答案 0 :(得分:2)

IRC协议要求您转义包含带前一个冒号的空格的消息(":")。我认为你的代码确实有效,你还没有正确实现IRC协议。

尝试制作PRIVMSG命令:

msg = ("PRIVMSG " + chan + " :" + msg);

只有第一个单词出现,因为IRC服务器忽略第一个空格后的尾随内容。有效消息应如下所示:

PRIVMSG #target :Hello, world