首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从套接字读取\r\n在Java中

从套接字读取\r\n在Java中
EN

Stack Overflow用户
提问于 2017-04-10 16:45:15
回答 2查看 1.2K关注 0票数 0

我想实现一个POP3客户端。我知道在POP3协议中,每个消息都以\r\n结尾。我想用Java语言编写一个recvuntil方法,它将能够一次接收整个消息。

在Python中它非常简单:

代码语言:javascript
复制
def recv_all_until_ver3(s, crlf):
    data = ""
    while data[-len(crlf):] != crlf:
        data += s.recv(1)
    return data

然而,当我尝试用Java做同样的事情时:

代码语言:javascript
复制
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?谢谢。

EN

回答 2

Stack Overflow用户

发布于 2017-04-10 17:13:39

Python代码一次读取一个二进制八位数,立即将其附加到answer,如果在当前迭代中answerCRLF结束,则表示完成。

由于BufferedReader.readLine()在去掉行终止符之后返回行内容,所以Java代码挂起。此时,answer不包含CRLF,因此再次调用readLine(),并且由于流没有从另一端关闭(您的程序将抛出NullPointerException),并且您有无限的读取超时(您将看到SocketTimeoutException),它挂起,永远等待下一行。

正确的版本是

代码语言:javascript
复制
Socket socket = connect(); // Implement this
Scanner scanner = new Scanner(new InputStreamReader(socket.getInputStream(), "ASCII"));
scanner.useDelimiter("\r\n");
String response = scanner.nextLine();
socket.close();

备注:

  • 总是在套接字上设置超时。
  • 您可能需要考虑到套接字
票数 1
EN

Stack Overflow用户

发布于 2017-04-10 16:54:35

您可以使用Scanner类(它接受InputStream作为构造函数参数),并使用useDelimiter方法设置分隔符。读取以\r\n结尾的消息

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43318567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档