【问题标题】:How do input stream and output stream of the same socket see each other?同一个socket的输入流和输出流怎么看?
【发布时间】:2020-04-26 08:00:57
【问题描述】:

您好,我正在研究一个服务器-客户端应用程序的示例,但我不明白客户端如何从服务器接收字符串。

服务器运行一个执行此操作的线程:

String seq = generateSequence(l); //random stuff
        outSocket.println(seq);

在客户端类中有这样的代码:

 String serverSeq = inSocket.readLine();
        System.out.println(serverSeq);

inSocketoutSocket 在线程和客户端类中的实现方式相同,其中:

inSocket = new BufferedReader(new InputStreamReader(socket.getInputStream()));
outSocket = new PrintWriter(new BufferedWriter(
                        new OutputStreamWriter(socket.getOutputStream())), true);

socket 也是同一个对象,它是客户端的套接字

我的问题是为什么serverSeq 字符串正是seq 字符串?服务端写入输出流,客户端取输入流,这不是两个不同的内存区域吗?

【问题讨论】:

  • 我不确定我是否理解这个问题。套接字不是相同的对象。它们是同一类的两个实例。一个在服务器 JVM 中运行,另一个在客户端 JVM 中运行。而套接字的全部意义在于通过网络在进程之间进行通信:客户端连接到服务器,然后两个套接字相互连接,并允许发送/接收日期。你应该阅读docs.oracle.com/javase/tutorial/networking/sockets/index.html
  • 剩下的是上下文,但主要问题是为什么服务器使用输出流,客户端使用输入流,并且它看到正确的字符串。服务器不应该写入客户端的输入流以供读取吗?
  • 您无法写入 InputStream。 InputStream 是您从中读取的内容。客户端位于通信通道的一端,并从输入流中读取字节。另一方面,服务器在另一台机器上,并写入输出流。客户端读取服务器写入的内容,反之亦然。服务器写入的内容通过网络发送,并由客户端接收。您似乎完全忽略了套接字用于通过网络进行通信的事实。
  • 好的;感谢您的时间,这一切都在同一台计算机上执行,所以也许这就是我的错误。那么数据如何从服务器的输出流传递到客户端的输入流是我不需要知道的底层的东西?

标签: java sockets stream


【解决方案1】:

问题实际上是我认为服务器的accept() 函数返回了客户端的套接字,但它没有返回一个与客户端的套接字对话的新套接字,但它们是两个不同的对象,所以inSocket 和客户端和服务器中的outSocket 指的是两个不同的套接字,而不是同一个。

服务器将字符串写入其输出流,然后进入客户端的输入流,这很符合逻辑,我理解服务器正在将字符串写入客户端的输出流,这没有任何意义。

【讨论】:

    【解决方案2】:

    如果您在网络上使用套接字,这里有很多底层软件和潜在的硬件在起作用。

    实现可能取决于操作系统/平台,但一般来说,PC 两端都会打开一个端口。数据将以某种方式在端口之间流动,可能通过某种内存映射 I/O,然后输出到网络,或者在本地情况下,可能只是通过 cpu 或内存命令路由。对于本地情况,数据很可能被复制到服务器套接字的缓冲区/内存空间中,readline 只是简单地读取它并重新定位地址指针以指示数据已被读取。

    这对你来说都是隐藏的,所以除非你为它编写底层代码,否则你不需要太关心数据是如何发送和接收的,但至少你应该了解常用的不同协议( TCP、UDP、RAW)。

    编辑:即使您使用本地主机,它也可能会转到您系统的网络控制器,然后只是环回。系统不太可能对其进行优化以绕过网络控制器并直接复制到接收套接字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-25
      • 1970-01-01
      • 2014-09-14
      • 2012-12-04
      • 1970-01-01
      • 2018-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多