面向非行应用层协议的Java服务器程序

面向非行应用层协议的Java服务器程序,java,network-programming,Java,Network Programming,我正在用Java编写一个服务器应用程序。要从套接字读取,我有: line = in.readLine(); 其中,中的是一个BufferReader实例,因此我可以从套接字流中读取字符串 如何将其更改为采用非面向行的协议,其中每个应用程序级消息的结尾都由特殊字符终止,例如%,而不是换行字符?在循环中使用该方法,直到字符为%。在每个字符处,将其附加到StringBuilder StringBuilder builder = new StringBuilder(); for (int i = re

我正在用Java编写一个服务器应用程序。要从套接字读取,我有:

line = in.readLine();
其中,中的
是一个
BufferReader
实例,因此我可以从套接字流中读取字符串

如何将其更改为采用非面向行的协议,其中每个应用程序级消息的结尾都由特殊字符终止,例如
%
,而不是换行字符?

在循环中使用该方法,直到字符为
%
。在每个字符处,将其附加到
StringBuilder

StringBuilder builder = new StringBuilder();
for (int i = reader.read(); i >= 0; i = reader.read()) {
    char c = (char) i;
    if (c == '%') {
        break; // or consume the current builder, and recreate a new one
    }
    else {
        builder.append(c);
    }
}
在循环中使用该方法,直到字符为
%
。在每个字符处,将其附加到
StringBuilder

StringBuilder builder = new StringBuilder();
for (int i = reader.read(); i >= 0; i = reader.read()) {
    char c = (char) i;
    if (c == '%') {
        break; // or consume the current builder, and recreate a new one
    }
    else {
        builder.append(c);
    }
}

虽然我自己并没有实际使用过这个类,但我确实记得不久前在文档中看到过这个类,它看起来确实可以做您想做的事情,即使它的功能对于分离输入来说可能有点过分了

这将允许您直接将
BufferedReader
包装在
StreamTokenizer
中,然后您可以将其设置为将
%
字符识别为空白字符,将其他字符识别为普通/字母字符。然后,您可以在标记器上重复调用
nextToken
,当它返回
TT\u WORD
时,您可以通过
sval
属性获取标记


然而,根据JB Nizet的回答,最终自己实现可能会更容易

虽然我自己还没有实际使用过这个类,但我确实记得不久前在文档中看到过这个类,它看起来确实可以做您想要的事情,即使它的功能对于仅仅分离输入来说可能有点过分了

这将允许您直接将
BufferedReader
包装在
StreamTokenizer
中,然后您可以将其设置为将
%
字符识别为空白字符,将其他字符识别为普通/字母字符。然后,您可以在标记器上重复调用
nextToken
,当它返回
TT\u WORD
时,您可以通过
sval
属性获取标记


然而,根据JB Nizet的回答,最终自己实现可能会更容易

不,这不是因为BufferedReader将负责缓冲读取。这是使用BufferedReader的主要原因。啊,对不起,我没有注意到他在使用BufferedReader。我以为这是正常的输入流+不,这不是因为BufferedReader将负责缓冲读取。这是使用BufferedReader的主要原因。啊,对不起,我没有注意到他在使用BufferedReader。我以为这是正常的输入流+1那么。