2012-06-22 20 views
6

Sto creando un programma in 2 parti.Socket - Client Java, server C#

Parte 1: C# server-socket Applicazione in esecuzione su PC, in attesa di comandi e atti di conseguenza.

Parte 2: applicazione client-socket Java in esecuzione sul telefono, che invia un comando al PC, quando viene premuto un pulsante.

Attualmente, posso inviare comandi dal client al server, e va tutto bene. Ma il mio problema è questo: quando invio un comando specifico al server, voglio che il server risponda al client e che il client legga quella risposta.

Ciò che è appena, quando il client tenta di leggere, è timeout.

programma Java client:

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

questo si chiama con:

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

e usa la variabile globale "Command", che conterrà informazioni diverse, a seconda di quale tasto è stato premuto.

Il programma non riesce sulla riga "String answer = in.readline();" con l'eccezione "java.net.SocketTimeoutException".

Questa è la parte C# server del programma:

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

Chiamato con il seguente, nel Form1()

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

Il C# Server sembra funzionare bene, e non mostra la messagebox "programma client richiesto risposta"

Chi può individuare l'errore?

+0

È un problema che il client non sembra ricevere una risposta dal server? SocketTimeoutException viene generato quando nessuna risposta viene ricevuta dal socket entro il timeout specificato, 5 secondi nell'esempio. Sei sicuro che il server stia inviando la risposta? – Kerry

+0

Beh, im non sicuro al 100%, ma il 99% C# Programma: se (ingresso == "cmd: GetOptions ") { byte [] = tampone encoder.GetBytes (" CMD: Accettato"); clientStream.Write (buffer, 0, buffer.Length); clientStream.Flush(); MessageBox.Show ("Oh voleva le opzioni zeh"); } Questo viene eseguito dopo che un messaggio è stato ricevuto. Inoltre mostra il messageBox alla fine, quindi sono abbastanza sicuro che invii la risposta – user1285334

risposta

1

L'ho capito! Il problema era il C#. Quando il server ha restituito il comando "CMD: Accepted", non ha mai chiuso il socket, quindi l'applicazione Android non ha idea di dire se è stata fatta la lettura! Chiudere il socket subito dopo il flush + ovviamente non chiuderlo di nuovo se l'avessi già fatto, ha fatto il trucco!