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?
Respuesta
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:
- 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.
- Si haces esto constantemente, incluso cuando tu aplicación no esté activa, entonces necesitas usar el Servicio.
- 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)?
Para mí su respuesta es como más que nada. Encontré que todo necesitaba más que un simple socket. Muchas gracias hombre – bharath
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:
- instalar la aplicación
- conseguir su teléfono y PC en una LAN
- encontrar IP de su teléfono con https://android.stackexchange.com/a/130468/126934
- plazo
netcat $PHONE_IP 12345
- Tipo algunas líneas
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
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;
}
}
}
- 1. ¿Cómo burlarse de una conexión Socket saliente?
- 2. ¿Cómo crear el socket Raw en Android?
- 3. Android/Java - ¿Cómo crear una conexión HTTPS?
- 4. Programación de socket Android sin conexión WIFi
- 5. Cómo crear un socket RFCOMM inseguro en Android?
- 6. ¿Cómo evitar crear una nueva conexión de socket en socket.io después de actualizar la página html?
- 7. Cómo destruir por completo una conexión de socket en C
- 8. Crear SSL-Socket en Android con certificado autofirmado
- 9. ¿Cómo crear archivos especiales de tipo socket?
- 10. utilizando una conexión de socket sin bloqueo en C
- 11. Cómo crear una conexión de socket TCP usando C a un puerto predefinido
- 12. Interrumpir un socket de conexión
- 13. Cómo crear una conexión DSL en Elisp
- 14. Prueba conexión de socket en Python
- 15. ¿Cómo encontrar el estado de conexión del socket en C?
- 16. ¿Cómo mantener la conexión de socket VOIP en segundo plano?
- 17. Vuelva a conectar una conexión de socket Java al desconectarse
- 18. HTTP conexión persistente vs conexión de socket TCP
- 19. Android - Socket de servidor
- 20. ¿Cómo crear un socket Boost.Asio desde un socket nativo?
- 21. La conexión de socket fue abortado - CommunicationException
- 22. SSL Tiempo de espera de conexión de socket
- 23. Reutilizando descriptor de socket en caso de fallo de conexión
- 24. ¿Cómo funciona el tiempo de espera de conexión del socket?
- 25. Error de conexión Bluetooth Android
- 26. Android Socket Exception "socket está cerrado"
- 27. ¿Cómo estrangulas el ancho de banda de una conexión de socket en C?
- 28. Android Bluetooth problema de conexión
- 29. ¿Cómo puedo hacer una conexión de socket de cliente a cliente (navegadores)?
- 30. socket, detectar la conexión se pierde
¿Estás tratando de crear un socket de servidor, por ejemplo, un socket al que otros se conectarán? –
Peter gracias por preguntar. pero he resuelto lo mismo. muchas gracias –
Sí, vi la respuesta que aceptó. Si planea ejecutar un servidor en un dispositivo móvil, vea mi comentario sobre esa respuesta. –