当前位置: 首页 > 知识库问答 >
问题:

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

缪远航
2023-03-14

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

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

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也是同一个对象,它是客户机的socket

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

共有2个答案

高钱青
2023-03-14

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

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

它对您来说都是隐藏的,所以除非您为它编写低级代码,否则您不需要太在意数据的发送和接收方式,但至少您应该了解常用的不同协议(TCP、UDP、RAW)。

编辑:即使你使用localhost,它很可能出去到你的系统的网络控制器,然后只是环回.这是不太可能的系统优化它绕过网络控制器,只是直接复制到接收套接字。

甄煜
2023-03-14

问题实际上是,我认为服务器的接受()函数返回了客户端的套接字,但它没有,它返回了一个与客户端套接字对话的新套接字,但它们是两个不同的对象,因此inSocketoutSocket在客户端和服务器中都引用了两个不同的套接字,而不是同一个。

服务器在其输出流中写入字符串,然后进入客户机的输入流,这是非常合乎逻辑的,我理解服务器在客户机的输出流中写入字符串,这没有意义。

 类似资料:
  • 问题内容: 我有一个Java应用程序,即Voip。我正在使用一个套接字通过线程同时发送和接收信息。代码如下所示。 我发现的问题是,当我写入输出流时,它在第一次写入时阻塞。我发送的字节数不多。贝娄是我的写代码。 读取声音代码的另一个线程是… 我已经在实际代码中注释了很大一部分,因为我只是想使其正常工作。我的写函数在第一次写时无限期阻塞。这可能是我的线程有问题吗?我唯一的想法是输出和输入流共享我的套接

  • Netty TCP Server在端口处运行,接收格式的数据。它使用Marine API库将胡言乱语转换为需要从套接字输入流的有意义的信息。 如何获得正在使用的netty服务器端口的输入流?

  • Kafka流中是否内置了允许将单个输入流动态连接到多个输出流的功能?允许基于true/false谓词进行分支,但这不是我想要的。我希望每个传入日志都确定它将在运行时流到的主题,例如,日志将流到主题和日志将流到主题。 我可以在流中调用,然后写给Kafka制作人,但这似乎不是很好。在Streams框架中是否有更好的方法来实现这一点?

  • 主要内容:C++输入流和输出流本教程一开始就提到,C++ 又可以称为“带类的 C”,即可以理解为 C++ 是 C 语言的基础上增加了面向对象(类和对象)。在此基础上,学过 C 语言的读者应该知道,它有一整套完成数据读写(I/O)的解决方案: 使用 scanf()、gets() 等函数从键盘读取数据,使用 printf()、puts() 等函数向屏幕上输出数据; 使用 fscanf()、fgets() 等函数读取文件中的数据,使

  • 本小节将会介绍基本输入输出的 Java 标准类,通过本小节的学习,你将了解到什么是输入和输入,什么是流;输入输出流的应用场景,File类的使用,什么是文件,Java 提供的输入输出流相关 API 等内容。 1. 什么是输入和输出(I / O) 1.1 基本概念 输入/输出这个概念,对于计算机相关专业的同学并不陌生,在计算中,输入/输出(Input / Output,缩写为 I / O)是信息处理系

  • 本文向大家介绍浅析Java.IO输入输出流 过滤流 buffer流和data流,包括了浅析Java.IO输入输出流 过滤流 buffer流和data流的使用技巧和注意事项,需要的朋友参考一下 java.io使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题。 字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流。 问题引入: 缓冲流为什么比普通的文件字节流效率高? 不带