2 aabbwoshishei aabbwoshishei 于 2013.11.04 20:50 提问

java为什么flush( )方法不能输出数据,一定要close( )才行?

服务端:
ServerSocket ss=new ServerSocket(40006);
while(true)
{
Socket s=ss.accept();
OutputStream os=s.getOutputStream();
os.write("北京".getBytes());
os.flush();//这里改成os.close( ),客户端就能读到,这是为什么啊?
}

客户端:
try {
Socket s=new Socket("192.168.0.110",40006);
InputStream ins=s.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(ins));
String line;
while((line=br.readLine())!=null)
{
System.out.println(line);
}

6个回答

aabbwoshishei
aabbwoshishei   2013.11.04 22:23
已采纳

知道了,BufferedReader是根据“\n”或者“\r”来判断一行的,而这里的服务端根本就没有输入这两个符号,也许close()方法会自动给它加上吧。如果服务端手动给它加上这两个符号中的一个,就可以读出来了。

szsweet
szsweet 在要输入的内容后加下换行符号,os.write("北京\n".getBytes());
11 个月之前 回复
lhf_115
lhf_115 然后,直接用ps.println(str),就可以发送了,ps.flush()和socket.shutdownOutput(),都不用?是这样吗?
一年多之前 回复
lhf_115
lhf_115 楼主你好,在进行发送信息时,我用的Printstream ps = new PrintStream(socket.getOutputStream),
一年多之前 回复
lhf_115
lhf_115 额六年后
一年多之前 回复
ll_0520
ll_0520   2013.11.05 09:08

while((line=br.readLine())!=null)你这里是读一行数据,你应该在发送数据的适当位置手动加入回车或结束符。
os.close( )我猜测加入的是结束符

aabbwoshishei
aabbwoshishei 嗯,我昨晚看API发现的
大约 4 年之前 回复
ygycomon
ygycomon   Rxr 2013.11.05 10:22

flush是输出到缓冲区,缓冲区没满的话不发送,close的动作会强制把缓冲区里没发送的东西发送出去

ygycomon
ygycomon 嗯,对,是加入了一个换行符
大约 4 年之前 回复
aabbwoshishei
aabbwoshishei 缓冲区满不满都发送的吧?只是没有表示结束的符号,所以客户端会阻塞
大约 4 年之前 回复
dongtianliubuzhu
dongtianliubuzhu   2013.12.04 17:24

close连套接字都关闭了,当然出来了,flush只是清理缓冲区。而且你这个用了缓冲流也没建立缓冲啊

hxh1311
hxh1311   2014.11.20 17:14

OutputStream 这个类的flush()方法不执行任何代码,需要其他的输出流去重写这个方法的

Ryetal
Ryetal   2017.03.08 23:16

客户端的readline是阻塞的,只有读到尾部才会返回null,你在服务器端不调用close,socket没有关闭,那么客户端的readline就一直阻塞在那(也没有读到一行),所以没有输出

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!