Java 什么触发套接字';将InputStream关闭(或到达流的末尾),并简单地生成null?
这听起来是个奇怪的问题,但我一直在玩弄使用套接字的服务器/客户端Java工作。有趣的是,当我运行一个单独的线程让客户端通过以下代码从服务器读取行时:Java 什么触发套接字';将InputStream关闭(或到达流的末尾),并简单地生成null?,java,sockets,server,client,bufferedreader,Java,Sockets,Server,Client,Bufferedreader,这听起来是个奇怪的问题,但我一直在玩弄使用套接字的服务器/客户端Java工作。有趣的是,当我运行一个单独的线程让客户端通过以下代码从服务器读取行时: String servIn = null; boolean isFinished = false; while(!isFinished){ servIn = reader.readLine(); System.out.println(servIn);
String servIn = null;
boolean isFinished = false;
while(!isFinished){
servIn = reader.readLine();
System.out.println(servIn);
}
当我需要完成的所有读取都结束时(换句话说,我不再向代码中的套接字写入代码),这段代码产生了无休止的“null”流。在做了一点研究之后,基于,我得出结论,一旦所有的方法都运行了,流就结束了
我发现这很奇怪,因为我从未明确告诉流在末尾关闭,代码中有时需要挂起(BufferedReader,来自套接字)readLine()以等待(PrintWriter,来自套接字)writer.println()在代码的另一端,反之亦然。从我对readLine()和println()的理解来看,它们似乎要等到各自的另一个方法准备就绪。这让我感到困惑,因为在我看来,在代码的末尾,它应该停留在readLine()而不是抛出“null”。JVM或类套接字是否只是通过向前看并看到不再通过println()进行写入来确定OutputStream何时结束
我从套接字流中对println()和readLine()的解释正确吗?如果正确,是什么导致突然转换为吐出“null”的?提前谢谢 在我看来,你关闭了另一侧的插座在我看来,你关闭了另一侧的插座 是什么触发套接字的InputStream关闭(或到达流的末尾),并简单地生成null
InputStream
关闭的唯一方法是对其或其底层套接字调用close()
InputStream
到达流末尾的是在文件的情况下读取到文件末尾,或者在套接字的情况下对等方关闭连接InputStream
不会返回null,但是当您到达流的末尾时,BufferedReader.readLine()
会返回null,正如Javadoc中所说的那样InputStream
关闭的唯一方法是对其或其底层套接字调用close()
InputStream
到达流末尾的是在文件的情况下读取到文件末尾,或者在套接字的情况下对等方关闭连接InputStream
不会返回null,但是当您到达流的末尾时,BufferedReader.readLine()
会返回null,正如Javadoc中所说的那样那个是因为你们忽略了流的末端。当您遇到这种情况时,应该关闭套接字并停止读取。您确定没有通过循环写入大量空值吗。实际上只是空字符串。@3kings,这将导致
readLine()
返回空字符串,而不是空字符串。您确定没有通过循环写入一组空值吗。实际上只是空字符串。@3kings会导致readLine()
返回空字符串,而不是空字符串。这并不能提供问题的答案。一旦你有足够的钱,你将能够;相反@你错了。这不仅是一个答案,也是一个正确的答案。@EJP它太短了。一些解释可能会有所帮助。尽管如此,它还是在审查“低质量帖子”。@SharpEdge VLQ审查队列似乎在字数或字符数方面起作用。这样做的目的是让你重新审视,而不是盲目地同意“太短”完全在旁观者的眼中。相关的事实出现在答案中。我并没有盲目地同意。我仍然坚持我的说法,答案似乎太短,另一方面,你的答案有一些解释。我将不得不通过堆栈溢出常见问题解答和元为此。为了记录在案,我没有否决他的答案。这并不能回答这个问题。一旦你有足够的钱,你将能够;相反@你错了。这不仅是一个答案,也是一个正确的答案。@EJP它太短了。一些解释可能会有所帮助。尽管如此,它还是在审查“低质量帖子”。@SharpEdge VLQ审查队列似乎在字数或字符数方面起作用。这样做的目的是让你重新审视,而不是盲目地同意“太短”完全在旁观者的眼中。相关的事实出现在答案中。我并没有盲目地同意。我仍然坚持我的说法,答案似乎太短,另一方面,你的答案有一些解释。我将不得不通过堆栈溢出常见问题解答和元为此。为了记录在案,我没有否决他的答案。