2013-11-28 14 views
8

Ho trovato un tutorial ben scritto here per la comunicazione client del server su Android. Funziona come un fascino. Ma è solo una modalità di comunicazione. Sto cercando di ascoltare la risposta del server nel client, ma non so dove sono sbagliato qui. Ecco il codice per il server in cui sto cercando di apportare modifiche.Comunicazione client TCP Server Android

Server

public class Server extends Activity { 

    private ServerSocket serverSocket; 

    Handler updateConversationHandler; 

    Thread serverThread = null; 

    private TextView text; 



    public static final int SERVERPORT = 8080; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     text = (TextView) findViewById(R.id.text2); 

     updateConversationHandler = new Handler(); 

     this.serverThread = new Thread(new ServerThread()); 
     this.serverThread.start(); 

    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     try { 
      serverSocket.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    class ServerThread implements Runnable { 

     public void run() { 
      Socket socket = null; 
      try { 
       serverSocket = new ServerSocket(SERVERPORT); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      while (!Thread.currentThread().isInterrupted()) { 

       try { 

        socket = serverSocket.accept(); 

        CommunicationThread commThread = new CommunicationThread(socket); 
        new Thread(commThread).start(); 

       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

    class CommunicationThread implements Runnable { 

     private Socket clientSocket; 

     private BufferedReader input; 

     public CommunicationThread(Socket clientSocket) { 

      this.clientSocket = clientSocket; 

      try { 

       this.input = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream())); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

     public void run() { 


      while (!Thread.currentThread().isInterrupted()) { 

       try { 

        String read = input.readLine(); 

        if (read == null){ 
         Thread.currentThread().interrupt(); 
        }else{ 
         BufferedWriter out = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream())); 
         out.write("TstMsg"); 
         updateConversationHandler.post(new updateUIThread(read)); 

        } 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 

    } 

    class updateUIThread implements Runnable { 
     private String msg; 

     public updateUIThread(String str) { 
      this.msg = str; 
     } 

     @Override 
     public void run() { 
      text.setText("Client Says: "+ msg + new Date() + "\n"); 

     } 

    } 

} 

client

public class Client extends Activity { 

    private Socket socket; 

    private static final int SERVERPORT = 8080; 
    private static final String SERVER_IP = "192.168.104.107"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main);  
        new Thread(new ClientThread()).start(); 

    } 


    public void onClick(View view) { 
     try { 
      EditText et = (EditText) findViewById(R.id.EditText01); 
      String str = et.getText().toString(); 
      PrintWriter out = new PrintWriter(new BufferedWriter(
        new OutputStreamWriter(socket.getOutputStream())), 
        true); 
      out.println(str); 
      out.flush(); 
      BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      String read = in.readLine(); 
      System.out.println("MSG:" + read); 

     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    class ClientThread implements Runnable { 

     @Override 
     public void run() { 

      try { 
       InetAddress serverAddr = InetAddress.getByName(SERVER_IP); 
       socket = new Socket(serverAddr, SERVERPORT); 

      } catch (UnknownHostException e1) { 
       e1.printStackTrace(); 
      } catch (IOException e1) { 
       e1.printStackTrace(); 
      } 

     } 

    } 
} 

Aggiornamento

Quando client invia alcun messaggio al server il messaggio viene ricevuto dal server, ma quando il server invia la sua risposta

BufferedWriter out = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream())); 
out.write("TstMsg"); 

e client

String read = in.readLine(); 
System.out.println("MSG:" + read); 

E dose non ha ricevuto dal cliente o possiamo dire server di ascoltare i clienti messaggio ma client non. Ho aggiunto entrambe le autorizzazioni in manifest.

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

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" > 
</uses-permission> 

Aggiornamento Dopo una lunga appendere viene questi errori.

11-28 18:35:45.786: E/GTalkService(292): connectionClosed: no XMPPConnection - That's strange! 
11-28 18:35:48.806: D/ConnectivityService(148): handleInetConditionHoldEnd: net=1, condition=0, published condition=0 
11-28 18:35:54.526: I/GTalkService/c(292): [[email protected]] connect: acct=1000000, state=CONNECTING 
11-28 18:35:55.176: D/dalvikvm(1167): GC_CONCURRENT freed 495K, 9% free 6604K/7239K, paused 2ms+3ms 
11-28 18:35:55.226: D/Finsky(1167): [1] 5.onFinished: Installation state replication succeeded. 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): Problem with socket or streams. 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): java.net.ConnectException: failed to connect to www.google-analytics.com/173.194.39.41 (port 80): connect failed: ETIMEDOUT (Connection timed out) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at libcore.io.IoBridge.connect(IoBridge.java:114) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at java.net.Socket.connect(Socket.java:842) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at com.google.android.apps.analytics.t.run(Unknown Source) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at android.os.Handler.handleCallback(Handler.java:605) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at android.os.Handler.dispatchMessage(Handler.java:92) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at android.os.Looper.loop(Looper.java:137) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at android.os.HandlerThread.run(HandlerThread.java:60) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): Caused by: libcore.io.ErrnoException: connect failed: ETIMEDOUT (Connection timed out) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at libcore.io.Posix.connect(Native Method) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at libcore.io.IoBridge.connectErrno(IoBridge.java:127) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at libcore.io.IoBridge.connect(IoBridge.java:112) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): ... 9 more 
11-28 18:37:29.016: D/dalvikvm(349): GC_CONCURRENT freed 1258K, 35% free 8238K/12487K, paused 2ms+8ms 
+0

u hanno fornito il permesso di internet sia in progetto ??? –

+1

Che cos'è, il tuo problema, spiegalo bene, stai dicendo che funziona come un incantesimo ma non so dov'è il problema –

+0

grazie per l'interesse Ho aggiornato la domanda. – user934820

risposta

1

Non sono ancora sicuro di cosa stai cercando di ottenere. Il tuo errore -log mostra un XMPPConnection - Errore. XMPP non viene gestito sulla porta che stai utilizzando nel codice pubblicato, quindi questo messaggio di errore potrebbe provenire da una parte diversa della tua applicazione. L'altro messaggio di errore è relativo a un HTTP - Connessione per Google analytics e nessuno dei due è legato allo snippet di codice che hai postato. Dovresti downtrace il tuo problema: rilevando eventuali eccezioni, Log.d con un tag puoi filtrare il tuo errore - messaggi di. Il suggerimento di Martin James è buono, penso, quindi provando a passare a una lettura in byte per il proprio inputstream almeno per la verifica e la downtracing se si ricevono dati dal server - la connessione è anche una buona idea.

+0

Ho aggiunto l'intera classe – user934820

1

readLine() si aspetta una riga effettiva: "Una riga viene considerata terminata da uno qualsiasi di un avanzamento riga ('\ n'), un ritorno a capo ('\ r') o un ritorno a capo seguito immediatamente da un linefeed. '

Si consiglia pertanto di inviare uno, ad es. con BufferedWriter.newLine().

+0

Per prima cosa ho provato con l'aggiunta di "\ n" ma non ha funzionato. Ho appena provato di nuovo aggiungendo una nuova linea. Ma il client si blocca quando riceve la risposta dal server e dopo un lungo blocco non restituisce altro che numerosi errori. Ho aggiornato la traccia dello stack. – user934820

0

Hai scritto il seguente frammento nel codice

out.flush(); 

dopo

BufferedWriter out = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream())); 
out.write("TstMsg"); 
0

Avete provato ad aggiungere una nuova linea ("\n") quando si tenta di scrivere? Prova invece a out.write("TstMsg"+ "\n").

-5

Se si sta tentando di connettersi a un server Web. Per quanto ne so il server web gestisce il protocollo http e stai cercando di connetterti a un server web semplicemente con TCP/IP usando il socket. Non si otterrà una risposta attesa in quanto si sta violando lo standard del protocollo.l'opzione sarebbe se si desidera connettersi a un server Web o si utilizzano le classi relative HttpURLConnection Android o si crea il proprio server delle applicazioni utilizzando le classi relative severSocket in qualsiasi linguaggio di programmazione per gestire i client.

-1
final Socket s = new Socket(); 
s.connect(new InetSocketAddress(mHost, mPort), 20000); 
final DataOutputStream dos = new DataOutputStream(s.getOutputStream()); 
dos.write(("This is a message." + "\r\n").getBytes()); 
dos.flush(); 

alternativa:

BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); 
String outgoingMsg = "This is a message." + System.getProperty("line.separator"); 
out.write(outgoingMsg); 
out.flush();