【发布时间】:2014-10-26 01:58:49
【问题描述】:
我正在浏览Java TCP Client Server tutorials,他们在其中解释回显服务器的工作原理以及 TCP 客户端如何与回显服务器交互。
对于 TCP 客户端,他们给出了这个 sn-p 并解释它是什么:
String hostName = args[0];
int portNumber = Integer.parseInt(args[1]);
try (
Socket echoSocket = new Socket(hostName, portNumber);
PrintWriter out =
new PrintWriter(echoSocket.getOutputStream(), true);
BufferedReader in =
new BufferedReader(
new InputStreamReader(echoSocket.getInputStream()));
BufferedReader stdIn =
new BufferedReader(
new InputStreamReader(System.in))
)
稍后,他们说下面几行(大约 8 行):
要通过套接字向服务器发送数据,EchoClient 示例需要写入 PrintWriter。为了获得服务器的响应,EchoClient 读取 BufferedReader 对象 stdIn,该对象是在 try-with 资源语句的第四个语句中创建的。
为什么会这样说
为了获取服务器的响应,EchoClient 从 BufferedReader 对象 stdIn 中读取
stdIn 不是用于从系统的标准输入读取而不是从套接字的标准输入读取吗? Echo 客户端是否应该从inBufferedReader 读取?
如果我错了,你能澄清我的误解吗?
http://docs.oracle.com/javase/tutorial/networking/sockets/readingWriting.html
编辑
也许我不够清楚。当客户端必须从服务器获取数据时。它是这样得到的吗:
BufferedReader in =
new BufferedReader(
new InputStreamReader(echoSocket.getInputStream()));
或者这个:
BufferedReader stdIn =
new BufferedReader(
new InputStreamReader(System.in))
文档从第二个开始说。这没有意义,应该是第一个
【问题讨论】:
-
您永远不会写入到标准输入流。
-
@Mat 是的,你是对的!我的错别字。
-
添加指向实际 javadoc 的链接会很有用,但我认为您是对的,它不正确。
-
@popovitsj 啊,我搞砸了!好了,搞定了!
-
你需要了解Unix进程范式。每个进程都有一个标准输入和标准输出管道,您可以将进程与标准输出从一个步骤端到端链接到下一步的标准输入。尽管这可能不是它在例如 Windows 环境中的实际工作方式,但仍使用该术语。