Java网络编程中对Socket的理解

时间:2021-04-16 20:16:14

关于网络编程中的Socket和ServerSocket的关系,以及对Scoket中流的操作,一直不太明白,直到看第二遍书和视屏的时候,

豁然开朗,这里作个总结,也是对学习的回顾。

我们在理解TCP通信的时候,就必须用到ServerSocket,因为只有TCP才分ServerSocket,而UDP是不分的。下面上图看的更清楚

Java网络编程中对Socket的理解Java网络编程中对Socket的理解

Java网络编程中对Socket的理解

在这个图里,我们看不到ServerSocket,为什么呢?因为ServerScoket只是起一个监听的作用,而且这个监听是阻塞式的,

ServerSocket  ss  =  new ServerSocket(30000);这行命令的作用是:在30000端口启用一个TCP连接的监听,等待Socket的连接

如果没有客户端的Socket发出请求,那么就会一直等待下去;而对于客户端必须产生一个Socket请求,Socket  s  =  new  Socket("127.0.0.1" , 30000);

这行命令一旦执行,就会向指定IP的服务端的指定端口发出TCP请求,这个时候服务端接收到请求,同时生成一个Socket实例,Socket  s  =  ss.accept();

 这个时候两端都有了一个Socket实例,那么这个TCP的虚拟链路就建立起来了,而ServerSocket就完成了它的任务,没有任何的作用了(这是只讨论一次连接的情况),

所有网络编程的底层是通过Socket来实现的,简单来说就是,监听——请求——建立连接。

而对于Socket中流的操作,则可以更简单,就将整个Socket连接视为一个资源就可以了,从这里我们看出Java在设计处理流的好处了,无论我们的节点流是什么样的实现是文件流也好,是Socket流也好,无需关心底层实现,还是像普通IO操作一样,取得输入流,取得输出流,跟操作文件流没什么两样。

Java网络编程中对Socket的理解


Java网络编程中对Socket的理解Java网络编程中对Socket的理解