关于网络编程中的Socket和ServerSocket的关系,以及对Scoket中流的操作,一直不太明白,直到看第二遍书和视屏的时候,
豁然开朗,这里作个总结,也是对学习的回顾。
我们在理解TCP通信的时候,就必须用到ServerSocket,因为只有TCP才分ServerSocket,而UDP是不分的。下面上图看的更清楚
在这个图里,我们看不到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操作一样,取得输入流,取得输出流,跟操作文件流没什么两样。