我想实现一个POP3客户端。我知道在POP3协议中,每个消息都以\r\n结尾。我想用Java语言编写一个recvuntil方法,它将能够一次接收整个消息。
在Python中它非常简单:
def recv_all_until_ver3(s, crlf):
data = ""
while data[-len(crlf):] != crlf:
data += s.recv(1)
return data然而,当我尝试用Java做同样的事情时:
class JavaApplication1 {
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws IOException {
// TODO code application logic here
String serverAddress = "interia.pl";
int port = 110;
Socket s = new Socket(serverAddress, port);
BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream()));
String answer = "";
while (!answer.contains("\r\n")) {
answer = input.readLine();
System.out.println(answer);
}
}
}它收到一条消息,然后动手,而不是结束自己。有没有办法在Java中实现这个方法?我能不能只读一个字符,而不是整行,直到我在消息中找到\r\n?谢谢。
发布于 2017-04-10 17:13:39
Python代码一次读取一个二进制八位数,立即将其附加到answer,如果在当前迭代中answer以CRLF结束,则表示完成。
由于BufferedReader.readLine()在去掉行终止符之后返回行内容,所以Java代码挂起。此时,answer不包含CRLF,因此再次调用readLine(),并且由于流没有从另一端关闭(您的程序将抛出NullPointerException),并且您有无限的读取超时(您将看到SocketTimeoutException),它挂起,永远等待下一行。
正确的版本是
Socket socket = connect(); // Implement this
Scanner scanner = new Scanner(new InputStreamReader(socket.getInputStream(), "ASCII"));
scanner.useDelimiter("\r\n");
String response = scanner.nextLine();
socket.close();备注:
发布于 2017-04-10 16:54:35
您可以使用Scanner类(它接受InputStream作为构造函数参数),并使用useDelimiter方法设置分隔符。读取以\r\n结尾的消息
https://stackoverflow.com/questions/43318567
复制相似问题