首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

在网络编程中,套接字(Socket)是一种通信端点,它允许两个程序通过网络进行数据交换。每个套接字都有两个主要的流:输入流(InputStream)和输出流(OutputStream)。这两个流允许程序分别发送和接收数据。

基础概念

  1. 输入流(InputStream):这是一个只读的流,用于从套接字接收数据。当远程主机发送数据到套接字时,这些数据可以通过输入流读取。
  2. 输出流(OutputStream):这是一个只写的流,用于向套接字发送数据。当本地程序需要发送数据到远程主机时,这些数据可以通过输出流写入。

相互看到的原理

在同一套接字上,输入流和输出流是相互独立的,但它们共享同一个底层套接字连接。这意味着:

  • 当你通过输出流向套接字写入数据时,远程主机的输入流可以看到这些数据。
  • 当远程主机通过其输出流向套接字写入数据时,你的输入流可以看到这些数据。

这种机制是通过TCP/IP协议栈实现的,其中TCP协议负责确保数据的可靠传输和顺序正确。

示例代码

以下是一个简单的Java示例,展示了如何使用Socket的输入流和输出流:

代码语言:txt
复制
import java.io.*;
import java.net.*;

public class SocketExample {
    public static void main(String[] args) {
        try (Socket socket = new Socket("example.com", 80);
             OutputStream out = socket.getOutputStream();
             InputStream in = socket.getInputStream()) {

            // 发送数据到远程主机
            String message = "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n";
            out.write(message.getBytes());
            out.flush();

            // 从远程主机接收数据
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

应用场景

  • Web服务器和客户端通信:服务器通过输出流向客户端发送网页内容,客户端通过输入流接收这些内容。
  • 实时通信应用:如聊天应用或在线游戏,其中数据需要在两个方向上快速交换。

可能遇到的问题及解决方法

  1. 数据丢失或乱序:这通常是由于网络不稳定或TCP连接中断导致的。可以通过实现重传机制和确认机制来解决。
  2. 阻塞问题:如果一个流在等待数据而另一个流在发送数据,可能会导致程序挂起。可以使用非阻塞I/O或多线程来处理。
  3. 资源泄漏:忘记关闭流或套接字可能会导致资源泄漏。使用try-with-resources语句可以自动关闭资源。

通过理解这些基础概念和机制,可以更有效地处理网络编程中的各种挑战。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

网络通信中基于套接字输入流和输出流的创建

()方法,分别返回具有套接字通信的基础输入流InputStream和输出流OutputStream对象作为参数,完成绑定套接字通信的输入流和输出流对象的创建。   ...(3)用输入和输出流对象调用其对应方法的操作方式实现网络通信;   (4)网络通信结束,需要关闭输入流和输出流对象,尤其要关闭套接字对象。...具体实现方法   (1)基于套接字的字节输入流dis和输出流dos的创建      dis调用readUTF()方法接收数据;        dos调用writeUTF()方法发送数据; Socket...br和写入器bw或文本输出流pw的创建       如果以字符为单位的读取器和写入器来实现网络通信,必须将套接字的字节流用转换器转换为字符流输入,或将字符流装换为套接字的字节流输出。       ...()); //字符输出流转换为字节输出流       以下将绑定有套接字的转换器对象作为缓冲字符读取器br和字符写入器bw的构造函数参数,建立br和bw对象,由此可达到字符操作的高效率。

74120

Java入门(18)-- 网络通信

网络程序中的套接字(Socket)用于将应用程序与端口连接起来。套接字是一个假想的连接装置,就像插座一样可连接电器与电线。...服务器端的Socket对象使用getOutputStream()方法获得的输出流,将指向客户端Socket对象使用getInputStream()方法获得的那个输入流;同样,服务器端的Socket对象使用...getInputStream()方法获得的输入流,将指向客户端Socket对象使用getOutputStream()方法获得的那个输出流。...也就是说,当服务器向输出流写入信息时,客户端通过相应的输入流就能读取,反之亦然。 注:accept()方法会阻塞线程的继续进行,直到接收到客户的呼叫。...客户机套接字和服务器套接字连接成功后,客户机通过输出流发送数据,服务器则通过输入流接收数据。

67320
  • 《Java从入门到放弃》JavaSE入门篇:网络编程(入门版)

    那么具体到两台电脑,它们是如何来交互数据的呢?请看下图: 从步骤来分析: 一、服务器端程序     1.1创建一个服务器套接字(ServerSocket),并绑定到指定端口。     ...1.2侦听来自客户端的请求,如果接受到连接则返回套接字对象(socket)。     1.3获得输入/输出流,也就是进行数据的接收或发送。     1.4关闭套接字(socket)。...二、客户端程序     2.1创建一个套接字,向服务器指定商品发送请求。     2.2与服务器正确连接后开始数据的接收或发送。     2.3关闭套接字。 步骤分析完了,接下来就是实施了。...; out.write(strToClient.getBytes()); // 往输出流中发送数据 // 关闭输入流和输出流 in.close(); out.close();...("来自服务端的回答>>"); System.out.println(strFromServer); in.close();out.close();  //关闭输入流和输出流 s.close

    569100

    网络协议:一文搞懂Socket套接字

    ,它们不需要知道传输层是如何对数据流进行处理。...特别责要注意的是通信连接必须显式建文。该套接字类型适食传输大量的数据,但不支持广播和多播方式。...与数据报套接字相比,使用流式套接字是一个更为可靠的方法,但对于某些应用,建立一个显式连接所导致的系统开销是令人难以接收的,并且数据报套接字支持广播和多播方式。...getLocalPort(); // 返回此套接字的输入流 getInputStream() // 返回此套接字的输出流 getOutputStream() // 根据连接是否关闭返回一个boolean...Socket Demo 流程思路: 创建 Socket对象,指明需要连接的服务器的地址和端口号; 连接建立后,通过输出流向服务器端发送请求信息; 通过输入流获取服务器响应的信息; 关闭相关资源

    2.7K21

    java学习笔记(基础篇)—网络

    三:OSI(Open System Interconnection)参考模型 物理层:二进制传输,确定如何在通信信道上传递比特流; 数据链路层:加强物理层的传输功能,建立一条无差错的传输线路; 网络层:...、 组织和协调其相互之间的通信; 表示层:处理被传送数据的表示问题,也就是信息的语法和语义,如有必要将使用一种通用的格式在多种格式中进行转换; 应用层:为用户的应用程序提供网络通信服务; OSI(Open...和getInputStream获取输出流和输入流, 开始网络数据的发送和接收; ④最后关闭通信套接字。...2)客户端程序编写: ①调用Socket()创建一个流套接字,并连接到服务器端; ②调用Socket类的getOutputStream()和getInputStream获取输出流和输入流, 开始网络数据的发送和接收...其中第四,五是选择性的。 2)客户端程序编写: a)调用DatagramSocket()创建一个数据报套接字。

    63200

    java学习笔记(基础篇)—网络

    三:OSI(Open System Interconnection)参考模型 物理层:二进制传输,确定如何在通信信道上传递比特流; 数据链路层:加强物理层的传输功能,建立一条无差错的传输线路; 网络层...:在两个相互通信的应用进程之间建立、 组织和协调其相互之间的通信; 表示层:处理被传送数据的表示问题,也就是信息的语法和语义,如有必要将使用一种通用的格式在多种格式中进行转换; 应用层:为用户的应用程序提供网络通信服务...()和getInputStream获取输出流和输入流, 开始网络数据的发送和接收; ④最后关闭通信套接字。...2)客户端程序编写: ①调用Socket()创建一个流套接字,并连接到服务器端; ②调用Socket类的getOutputStream()和getInputStream获取输出流和输入流, 开始网络数据的发送和接收...其中第四,五是选择性的。 2)客户端程序编写: ​ a)调用DatagramSocket()创建一个数据报套接字。 ​

    58250

    【Java】基础45:网络编程代码演练

    ①客户端套接字 什么叫套接字? 就是IP+端口,在Java里面它就对应了一个类,叫Socket,也叫套接字。 通过它可以找到计算机中对应的进程。...getOutputStream()方法也就是获取一个流,再用输出流的write()方法写内容。 ③告诉服务器输出结束 这个是什么意思呢? 在IO流中读文件时是怎么判断读完了的?...读信息自然就是IO流中输入流的read()方法:使用while循环,这段代码是IO流的基本代码。...①服务端套接字 指定服务端的端口,IP也就是当前主机。 客户端要想访问这个服务端,那它填写的套接字要和服务端这儿的端口保持一致。 如果是两台电脑,我这台是服务端,另一台是客户端。...socket.getOutputStream()得到的就是一个输出流,再使用write()方法写发送给客户端的信息。 ④关流 和客户端一样的道理。 其中ServerSocket也要关流。

    45910

    《拉钩课程 - 重学操作系统 - Linux 指令入门》

    3、每个进程拥有自己的标准输入流、标准输出流、标准错误流。 标准输入流(用 0 表示)可以作为进程执行的上下文(进程执行可以从输入流中获取数据)。...# 利用 nginx 的 access_log 统计网站的 PV(Page View),用户每访问一次页面就是一次 PV wc -l access.log 9、tee 指令从标准输入流中读取数据到标准输出流...13、需要全部用户都可以执行的指令,比如 ls,它们的权限如何分配?用户维度可读写和执行,组维度和所有用户可以读和执行。...# -a, --all:显示所有套接字(sockets) # -n, --numeric:不解析服务名称 # -l, --listening:显示监听状态的套接字(sockets) # -t, --tcp...:仅显示 TCP套接字(sockets) # -u, --udp: 仅显示 UCP套接字(sockets) # -p, --processes:显示使用套接字(socket)的进程 ss -s

    86320

    c++ 网络编程(二)TCPIP linux 下多进程socket通信 多个客户端与单个服务端交互代码实现回声服务器

    单方面断开连接带来的问题 Linux的close函数和Windows的closesocket函数是完全断开连接。完全断开是指无法传输数据也不能接收数据。因此,一方这样直接断开连接就显得不太优雅了。...套接字和流(Stream) 两台主机通过套接字建立连接后进入可交换数据的状态,我们把这种状态看作一种流。如流水一样,水朝一个方向流动,同样,在套接字的流中,数据也只能向一个方向移动。...一旦两台主机建立了套接字连接,每个主机就会拥有单独的输入流和输出流。如图,其中一个主机的输入流与另一主机的输出流相连,而输出流则与另一主机的输入流相连。...SHUT_RD:断开输入流,SHUT_WR:断开输出流,SHUT_RDWR:同时断开 LINUX下: 一.服务端代码 下面用了多个close来关闭文件描述符,可能有的小伙伴会有疑惑。。。。...,套接字也属于操作系统,所以创建新进程也还是只有原来的那个,复制的资源只不过是文件描述符而已,我们关闭的也是这个文件描述符 //基于多进程的并发服务器实现 //注:子进程会复制父进程拥有的所有资源 #include

    3.8K90

    Java流

    Java 中 IO 流分为几种? 按照流的流向划分,可以分为输入流和输出流; 按照操作单元划分,可以划分为字节流和字符流; 按照流的角色划分为节点流和处理流。...InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。 OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。...字节输入流 ? 字节输出流 ? 字符输入流 ? 字符输出流 ? 既然有了字节流,为什么还要有字符流?...NIO 提供了与传统 BIO 模型中的 Socket 和 ServerSocket 相对应的 SocketChannel 和 ServerSocketChannel 两种不同的套接字通道实现,两种通道都支持阻塞和非阻塞两种模式...看看非阻塞的套接字的recvfrom操作如何进行。可以看出recvfrom总是立即返回。 ?

    89210

    Java利用TCP协议实现客户端与服务器通信【附通信源码】

    上一篇博客和大家分享了在网络编程中要注意的基础知识,关于IP、TCP、UDP以及端口和套接字的一些概念,想了解的小伙伴可以看我的这篇文章“盘点那些进行网络编程必须要知道的基础知识”,那么今天大灰狼就来和大家分享一下如何使用...而TCP协议程序的编写,仍然是依靠套接字Socket类来实现的,并且利用TCP协议进行通信的两个程序之间是有主次之分的,即一个是服务器的程序,另一个是客户端的程序。因此两者的功能和编写上也略有不同。...而在这其中起到关键作用的就是服务器端套接字ServerSocket和客户端套接字Socket。通过这两个套接字来建立服务器和客户端,从而利用其中的函数进行数据的通信。...值得注意的是:服务器套接字一次只能与一个客户端套接字进行连接,因此如果存在多台客户端同时发送连接请求,则服务器套接字就会将请求的客户端存放到队列中去,然后从中取出一个套接字与服务器建立的套接字进行连接,...对于如何进行客户端和服务器端数据的通信,就要用到数据的输入流和输出流了,服务器端的Socket对象使用getOutputStream()方法获取到的输出流,将指向客户端的Socket对象使用getInputStream

    3.5K30

    java网络编程从0到1快速上手

    即不能在从此套接字的输入流中接收任何数据 public void shutdownOutput() 禁用此套接字的输出流。...如果在套接字上调用 shutdownOutput() 后写入套接字输出流则该流将抛出 IOException。...即不能通过此套接字的输出流发送任何数据 TCP网络编程  Java语言的基于套接字编程分为服务端编程和客户端编程,其通信模型如图所示: 客户端Socket的工作过程包含以下四个基本的步骤: 创建.../写操作:通过输入流读取服务器放入线路的信息(但不能读取自己放入线路的信息),通过输出流将信息写入线程。...调用 该Socket类对象的 getOutputStream() 和 getInputStream ():获取输出流和输入流,开始网络数据的发送和接收。

    26430

    Java网络编程

    套接字是两台机器间通信的端点。...套接字:包含了IP地址和端口号的网络单位; 构造方法: Socket(String host, int port) 创建一个流套接字并将其连接到指定主机上的指定端口号; 参数说明: String host...:服务器主机名称/服务器的IP地址 int port:服务器的端口号 成员方法: OutputStream getOutputStream()返回此套接字的输出流; IntputStream getIntputStream...()返回此套接字的输入流; void close()关闭此套接字; 实现步骤: ①创建一个客户端对象Socket,构造方法中传入服务器的地址和端口号; ②使用Socket中的getOutputStream...IP和端口号; ③使用Socket中的getOutputStream方法,获取网络字节输出流OutputStream对象; ④使用本地字节输入流FileInputStream中的read方法,读取本地文件

    6710

    “挑三拣四”地学一学Java IO

    01、数据流之字节与字符 Java所有的I/O机制都是基于数据流进行的输入输出。数据流可分为两种: 1)字节流,未经加工的原始二进制数据,最小的数据单元是字节。...字符流是基于字节流的,因此,我们先来学习一下字节流的两个最基础的类——OutputStream和InputStream,它们是必须要掌握的。...①、ByteArrayOutputStream通常用于在内存中创建一个字节数组缓冲区,数据被“临时”放在此缓冲区中,并不会输出到文件或者网络套接字中——就好像一个中转站,负责把输入流中的数据读入到内存缓冲区中...②、BufferedOuputStream实现了一个缓冲输出流,可以将很多小的数据缓存为一个大块的数据,然后一次性地输出到文件或者网络套接字中——这里的“缓冲”和ByteArrayOutputStream...03、网络套接字——Socket 虽然网络套接字(Socket)并不在java.io包下,但它和输入输出流密切相关。File和Socket是两组主要的数据传输方式。

    43330

    Java SE 网络

    一旦有人通过网络发送了正确的连接请求,并以此连接到了端口上,该方法会返回一个表示连接已经建立的Socket对象。使用Socket获取输入流和输出流。...,同时来自客户端程序的所有输出都会被包含在服务器输入流中。...通过关闭一个套接字的输出流来表示发送给服务器的请求数据已经结束,但是必须保持输入流处于打开状态。...但是,URL类可以打开一个到达资源的流。因此,URL类只能作用于那些Java类库直到该如何处理的模式,例如http:、https:、ftp:、本地文件系统(file:)和JAR文件(jar:)。...在默认情况下,建立的连接只产生从服务器读取信息的输入流,并不产生任何执行写操作的输出流。

    80100

    网络编程

    : java.net.Socket:此类实现客户端套接字(也可以就叫“套接字”)。...套接字是两台机器间通信的端点。 套接字:包含了IP地址和端口号的网络单位 构造方法: Socket(String host, int port) 创建一个流套接字并将其连接到指定主机上的指定端口号。...参数: String host:服务器主机的名称/服务器的IP地址 int port:服务器的端口号 成员方法: OutputStream getOutputStream() 返回此套接字的输出流。...InputStream getInputStream() 返回此套接字的输入流。 void close() 关闭此套接字。...服务器端必须明确一件事情,必须的知道是哪个客户端请求的服务器 所以可以使用accept方法获取到请求的客户端对象Socket 成员方法: Socket accept() 侦听并接受到此套接字的连接。

    46720

    JavaTCP和UDP套接字编程

    在了解网络编程之前,我们先了解一下什么叫套接字,套接字即指同一台主机内应用层和运输层之间的接口,由于这个套接字是建立在网络上建立网络应用的可编程接口,因此也将套接字称为应用程序和网络之间的应用程序编程接口...关于TCP和UDP这里就不作太多介绍了,我们知道TCP是面向连接的,UDP是不面向连接的,TCP可靠,UDP不可靠即可!...我们来设计一个应用来示范一下,流程: 客户机从键盘读取一行字符串,并通过套接字发送到服务器。 服务器从连接的套接字获取这行字符串,并对其进行修改(将小写转为大写),最后再发回客户端。...//创建向服务器发送信息的输出流 DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream...(记录供以后参考),博主在代码中也作了很详细的注释,这里就不在多解释什么了,相信通过上面简单的例子,我们能够了解Java是如何实现TCP和UDP套接字编程。

    49920

    JavaTCP和UDP套接字编程

    在了解网络编程之前,我们先了解一下什么叫套接字,套接字即指同一台主机内应用层和运输层之间的接口,由于这个套接字是建立在网络上建立网络应用的可编程接口,因此也将套接字称为应用程序和网络之间的应用程序编程接口...关于TCP和UDP这里就不作太多介绍了,我们知道TCP是面向连接的,UDP是不面向连接的,TCP可靠,UDP不可靠即可!...我们来设计一个应用来示范一下,流程: 客户机从键盘读取一行字符串,并通过套接字发送到服务器。 服务器从连接的套接字获取这行字符串,并对其进行修改(将小写转为大写),最后再发回客户端。...//创建向服务器发送信息的输出流 DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream...(记录供以后参考),博主在代码中也作了很详细的注释,这里就不在多解释什么了,相信通过上面简单的例子,我们能够了解Java是如何实现TCP和UDP套接字编程。

    70550
    领券