2012-06-22 22 views
6

Estoy haciendo un programa en 2 partes.Socket - Java Client, C# Server

Parte 1: C-server-socket Aplicación que se ejecuta en PC, escucha los comandos y actúa en consecuencia.

Parte 2: aplicación de socket de cliente de Java que se ejecuta en el teléfono, que envía un comando a la PC, cuando se presiona un botón.

Actualmente, puedo enviar comandos desde el cliente al servidor, y todo está bien. Pero mi problema es este: cuando envío un comando específico al servidor, quiero que el servidor responda al cliente y el cliente lo lea.

Lo único es que, cuando el cliente intenta leer, se agota el tiempo de espera.

programa Java cliente:

class ClientThread implements Runnable 
{ 
    public void run() 
    { 
     try 
     { 
      Socket socket = new Socket(serverIpAddress, serverPort); 
      socket.setSoTimeout(5000); 

      while (true) 
      { 
       try 
       { 
        PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); 
        Log.d("Nicklas", "Out it goes"); 
        out.println(Command); 

        if (Command == "CMD:GetOptions<EOF>") 
        { 
         Log.d("Nicklas", "Getting options"); 
         try 
         { 
          Log.d("Nicklas", "Line 1"); 
          BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
          Log.d("Nicklas", "Line 2"); 
          String answer = in.readLine(); 
          Log.d("Nicklas", "answer = " + answer); 
         } 
         catch (Exception ee) 
         { 
          Log.d("Nicklasasasas", ee.toString()); 
         } 
        } 
        break; 

       } 

       catch (Exception e) 
       { 
        Log.d("Nicklas", "CAE = " + e.toString()); 
        break; 

       } 
      } 
      socket.close(); 
     } 
     catch (ConnectException ee) 
     { 
      Log.d("Nicklas", "Kunne ikke forbinde"); 

     } 
     catch (Exception e) 
     { 
      Log.d("Nicklasssssss", e.toString()); 
     } 
    } 
} 

esto se le llama con:

Thread cThread = new Thread(new ClientThread()); 
     cThread.start(); 

y utiliza la variable global "Comando", que contendrá información diferente, dependiendo de qué botón se ha pulsado.

El programa falla en la línea "String answer = in.readline();" con la excepción "java.net.SocketTimeoutException".

Esta es la parte C# servidor del programa:

private void ListenForClients() 
    { 
     this.tcpListener.Start(); 

     while (true) 
     { 
      //blocks until a client has connected to the server 
      TcpClient client = this.tcpListener.AcceptTcpClient(); 

      //create a thread to handle communication 
      //with connected client 
      Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm)); 
      clientThread.Start(client); 
     } 
    } 

    private void HandleClientComm(object client) 
    { 
     TcpClient tcpClient = (TcpClient)client; 
     NetworkStream clientStream = tcpClient.GetStream(); 

     byte[] message = new byte[4096]; 
     int bytesRead; 

     while (true) 
     { 
      bytesRead = 0; 

      try 
      { 
       //blocks until a client sends a message 
       bytesRead = clientStream.Read(message, 0, 4096); 
      } 
      catch 
      { 
       //a socket error has occured 
       break; 
      } 

      if (bytesRead == 0) 
      { 
       //the client has disconnected from the server 
       break; 
      } 

      //message has successfully been received 
      ASCIIEncoding encoder = new ASCIIEncoding(); 
      //System.Diagnostics.Debug.WriteLine(encoder.GetString(message, 0, bytesRead)); 
      string Input = (encoder.GetString(message, 0, bytesRead)); 
      Input = Input.Trim(); 
      object[] obj = new object[1]; 
      obj[0] = Input; 
      if (Input == "CMD:GetOptions<EOF>") 
      { 
       try 
       { 
        byte[] buffer = encoder.GetBytes("CMD:Accepted"); 
        clientStream.Write(buffer, 0, buffer.Length); 
        clientStream.Flush(); 
        MessageBox.Show("Client program asked for reply"); 
       } 
       catch (Exception e) 
       { 
        MessageBox.Show("Oh it no work!: " + e.ToString()); 
       } 
      } 
      else 
      { 
       Udfor(Input); 
      } 


     } 

     tcpClient.Close(); 
    } 

Llamado con lo siguiente, en el Form1()

this.tcpListener = new TcpListener(IPAddress.Any, 4532); 
this.listenThread = new Thread(new ThreadStart(ListenForClients)); 
this.listenThread.Start(); 

El C# servidor parece funcionar bien, y sí muestra la messagebox "programa cliente pedido respuesta"

¿Alguien que puede detectar el error?

+0

¿Tiene algún problema con que el cliente no parezca recibir una respuesta del servidor? SocketTimeoutException se lanza cuando el socket no recibe respuesta dentro del tiempo de espera dado, 5 segundos en su ejemplo. ¿Estás seguro de que el servidor está enviando la respuesta? – Kerry

+0

Bueno, no estoy 100% seguro, pero el 99% # Programa C: si (Entrada == "CMD: getOptions ") { byte [] buffer = encoder.GetBytes (" CMD: Aceptado"); clientStream.Write (buffer, 0, buffer.Length); clientStream.Flush(); MessageBox.Show ("Oh, quería opciones de zeh"); } Esto se ejecuta después de recibir un mensaje. También muestra el messageBox al final, así que estoy bastante seguro de que envía la respuesta – user1285334

Respuesta

1

¡Lo descubrí! El problema era el C#. Cuando el servidor devolvió el comando "CMD: aceptado", nunca cerró el socket, por lo que la aplicación de Android no tenía idea de decir si se había terminado de leer. Cerrar el enchufe justo después de enjuagar + por supuesto no cerrarlo nuevamente si ya lo hice, ¡lo hice!