2012-01-12 27 views
5

Cuando intento ejecutar una prueba compuesta de un servidor de eco y un cliente de Android con el siguiente código, siempre aparece la excepción msg "socket is closed". Este código simplemente puede enviar msg al servidor y recibir msg del servidor, pero si quieres hacer ambas cosas al mismo tiempo, simplemente no funciona ... Tengo mucha curiosidad sobre por qué te llevará a este tipo de problema, y ¿cómo debo solucionarlo si quiero que primero pueda enviar msg al servidor de ecoAndroid Socket Exception "socket está cerrado"

y luego recibir msg del servidor de eco?

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

por desgracia, todavía no funciona ... He seguido sus instrucciones y modificar el código para:

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

para la conveniencia del ayudante, aquí está el pitón código escrito por parte del servidor :

# 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

Trate de no publicar el lenguaje "ofensiva" en sus entradas aquí. Gracias. Lo arreglé por ti. – prolink007

Respuesta

5

Supongo que está haciendo lo correcto en el orden incorrecto. Puede ser que el servidor sea demasiado rápido y cuando intente leer la respuesta ya haya sido recibido y desaparecido.

Siguiendo las reglas presentadas en el tutorial Reading from and Writing to a Socket

  1. abrir un socket
  2. Abrir un flujo de entrada y flujo de salida para el zócalo.
  3. Lea y escriba en la transmisión de acuerdo con el protocolo del servidor.
  4. Cierre las transmisiones.
  5. Cierre el zócalo.

¿Ves la diferencia? Primero abra la secuencia de entrada y salida y luego comience a enviar su solicitud.

Estoy seguro de que si te apegas a este orden, funcionará.

+0

no ... aún no funciona para mí ... tan raro ... solo el brindis muestra cadena en blanco esta vez ... raro ... – shanwu

+1

@ user1145976 Por favor, no publique el código como respuesta. Simplemente actualiza tu pregunta. con respecto al código que está utilizando _in.available() _ que funciona solo bajo ciertas circunstancias. Por lo tanto, no lo use. Simplemente use el código de muestra que me ha gustado con un BufferedReader y _readLine() _. – Robert

-1

Su aplicación necesita permisos de Internet en su AndroidManifest.xml

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

Lo hice, no funciona. – shanwu

+0

Eso no causa excepciones 'socket closed'. – EJP

Cuestiones relacionadas