【发布时间】:2011-12-08 05:58:10
【问题描述】:
我正在从连接到 SMTP 和 POP 服务器的套接字写入的 BufferedReader 中逐字符读取套接字响应。但是我怎么知道我是否已经阅读到响应结束以避免让read() 挂起以读取超出服务器响应的内容?以下代码是我从 BufferedReader 读取的方式:
boolean endOfResponse = false;
while(!endOfResponse) {
c = in.read();
if ((c >= 32 && c < 127) || c == '\t' || c == '\r' || c == '\n') {
response.append((char)c);
//The following check has a problem: If the response has multiple lines, the other lines will not be read.
if(c == '\n') endOfResponse = true;
}
}
例如,在 POP 中,当我执行 LIST 时,响应以 . 结束。但是在 SMTP 中,当我执行 EHLO 时,它并没有明确指示响应何时结束。
遗憾的是,in.read() == -1 的使用不起作用,因为它仍会尝试读取响应数据之外的内容并导致套接字挂起。
那么,如何确定 SMTP 和 POP 响应的结束?更好的是,是否可以事先知道我应该从缓冲区读取多少字节,这样我什至不必检查响应结束?
【问题讨论】:
-
您知道 JavaMail 的存在,实现了所有这些协议并在它们之上提供了一个抽象层吗? oracle.com/technetwork/java/javamail/index.html。即使你不想使用它,它也是开源的,所以你可能想看看它在内部是如何工作的。