【问题标题】:Is this a typo in the java tutorials?这是java教程中的错字吗?
【发布时间】: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 环境中的实际工作方式,但仍使用该术语。

标签: java javadoc java-io


【解决方案1】:

EchoClient 是一种简单的 shell 应用程序(如 telnet)。它允许用户在控制台输入一些东西,客户端从 STDIN 读取它并通过套接字发送到服务器。所以,我认为教程正确地解释了一切。

编辑

客户端正在使用输入流in 从服务器读取响应,并使用流stdIn 读取用户的命令。查看您发布的源代码。

【讨论】:

  • the client reads this from STDIN and sends to server via socket. 我得到了那部分,但是当客户端必须从服务器获取响应/数据时呢?它会从服务器的stdIn 读取,对吗?
  • 请查看我对原始帖子的编辑。我希望这会有所帮助。
  • 这正是我所期望的。那么为什么教程说To get the server's response, EchoClient reads from the BufferedReader object stdIn。不应该是To get the server's response, EchoClient reads from the BufferedReader object in吗?
  • 我再次阅读了您的报价,并认为您可能是对的。但是我没有看到全文,所以我不能确定。无论如何,您似乎正确理解了代码。这比理解教程中的每个句子更重要。
【解决方案2】:
BufferedReader stdIn =
        new BufferedReader(
            new InputStreamReader(System.in))

stdIn 在那里定义,它与 System.in 不同。

【讨论】:

  • 是的,但是客户端如何从服务器读取数据?来自BufferedReader stdInBufferedReader in
  • 让我重新表述你的问题。 “客户端如何从服务端读取数据?从连接到服务端的socket(in),还是从客户端的本地标准输入流?(stdIn)”
  • 哦,我现在明白你的观点了。是的,这似乎是一个错字。 (我正在检查教程页面上的代码,确实是从“in”中读取的)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-12
  • 2011-07-13
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 2013-12-17
  • 2022-11-10
相关资源
最近更新 更多