黑马程序员技术交流社区

标题: 关于TCP协议中ServerSocket和Socket的一些疑问 [打印本页]

作者: w270307032    时间: 2013-5-31 17:45
标题: 关于TCP协议中ServerSocket和Socket的一些疑问
本帖最后由 w270307032 于 2013-6-3 11:53 编辑

关于TCP协议中ServerSocket和Socket的一些疑问
首先,说明的是因为我的疑惑主要是理解上的疑惑,不是代码使用问题,所以就没把具体的代码链接出来,请大家见谅。好了言归正传,
假定,现在我在 客户端建立了个Socket s=new Socket(192.168.3.3, 9090) , 在服务器端建立了个ServerSocket ss=new ServerSocket(9090),
客户端在建立了自己的outputstream后,用outputstream的write方法,往服务端发送了一些数据。服务端用Socket s1=ss.accept() 方法获得了该连接的套接字(我根据API说明和看了毕老师的视频的个人 理解是,其实s1就是s),
然后服务端调用s1.getInputStream()的read方法来进行读取数据。
我的疑惑是 1:如果此时s还没建立自己的InputStream话,那么s1获取的InputStream是哪来的?
         2:客户端的数据是通过 s的outputstream进行传输的,那么服务端想读取这些信息的话,如果s1 就是s 的话,那么调用的应该通过InputStream isin=s.getOutputStream()或InputStream isin=s1.getOutputStream()这样来获取才对,
        客户端的输出流对应服务端的输入流,为什么服务端InputStream isin=s1.getInputStream()。
        所以我想 s1 和s 应该不是同一个才对,那他们又是什么关系?是我哪里理解有问题,或者是说ServerSocket和Socket的底层将流进行了封装的同时,也同时将客户端的输出流和服务端的输入流,用类似管道流的原理进行了连接,还是怎么回事。
        
         
        PS:屌丝第一次发帖,心情那是相当滴激动,嘿嘿,  求点击,求抢楼,求回复,求指点,求照顾,求加分,当然,如果可以有的话,随便求美女...:lol
外加链接个号外消息:http://bbs.itheima.com/thread-52835-1-1.html
作者: 蚂蚁搬家    时间: 2013-5-31 18:44
以下是我的理解,不知能不能解答你的疑惑:
1,Socket s=new Socket(192.168.3.3, 9090)这行代码一旦得以执行,客户端就会与服务器端建立连接,连接成功,服务器端就用accept方法从客户端接收其Socket对象;如果连接失败,服务器端的accept方法就接收不到客户端的Socket对象,也即Socket s1=ss.accept() 这行代码无法执行。Server接收对象后,Client就用OutputStream指向它,这两步应该是绑定在一起的。
2,Server的输入流虽然用的是Client的输出流,但在写程序的时候应该分开写成各自的流吧,像楼主那样写看起来不是太乱了。底层实现用的是同样的东西,写的时候分开写清,程序可读性强嘛!
作者: 紫衣侯    时间: 2013-5-31 18:59
accept()接收的是socket对象,套接字只是建立两者之间的连接,也就是一个桥梁,然后传递数据才要用io过桥{:soso_e113:}
作者: 曹睿翔    时间: 2013-6-1 10:03
如果问题已经解决,请再次编辑,改为已解决,否则继续追问。
为的是界面清爽,方便大家查看
作者: 胡浩    时间: 2013-6-1 10:37
Socket s1=ss.accept() 这个方法是阻塞式的,这个方法会在服务端侦听绑定到特定端口的socket,当服务端在这个端口获取不到的socket的话,就会在这里一直等待,直达获得这个端口上的socket对象为止。我们知道端口是应用程序的表示,当带有客户端端口的socket通过流的形式到达了服务端,就会被绑定指定端口的ServerSocket这个对象accept()侦听到。然后连接就被建立了。然后客户端和服务端获取socket的输入流和输出流实现数据的传输。
至于你说的这两个对象是否是同一个对象,我认为不是的。毕竟他们一个属于客户端,一个属于服务端。
作者: 曹宇    时间: 2013-6-1 10:37
第一个问题:如果此时s还没建立自己的InputStream话,那么s1获取的InputStream是哪来的
一般情况下 是服务器开启早于客户端。  服务器有accept方法,你没有客户端 就是所谓的s还没建立自己的InputStream,那么accept就阻塞在那里。因为accept是阻塞式方法,当s建立了自己的InputStream后 accept才能获取到客户端对象,然后s1才能获取s!

第二个问题:  accept获取到的是客户端的对象,而不是客户端的输出流。也就是说客户端在传输数据的时候,还将自己的对象传输了去,服务器得到了客户端对象
也就是 new Socket = s;    然后服务器获取到的是独立客户端的Socket对象。   而服务器会接受数据,那么对于独立的Socket对象来说,服务器接受的 那么对于它来说就是Input  服务器发送的 就是Output


语言组织不好,还望你能理解。
作者: yp324    时间: 2013-6-1 10:40
擦,版主一下给加了10分技术分,这是嘛情况。元芳你怎么看?
作者: 、__WSD吴少东    时间: 2013-6-1 19:01
1. s1 可以把他理解成是s 的镜像,或者说是复制体,具有s的所有功能并且还能够新建其s所未开启的功能

2.  关于输入输出可以这样理解下吧,客户端将需求传递给服务端,服务端将客户端的需求所对应的信息传递给客户端。那么,这里是不是就涉及到了一个写入数据到服务端,并读取服务端写入的数据,另一个读取客户端的数据到服务端,并将客户端所需要的数据写入到客户端...

So  这里就是客户端将需求写入IO流  然后服务端就读取IO流里面的数据,然后...
     服务端将客户端需要的数据写入IO流中 然后....客户端再读取IO流里面的内容, 刷新,分行...数据就出来了

大概就是这样子了,   还有不懂的我暂时也帮不上咯  
作者: w270307032    时间: 2013-6-3 11:50
不好意思大家,很感谢大家的回复,前两天有点事,一直没时间上网,今天上网才把帖子状态改下




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2