2012-01-12 15 views
5

Kiedy próbuję uruchomić test złożony z serwera echa i klienta Android z następującym kodem, zawsze otrzymuję komunikat msg "socket is closed". Ten kod może po prostu wysłać msg do serwera i odebrać wiadomość z serwera, ale jeśli chcesz robić obie jednocześnie, to po prostu nie działa ... Jestem bardzo ciekawy, dlaczego doprowadzi to do tego rodzaju problemu, i jak mam to naprawić, jeśli chcę, aby najpierw mógł wysłać msg do serwera echaWyjątkowe gniazdo Android "Gniazdo jest zamknięte"

, a następnie odebrać wiadomość z serwera echa?

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

niestety, to nadal nie działa ... I po instrukcji i modyfikować kod do:

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

dla wygody Pomocników, oto pyton napisany kod strony serwera :

# 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() 
+3

Staraj się nie pisać „obraźliwych” języka w swoich postach tutaj. Dziękuję Ci. Naprawiłem to dla ciebie. – prolink007

Odpowiedz

5

Zakładam, że robisz właściwe rzeczy w złej kolejności. Być może serwer jest zbyt szybki i kiedy próbujesz odczytać odpowiedź, jest ona już odbierana i znika.

Zgodnie z zasadami przedstawionymi w tutorialu Reading from and Writing to a Socket

  1. Otwórz gniazdo
  2. Otwórz strumień wejściowy i wyjściowy strumień do gniazda.
  3. Odczytywanie i zapisywanie do strumienia zgodnie z protokołem serwera.
  4. Zamknij strumienie.
  5. Zamknij gniazdko.

Czy widzisz różnicę? Najpierw otwórz strumień wejściowy i wyjściowy, a następnie zacznij wysyłać żądanie.

Jestem pewien, że jeśli będziesz trzymać się tego zamówienia, zadziała.

+0

nie ... nadal nie działa dla mnie ... tak dziwne ... to tylko toast pokaż pusty ciąg tym razem ... dziwne ... – shanwu

+1

@ user1145976 Proszę nie zamieszczaj kodu jako odpowiedzi. Po prostu zaktualizuj swoje pytanie. dotyczące kodu, którego używasz _in.available() _, który działa tylko w pewnych okolicznościach. Dlatego nie używaj go. Po prostu użyj przykładowego kodu, który mi się podobał przy pomocy BufferedReader i _readLine() _. – Robert

-1

Aplikacja wymaga zgody Internetu AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET"/> 
+0

Zrobiłem, to nie działa. – shanwu

+0

To nie powoduje wyjątków "zamkniętych w gnieździe". – EJP