A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周洋 黑马帝   /  2012-4-7 17:40  /  2083 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

java网络编程的问题,A,B通过socket连接起来了,当A使用PrintWriter.println()发送信息后,B则用BufferedReader.readLine()读取。问题是:在A使用println()到B使用readLine()的这段时间里,A用println发送的信息到哪里去了?是还没有发送出去(只发送了传送信息的请求),还是已经发送到了B的电脑只是B还未使用?

6 个回复

倒序浏览
其实是出去了。。不过如果服务器端开了。。那么这些信息就会被接受到。。如果没有那么。。over。。他就只是管发。。当B已收到信息就会自己调用readLine方法读取。。。
回复 使用道具 举报
客户端OutputStream out =s.getOutputStream();
服务端InputStream in= s.getInputStream();
你不通过socket流怎么传输和接受数据
socket底层原理  跟tcp还是 7层的那个 协议 有关   具体在物理层 传输层 链路层 应用层怎么操作的 咱们不需要知道吧。
回复 使用道具 举报
具体我记得毕老师视频中有简单介绍了下
客户端 请求连接    发送什么 有附加 信息   代码的  什么 GET / HTTP/1.1")  Host:121.9.238.94:80" Content-Type:text/html"{正文代码}
不同层会对代码进行 筛选处理
具体看下 视频  
回复 使用道具 举报
应该是直接发到了b电脑的socket缓冲区里
谁来负责管理缓冲区?
对于使用socket接口和传输协议层交流的应用程序来说,AFD.SYS负责缓冲区的管理。也就是说,当一个程序调用send或WSASend函数发送数据的时候,数据被复制到AFD.SYS的内部缓冲里(大小根据SO_SNDBUF设置),然后send和WSASend立刻返回。之后数据由AFD.SYS负责发送到网络上,与应用程序无关。当然,如果应用程序希望发送比SO_SNDBUF设置的缓冲区还大的数据,WSASend函数将会被堵塞,直到所有数据均被发送完毕为止。
同样,当从远地客户端接受数据的时候,如果应用程序没有提交receive请求,而且线上数据没有超出SO_RCVBUF设置的缓冲大小,那么AFD.SYS就把网络上的数据复制到自己的内部缓冲保存。当应用程序调用recv或WSARecv函数的时候,数据即从AFD.SYS的缓冲复制到应用程序提供的缓冲区里
回复 使用道具 举报
让我们用一张图来说明问题。

socket.jpg (45.32 KB, 下载次数: 49)

socket.jpg
回复 使用道具 举报
pray 高级黑马 2014-4-26 04:20:27
7#
不为楼主的标题所吸引,也不是被贴子的内容所迷惑。我不是来抢沙发的,也不是来打酱油的。我不是来为楼主呐喊加油的,也不是对楼主进行围堵攻击的。我只是为了积分默默奋斗。你是个美女,我不会嫉妒; 你是个怪兽,我绝不在意; 你是个帅哥,我毫不关心; 你是个畜男我也不会鄙视。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马