2017-10-13 6 views
1

C'est la première fois que je programme un socket.
Mon exigence est que le client android pose une question et reçoive la réponse du serveur ubuntu via socket.
Dans mon côté client, je crée à la fois BufferedInputStream et BufferedInputStream à partir de mon socket.BufferedOutputStream.close() laissera BufferedInputStream être fermé?

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()); 

Je l'expérience d'un comportement étrange: Comme mon client envoie la demande de outputStream et appeler sa proximité(), puis appelez inputStream.read() va se java.net.SocketException: Socket est fermé erreur . Mais mon client.isConnected() retourne toujours vrai.

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(); 
} 

Je sais que je peux éviter cela si je n'appelle pas outputStream.close(). Mais je suis juste très curieux de savoir pourquoi cela arrive? Est-ce un résultat normal?

+0

Oui, si vous fermez un flux, les autres flux seront également fermés. Et la prise. – greenapps

+0

Fermez votre flux dans le bloc finally – HomeIsWhereThePcIs

+0

Avez-vous vérifié le serveur en cas de fermeture accidentelle de la connexion? – Robert

Répondre

1

La fermeture d'un flux d'entrée de socket ou d'un flux de sortie appellera la fermeture du socket lui-même. Vous n'avez donc pas besoin de les fermer si vous ne souhaitez pas fermer la connexion.

En ce qui concerne votre chèque s'il vous plaît se référer à javadoc sur Socket#isConnected() méthode (https://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#isConnected())

booléenne isConnected() publique

Renvoie l'état de connexion de la prise.

Remarque: la fermeture d'un socket n'efface pas son état de connexion, ce qui signifie que cette méthode renvoie true pour un socket fermé (voir isClosed()) s'il a été connecté avec succès avant d'être fermé.