黑马程序员技术交流社区

标题: 网络编程的问题 [打印本页]

作者: 周洋    时间: 2012-4-7 17:40
标题: 网络编程的问题
java网络编程的问题,A,B通过socket连接起来了,当A使用PrintWriter.println()发送信息后,B则用BufferedReader.readLine()读取。问题是:在A使用println()到B使用readLine()的这段时间里,A用println发送的信息到哪里去了?是还没有发送出去(只发送了传送信息的请求),还是已经发送到了B的电脑只是B还未使用?
作者: 郑苑东    时间: 2012-4-7 17:48
其实是出去了。。不过如果服务器端开了。。那么这些信息就会被接受到。。如果没有那么。。over。。他就只是管发。。当B已收到信息就会自己调用readLine方法读取。。。
作者: 翟友伟    时间: 2012-4-7 17:52
客户端OutputStream out =s.getOutputStream();
服务端InputStream in= s.getInputStream();
你不通过socket流怎么传输和接受数据
socket底层原理  跟tcp还是 7层的那个 协议 有关   具体在物理层 传输层 链路层 应用层怎么操作的 咱们不需要知道吧。
作者: 翟友伟    时间: 2012-4-7 17:57
具体我记得毕老师视频中有简单介绍了下
客户端 请求连接    发送什么 有附加 信息   代码的  什么 GET / HTTP/1.1")  Host:121.9.238.94:80" Content-Type:text/html"{正文代码}
不同层会对代码进行 筛选处理
具体看下 视频  
作者: 王运科    时间: 2012-4-7 18:05
应该是直接发到了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的缓冲复制到应用程序提供的缓冲区里

作者: 郑涛    时间: 2012-4-7 22:04
让我们用一张图来说明问题。

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

socket.jpg

作者: pray    时间: 2014-4-26 04:20
不为楼主的标题所吸引,也不是被贴子的内容所迷惑。我不是来抢沙发的,也不是来打酱油的。我不是来为楼主呐喊加油的,也不是对楼主进行围堵攻击的。我只是为了积分默默奋斗。你是个美女,我不会嫉妒; 你是个怪兽,我绝不在意; 你是个帅哥,我毫不关心; 你是个畜男我也不会鄙视。




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