【问题标题】:How does a BufferedReader interact with a Socket? About how Sockets workBufferedReader 如何与 Socket 交互?关于 Socket 的工作原理
【发布时间】:2020-04-05 14:24:46
【问题描述】:

我一直在关注如何使用 Java 构建简单的聊天应用程序的教程。我了解了服务器和客户端如何通信的基本原理。到目前为止,我使用 PrintWriter 发送,使用 BufferedReader 接收双方的信息。但我不明白这怎么不会导致错误?

Socket soc = new Socket(ipAddress, port);
BufferedReader in = new BufferedReader( new InputStreamReader(soc.getInputStream));
while(true) {

    String str = in.readLine();

}

我的问题如下。 in.readLine() 语句是否“等待”输入?如果没有,如果使用str,程序不应该抛出错误,因为它没有价值吗?或者笼统地说,像Socket soc = serverSocket.accept(); 这样的套接字特定功能还是在上面给出的示例中读取输入流“等待”信号?我错过了一些关于套接字的基本概念吗?如果有人能帮助我进一步理解这个话题,那就太好了。

提前谢谢你,

应用

【问题讨论】:

  • 我并不是要劝阻你放弃当前的任务——但是——在你完成当前教程之后,我建议使用 Java 的 NIO 库。在我的工作地点,我们即将为用 Java 完成的旧 API/服务发布一些新的实时事件……在过去的两周里,我们从您正在使用的套接字/套接字服务器切换到“较新”的 NIO 套接字通道等。 crunchify.com/…
  • 感谢您的建议,我对这个主题还很陌生,一定会进一步研究。

标签: java sockets stream


【解决方案1】:

我的问题如下。 in.readLine() 语句是否“等待”输入?

是的,它是“等待输入”,因为.readLine() 是一个阻塞方法

如果没有,程序不应该在使用 str 时抛出错误,因为它没有价值吗?

我无法解析这个——这句话没有意义。您会期待什么错误/异常?

或者一般来说,做 Socket 特定的函数,比如 Socket soc = serverSocket.accept();或者在上面给出的示例中读取 InputStream“等待”信号?

再次,恐怕这不是太清楚(至少对我来说)。 ServerSocket#accept() 一个阻塞方法,如果你问的是什么,它将等到可以建立套接字连接。


注意这段代码:

while(true) {
    String str = in.readLine();
}

虽然有效,但不会特别有用,因为您将读取一个字符串然后丢弃它,对它什么也不做。最好打印获得的字符串,或者将其传递给可以以某种方式使用的方法。另一方面,如果您只想“吞噬”流以防止操作系统的缓冲区溢出,我想这可能会很有用。

【讨论】:

  • 是的,这正是我要问的。我不熟悉阻塞方法的概念。感谢您的建议,我正要在 while 循环中添加代码。感谢您的快速回复。
【解决方案2】:

是的 readLine 实际上是阻塞的。它会一直等到您读取回车/换行符,或者套接字关闭。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多