title: Android Socket Exception "socket is closed"
body: <p>When I try to run a test composed of an echo server and an android client with the following code, I always get the exception msg "socket is closed". This code can simply send msg to server, and receive msg from server, but if you want to do both at the same time, it just doesn't work... I am very curious why it will lead to this kind of problem, and how should I fix it if I want it to be able to first send msg to echo server </p>
  
  <p>and then receive msg from echo server?</p>
  
  <pre><code>            // Server IP address 
              InetAddress serverIp;
  
              // try to connect Server
              try {
  
                  // set up server IP address
                  serverIp = InetAddress.getByName("192.168.17.1");
  
                  // set up port
                  int serverPort=12345;
  
                  // initiate socket connection
                  Socket clientSocket=new Socket(serverIp,serverPort);
  
                  BufferedOutputStream out = new BufferedOutputStream(clientSocket.getOutputStream());
                  out.write("Send From Android1111, stitch ".getBytes());
                  out.flush();
  
                  //wait to receive Server's msg 
                  BufferedReader  br =new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
  
                  total.toString();*/
              // Display received msg with Toast
                  Toast.makeText(getApplicationContext(), br.readLine(), Toast.LENGTH_SHORT ).show();
  
              //close connection
                  clientSocket.close();             
  
  //              out.close();
  //              out = null;
              } catch (IOException e) {
                  // display exception with Toast
                  Toast.makeText(getApplicationContext(),e.toString(), Toast.LENGTH_SHORT).show();
              }
  </code></pre>
  
  <hr>
  
  <p>unfortunately, it still doesn't work ...I followed your instruction and modify the code to: </p>
  
  <pre><code>            // set up Server IP address 
              serverIp = InetAddress.getByName("192.168.2.2");
  
              // set up Server port
              int serverPort=12345;
  
              // initiate socket connection
              Socket clientSocket=new Socket(serverIp,serverPort);
  
                  // open input and output stream
              OutputStream out = clientSocket.getOutputStream();
              InputStream in = clientSocket.getInputStream();
  
              //send msg
              out.write("Send From Android1111, bitch ".getBytes());
  
  
                  // receive msg from server
              byte[] buffer = new byte[in.available()];
              in.read(buffer);
              String rMsg = new String(buffer);
              Toast.makeText(getApplicationContext(), rMsg, Toast.LENGTH_LONG ).show();
  
              //close input and output stream
              in.close();
              out.close();
  
               //關閉連線
         clientSocket.close(); 
          } catch (IOException e) {
              // 出錯後顯示錯誤訊息Toast
              Toast.makeText(getApplicationContext(),e.toString(), Toast.LENGTH_SHORT).show();
          }
  </code></pre>
  
  <p>for helper's convenience, here's the python written code for server part:</p>
  
  <pre><code># Practice Echo Server Program written in Python
  import socket
  
  # host = '' means it binds to any available interface
  host = ''
  port = 12345
  
  # socket() function returns a socket object whose methods implement the various socket system calls.
  s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  
  # Bind the socket to address. 
  s.bind((host,port))
  
  # Listen for connections made to the socket. The backlog argument specifies 
  # the maximum number of queued connections and should be at least 0; 
  # the maximum value is system-dependent (usually 5), the minimum value is forced to 0.
  s.listen(5)
  
  # Accept a connection. The socket must be bound to an address and listening for 
  # connections. The return value is a pair (conn, address) where conn is a new socket 
  # object usable to send and receive data on the connection, and address is the address
  # bound to the socket on the other end of the connection.
  conn, addr = s.accept()
  print 'Connected by', addr
  
  # Receive data from the socket. The return value is a string representing the data received.
  # The maximum amount of data to be received at once is specified by bufsize. See the Unix
  # manual page recv(2) for the meaning of the optional argument flags; it defaults to zero.
  # Note For best match with hardware and network realities, the value of bufsize should be 
  # a relatively small power of 2, for example, 4096.
  
  while 1:
      data = conn.recv(1024)
      if not data: break 
      print 'received data is : ', repr(data)
      conn.send(data)
  
  conn.close()
  </code></pre>