2011-09-04 128 views
2
OutputStreamWriter out = new OutputStreamWriter(sock.getOutputStream()); 

out.write(data); 
out.flush(); 

sock - Socket;数据 - 字符缓冲区;Android:OutputStreamWriter在刷新后没有发送数据(套接字)

因此,如果我不会关闭“out”或“sock”,那么就没有数据会被发送到服务器。

OutputStreamWriter out = new OutputStreamWriter(sock.getOutputStream()); 

out.write(data); 
out.close(); 

很好。但为什么?

+0

这不应该发生。关闭输出流将关闭套接字,这有时绝对不是你想要的。你确定没有数据被发送到服务器?套接字是否包裹了一个频道? –

+0

是的,我确定。服务器端恶魔也是由我写的。所以我有很多调试信息。套接字是包装?这是关于什么的? –

+0

如果套接字是从[SocketChannel](http://developer.android.com/reference/java/nio/channels/SocketChannel.html)创建的,则套接字封装通道。既然你问这是什么意思,我猜你的套接字没有包装一个频道。 –

回答

0

flush()只将Java/Android的应用程序级缓冲区刷新到TCP堆栈。一旦出现这种情况,可以通过操作系统的TCP实施进一步推迟尝试有效使用传输数据包并等待更多数据的操作系统。 (如果需要更多详细信息,请搜索“Nagle算法”。)

每次写入套接字都没有办法刷新TCP缓冲区,但可以将套接字配置为在可能时立即发送缓冲区中的所有数据,通过设置TCP_NODELAY

有关该主题的更多信息,请参阅Java ObjectOutputStream on Socket not flush()ing

+0

正如我已经很伤心:“...我的服务器套接字处于接收状态MSG_WAITALL标志” –

相关问题