2011-09-12 57 views
21

Tengo una aplicación donde necesito crear una conexión de socket. Mi requerimiento es que, una vez que mi conexión de socket esté establecida, tenga que estar viva hasta que yo personalmente la cierre. Cada 3 minutos tengo que enviar paquetes de datos al otro extremo. ¿Alguien puede proporcionarme alguna muestra de código que me ayude a hacer esto?cómo crear una conexión de socket en Android?

+0

¿Estás tratando de crear un socket de servidor, por ejemplo, un socket al que otros se conectarán? –

+0

Peter gracias por preguntar. pero he resuelto lo mismo. muchas gracias –

+1

Sí, vi la respuesta que aceptó. Si planea ejecutar un servidor en un dispositivo móvil, vea mi comentario sobre esa respuesta. –

Respuesta

36

Las conexiones de socket en Android son los mismos que en Java: http://www.oracle.com/technetwork/java/socket-140484.html

cosas que hay que tener en cuenta:

  1. Si el teléfono se va a dormir a su aplicación ya no ejecutar, por lo que toma con el tiempo se se acabó el tiempo. Puedes evitar esto con el bloqueo por activación. Esto consumirá muchísimo la batería de los dispositivos: sé que no usaría esa aplicación.
  2. Si haces esto constantemente, incluso cuando tu aplicación no esté activa, entonces necesitas usar el Servicio.
  3. Las actividades y servicios pueden ser eliminados por el sistema operativo en cualquier momento, especialmente si son parte de una aplicación inactiva.

Eche un vistazo a AlarmManager, si necesita la ejecución programada de su código.

¿Necesita ejecutar su código y recibir datos incluso si el usuario ya no usa la aplicación (es decir, la aplicación está inactiva)?

+0

Para mí su respuesta es como más que nada. Encontré que todo necesitaba más que un simple socket. Muchas gracias hombre – bharath

4

simple servidor de socket ejemplo aplicación

Ya hemos publicado un ejemplo de cliente en: https://stackoverflow.com/a/35971718/895245, así que aquí va un ejemplo de servidor.

Esta aplicación de ejemplo ejecuta un servidor que devuelve una cifra ROT-1 de la entrada.

Luego necesitaría agregar un botón Exit + algunas demoras en el tiempo de espera, pero esto debería comenzar.

para jugar con él:

Sockets de Android son lo mismo que Java, excepto que tenemos que lidiar con algunos problemas de permisos.

src/com/cirosantilli/android_cheat/toma

Necesitamos un método fondo Service u otro o de lo contrario: How to fix android.os.NetworkOnMainThreadException?

package com.cirosantilli.android_cheat.socket; 

import android.app.Activity; 
import android.app.IntentService; 
import android.content.Intent; 
import android.os.Bundle; 
import android.util.Log; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintStream; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class Main extends Activity { 
    static final String TAG = "AndroidCheatSocket"; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.d(Main.TAG, "onCreate"); 
     Main.this.startService(new Intent(Main.this, MyService.class)); 
    } 

    public static class MyService extends IntentService { 
     public MyService() { 
      super("MyService"); 
     } 
     @Override 
     protected void onHandleIntent(Intent intent) { 
      Log.d(Main.TAG, "onHandleIntent"); 
      final int port = 12345; 
      ServerSocket listener = null; 
      try { 
       listener = new ServerSocket(port); 
       Log.d(Main.TAG, String.format("listening on port = %d", port)); 
       while (true) { 
        Log.d(Main.TAG, "waiting for client"); 
        Socket socket = listener.accept(); 
        Log.d(Main.TAG, String.format("client connected from: %s", socket.getRemoteSocketAddress().toString())); 
        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
        PrintStream out = new PrintStream(socket.getOutputStream()); 
        for (String inputLine; (inputLine = in.readLine()) != null;) { 
         Log.d(Main.TAG, "received"); 
         Log.d(Main.TAG, inputLine); 
         StringBuilder outputStringBuilder = new StringBuilder(""); 
         char inputLineChars[] = inputLine.toCharArray(); 
         for (char c : inputLineChars) 
          outputStringBuilder.append(Character.toChars(c + 1)); 
         out.println(outputStringBuilder); 
        } 
       } 
      } catch(IOException e) { 
       Log.d(Main.TAG, e.toString()); 
      } 
     } 
    } 
} 

AndroidManifest.xml

hay que añadir: <uses-permission android:name="android.permission.INTERNET" /> o de lo contrario: Java socket IOException - permission denied

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.cirosantilli.android_cheat.socket" 
     android:versionCode="1" 
     android:versionName="1.0"> 
    <uses-sdk android:minSdkVersion="22" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <application android:label="AndroidCheatsocket"> 
     <activity android:name="Main"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <service android:name=".Main$MyService" /> 
    </application> 
</manifest> 

en GitHub con un build.xml: https://github.com/cirosantilli/android-cheat/tree/92de020d0b708549a444ebd9f881de7b240b3fbc/socket

4

Aquí, en esta entrada se encuentra el código detallado para el establecimiento de socket entre dispositivos o entre dos aplicaciones en el mismo móvil.

Debe crear dos aplicaciones para probar debajo del código.

En archivo de manifiesto de aplicación tanto, añadir a continuación el permiso

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

primera aplicación de código: socket de cliente

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <TableRow 
     android:id="@+id/tr_send_message" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:gravity="center" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_alignParentTop="true" 
     android:layout_marginTop="11dp"> 

     <EditText 
      android:id="@+id/edt_send_message" 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:layout_marginRight="10dp" 
      android:layout_marginLeft="10dp" 
      android:hint="Enter message" 
      android:inputType="text" /> 

     <Button 
      android:id="@+id/btn_send" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginRight="10dp" 
      android:text="Send" /> 
    </TableRow> 

    <ScrollView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_below="@+id/tr_send_message" 
     android:layout_marginTop="25dp" 
     android:id="@+id/scrollView2"> 

     <TextView 
      android:id="@+id/tv_reply_from_server" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:orientation="vertical" /> 
    </ScrollView> 
</RelativeLayout> 

MainActivity.java

import android.os.Bundle; 
import android.os.Handler; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.PrintWriter; 
import java.net.Socket; 

/** 
* Created by Girish Bhalerao on 5/4/2017. 
*/ 
public class MainActivity extends AppCompatActivity implements View.OnClickListener { 

    private TextView mTextViewReplyFromServer; 
    private EditText mEditTextSendMessage; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Button buttonSend = (Button) findViewById(R.id.btn_send); 

     mEditTextSendMessage = (EditText) findViewById(R.id.edt_send_message); 
     mTextViewReplyFromServer = (TextView) findViewById(R.id.tv_reply_from_server); 

     buttonSend.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 

     switch (v.getId()) { 

      case R.id.btn_send: 
       sendMessage(mEditTextSendMessage.getText().toString()); 
       break; 
     } 
    } 

    private void sendMessage(final String msg) { 

     final Handler handler = new Handler(); 
     Thread thread = new Thread(new Runnable() { 
      @Override 
      public void run() { 

       try { 
        //Replace below IP with the IP of that device in which server socket open. 
        //If you change port then change the port number in the server side code also. 
        Socket s = new Socket("xxx.xxx.xxx.xxx", 9002); 

        OutputStream out = s.getOutputStream(); 

        PrintWriter output = new PrintWriter(out); 

        output.println(msg); 
        output.flush(); 
        BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream())); 
        final String st = input.readLine(); 

        handler.post(new Runnable() { 
         @Override 
         public void run() { 

          String s = mTextViewReplyFromServer.getText().toString(); 
          if (st.trim().length() != 0) 
           mTextViewReplyFromServer.setText(s + "\nFrom Server : " + st); 
         } 
        }); 

        output.close(); 
        out.close(); 
        s.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 

     thread.start(); 
    } 
} 

segunda Código App - Socket Server

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <Button 
     android:id="@+id/btn_stop_receiving" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="STOP Receiving data" 
     android:layout_alignParentTop="true" 
     android:enabled="false" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="89dp" /> 

    <ScrollView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_below="@+id/btn_stop_receiving" 
     android:layout_marginTop="35dp" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true"> 

     <TextView 
      android:id="@+id/tv_data_from_client" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:orientation="vertical" /> 
    </ScrollView> 

    <Button 
     android:id="@+id/btn_start_receiving" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="START Receiving data" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="14dp" /> 
</RelativeLayout> 

MainActivity.java

import android.os.Bundle; 
import android.os.Handler; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 

/** 
* Created by Girish Bhalerao on 5/4/2017. 
*/ 
public class MainActivity extends AppCompatActivity implements View.OnClickListener { 

    final Handler handler = new Handler(); 

    private Button buttonStartReceiving; 
    private Button buttonStopReceiving; 
    private TextView textViewDataFromClient; 
    private boolean end = false; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     buttonStartReceiving = (Button) findViewById(R.id.btn_start_receiving); 
     buttonStopReceiving = (Button) findViewById(R.id.btn_stop_receiving); 
     textViewDataFromClient = (TextView) findViewById(R.id.tv_data_from_client); 

     buttonStartReceiving.setOnClickListener(this); 
     buttonStopReceiving.setOnClickListener(this); 

    } 

    private void startServerSocket() { 

     Thread thread = new Thread(new Runnable() { 

      private String stringData = null; 

      @Override 
      public void run() { 

       try { 

        ServerSocket ss = new ServerSocket(9002); 

        while (!end) { 
         //Server is waiting for client here, if needed 
         Socket s = ss.accept(); 
         BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream())); 
         PrintWriter output = new PrintWriter(s.getOutputStream()); 

         stringData = input.readLine(); 
         output.println("FROM SERVER - " + stringData.toUpperCase()); 
         output.flush(); 

         try { 
          Thread.sleep(1000); 
         } catch (InterruptedException e) { 
          e.printStackTrace(); 
         } 
         updateUI(stringData); 
         if (stringData.equalsIgnoreCase("STOP")) { 
          end = true; 
          output.close(); 
          s.close(); 
          break; 
         } 

         output.close(); 
         s.close(); 
        } 
        ss.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 

     }); 
     thread.start(); 
    } 

    private void updateUI(final String stringData) { 

     handler.post(new Runnable() { 
      @Override 
      public void run() { 

       String s = textViewDataFromClient.getText().toString(); 
       if (stringData.trim().length() != 0) 
        textViewDataFromClient.setText(s + "\n" + "From Client : " + stringData); 
      } 
     }); 
    } 

    @Override 
    public void onClick(View v) { 

     switch (v.getId()) { 
      case R.id.btn_start_receiving: 

       startServerSocket(); 
       buttonStartReceiving.setEnabled(false); 
       buttonStopReceiving.setEnabled(true); 
       break; 

      case R.id.btn_stop_receiving: 

       //stopping server socket logic you can add yourself 
       buttonStartReceiving.setEnabled(true); 
       buttonStopReceiving.setEnabled(false); 
       break; 
     } 
    } 
} 
Cuestiones relacionadas