BufferedReader如何与套接字交互?关于套接字的工作方式

问题描述 投票:1回答:2

我一直在学习如何用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();)还是上面给出的示例中的InputStream会“等待”读取信号?我是否错过了一些关于插座的基本概念?如果有人可以帮助我进一步理解该主题,那就太好了。

先谢谢您,

Appa

java sockets stream
2个回答
0
投票

是,readLine实际上会阻止。它会一直等到您阅读回车/换行或插座关闭。


0
投票

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

是,因为.readLine()blocking方法,所以它是“等待输入”

如果没有,则使用str时程序没有值,是否应该抛出错误?

我无法解析-声明没有道理。您期望什么错误/异常?

或者一般来说,执行Socket特定功能,例如Socket soc = serverSocket.accept();。还是像上面给出的示例中那样,以任何方式读取InputStream的“ wait”信号?

再次,恐怕这不太清楚(至少对我来说)。ServerSocket#accept()一种阻塞方法,如果您要的是套接字,则将等待直到可以建立套接字连接为止。


请注意此代码:

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

虽然有效,但并不是特别有用,因为您将读取一个String然后将其丢弃,对此不进行任何操作。最好打印获得的String,或者将其传递到可以某种方式使用它的方法中。另一方面,我想如果您要做的只是“吞噬”流以防止OS的缓冲区溢出,那么这可能很有用。

© www.soinside.com 2019 - 2024. All rights reserved.