2012-04-09 46 views
6

Estoy desarrollando una aplicación Android (cliente) y quiero que se conecte con mi servidor Java utilizando la comunicación TCP.Cliente Android y comunicación TCP del servidor Java

que he hecho el código - programa sencillo, el cliente de enviar un mensaje de servidor y ecos de TI hacia atrás - como abajo:

código del servidor:

import java.net.*; 


public class Server { 

    public static void main(String[] args) { 

     int nreq = 1; 
     try 
     { 
      ServerSocket sock = new ServerSocket (8080); 
      for (;;) 
      { 
       Socket newsock = sock.accept(); 
       System.out.println("Creating thread ..."); 
       Thread t = new ThreadHandler(newsock,nreq); 
       t.start(); 
      } 
     } 
     catch (Exception e) 
     { 
      System.out.println("IO error " + e); 
     } 
     System.out.println("End!"); 
    } 
} 

un código thread que se encarga en el mismo archivo de proyecto del servidor:

import java.io.*; 
import java.net.*; 

class ThreadHandler extends Thread { 
    Socket newsock; 
    int n; 

    ThreadHandler(Socket s, int v) { 
     newsock = s; 
     n = v; 
    } 


    public void run() { 
     try { 

      PrintWriter outp = new PrintWriter(newsock.getOutputStream(), true); 
      BufferedReader inp = new BufferedReader(new InputStreamReader(
        newsock.getInputStream())); 

      outp.println("Hello :: enter QUIT to exit \n"); 
      boolean more_data = true; 
      String line; 

      while (more_data) { 
       line = inp.readLine(); 
       System.out.println("Message '" + line + "' echoed back to client."); 
       if (line == null) { 
        System.out.println("line = null"); 
        more_data = false; 
       } else { 
        outp.println("From server: " + line + ". \n"); 
        if (line.trim().equals("QUIT")) 
         more_data = false; 
       } 
      } 
      newsock.close(); 
      System.out.println("Disconnected from client number: " + n); 
     } catch (Exception e) { 
      System.out.println("IO error " + e); 
     } 

    } 
} 

Y este es el lado del cliente (Android):

package com.android.client; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.Socket; 
import java.util.Scanner; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 

public class Client extends Activity { 
    /** Called when the activity is first created. */ 
    Scanner scanner = new Scanner(System.in); 

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

     final EditText msg = (EditText) findViewById(R.id.etMsg); 
     Button send = (Button) findViewById(R.id.bSend); 
     final TextView convo = (TextView) findViewById(R.id.tvConvo); 
     final TextView status = (TextView) findViewById(R.id.tvStatus); 

     try { 
      send.setOnClickListener(new View.OnClickListener() { 

       Socket s = new Socket("localhost", 8080); 
       String message = msg.getText().toString(); 

       @Override 
       public void onClick(View v) { 
        status.setText("..."); 
        PrintWriter outp = null; 
        BufferedReader inp = null; 
        status.setText("Established connection.."); 
        String serverMsg = null; 

        try { 
         outp = new PrintWriter(s.getOutputStream(), true); 
         inp = new BufferedReader(new InputStreamReader(s.getInputStream())); 
         serverMsg = inp.readLine(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
        convo.append(serverMsg + "\n"); 

        if (message != null) { 
         if (msg.getText().toString().trim() == "QUIT") { 
          try { 
           s.close(); 
          } catch (IOException e) { 
           e.printStackTrace(); 
          } 
          status.setText("Disconnected from server."); 

         } else { 
           try { 

            convo.append(message + "\n"); 
            outp.println(message); 
            serverMsg = inp.readLine(); 
            convo.append(serverMsg + "\n"); 
           } catch (IOException e) { 
            e.printStackTrace(); 
           } 
         } 

        } 
        else 
         status.setText("Problem in connection..!"); 
       } 
      }); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Y este es el archivo XML:

<?xml version="1.0" encoding="utf-8" ?> 
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> 
    <TextView android:id="@+id/tvText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Your message here:" /> 
- <EditText android:id="@+id/etMsg" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10"> 
    <requestFocus /> 
    </EditText> 
    <TextView android:id="@+id/tvStatus" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Status..." android:textAppearance="?android:attr/textAppearanceSmall" /> 
    <Button android:id="@+id/bSend" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Send" /> 
    <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Conversation:" android:textAppearance="?android:attr/textAppearanceLarge" /> 
    <TextView android:id="@+id/tvConvo" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" /> 
    </LinearLayout> 

traté de ejecutarlo, pero no pasa nada. Cuando hago clic en el botón, TextView no ve el mensaje "Hola" del servidor.

+0

¿Tiene '' establecido en su manifest.xml? – diewie

+0

Sí, hay un permiso de INTERNET –

Respuesta

9

Se conecta con su cliente Android al localhost.

Socket s = new Socket("localhost", 8080); 

Esto solo funcionará cuando su servidor se ejecute en el dispositivo Android. Pero creo que está funcionando en tu PC. Por lo tanto, cuando ejecuta su aplicación en el emulador de Android, puede conectarse al 10.0.2.2 para ponerse en contacto con el host. En un dispositivo real, debe averiguar la dirección IP de su servidor a la que puede acceder el dispositivo Android, p. a través de Wi-Fi.

+0

¡Muchas gracias! Eso funciono. –

+0

Hola Diewie, estoy tratando de conectar el cliente (Android) a mi PC a través de Internet, ¿cómo puedo hacer eso? - Intenté conectarlo a través de WiFi y funcionó reemplazando el 10.2.0.0 con la dirección IP de mi computadora portátil. –

+1

Esto solo funcionará, cuando su PC se puede alcanzar directamente desde Internet o existen las reglas de reenvío de puertos respectivas. ¿Cómo está tu configuración actual? – diewie

0

Si su servidor está en Windows, escriba cmd en el cuadro de búsqueda del menú Inicio y luego escriba ipconfig en el símbolo del sistema. Verás algo como IVP4 Address----- 192.168.0.101. necesita usar esta dirección y número de puerto en su cliente.

Cuestiones relacionadas