同一套接字的输入流和输出流如何互相看到?

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

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

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

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字符串?服务器写入输出流,客户端从输入流中提取,这不是两个不同的存储区吗?

java sockets stream
1个回答
0
投票

[如果您正在通过网络使用套接字,则有很多底层软件,以及潜在的硬件在这里发挥作用。

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

这一切对您都是隐藏的,因此,除非您为此使用低级代码,否则您不必太在意数据的发送和接收方式,但是至少您应该了解常用的不同协议(TCP ,UDP,RAW)。

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

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