这是我第一次使用socket程序。
我的要求是android客户端提出问题并通过socket从ubuntu服务器接收答案。
在我的客户端,我从套接字创建了BufferedInputStream和BufferedInputStream。
Socket client = new Socket();
InetSocketAddress isa = new InetSocketAddress(my_host, 8888);
client.connect(isa, 10000);
inputStream = new BufferedInputStream(client.getInputStream());
outputStream = new BufferedOutputStream(client.getOutputStream());
我遇到了一个奇怪的行为:当我的客户端通过outputStream发送请求并调用它的close()时,调用inputStream.read()将得到 java.net.SocketException:Socket已关闭 错误。但是我的client.isConnected()仍然返回true。
try {
outputStream.write("who_are_you".getBytes());
outputStream.flush();
outputStream.close(); // inputStream will be invalid if I call this line.
Log.i(TAG, "client: " + client.isConnected()); // client still return true
byte[] b = new byte[1024];
String data = "";
int length;
// I will receive java.net.SocketException: Socket is closed as I call below code
while ((length = inputStream.read(b)) > 0) // If length <= 0, it means exit.
{
Log.i(TAG, "receive message, length: " + length);
data += new String(b, 0, length);
Log.i(TAG, "receive message: " + data);
}
} catch (java.io.IOException e) {
Log.w(TAG, "socket connection fail");
e.printStackTrace();
}
我知道如果我不调用outputStream.close(),我可以避免这种情况。但我非常好奇为什么会这样?这是正常结果吗?
答案 0 :(得分:1)
关闭套接字输入流或输出流将在套接字本身上调用close。因此,除非要关闭连接,否则无需关闭它们。
关于您的支票,请参阅Socket#isConnected()
方法(https://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#isConnected())上的javadoc
public boolean isConnected()
返回套接字的连接状态。
注意:关闭套接字不会清除其连接状态,这意味着如果在关闭套接字成功连接之前,此方法将对已关闭的套接字返回true(请参阅isClosed())。