Red de conocimiento informático - Computadora portátil - Cómo utilizar el socket del cliente de Android para enviar información al servidor al hacer clic en un botón

Cómo utilizar el socket del cliente de Android para enviar información al servidor al hacer clic en un botón

Uso de Socket basado en el protocolo TCP

Para iniciar una comunicación, un cliente primero debe conocer la dirección IP del host que ejecuta el servidor. Luego, la infraestructura de red utiliza la dirección de destino para entregar la información enviada por el cliente al host correcto. En Java, la dirección se puede definir mediante una cadena, que puede ser una dirección numérica (como 192.168.1.1), que también puede ser. sea ​​el nombre de host (ejemplo.com).

Después de Android 4.0, el sistema prohibirá el acceso a la red en el hilo principal. El motivo es:

El hilo principal es responsable de la respuesta de la interfaz de usuario si el acceso a la red se realiza en el hilo principal. hilo, si excede los 5 segundos, desencadenará un apagado forzado, por lo que esta operación que requiere mucho tiempo no se puede colocar en el hilo principal. Colóquelo en un subproceso secundario y la interfaz de usuario del subproceso principal no se puede cambiar en el subproceso secundario, por lo que se introduce el controlador. El controlador se define en el subproceso principal y se usa en el subproceso secundario.

El siguiente es un ejemplo de un cliente de socket de Android:

------------------------- - ------Código Java----------------------------------------- ----

importar java.io.BufferedReader;

importar java.io.IOException;

importar java.io.InputStreamReader;

importar java.io .PrintStream;

importar java.io.UnsupportedEncodingException;

importar java.net.InetSocketAddress;

importar java.net. Socket;

importar java.net.UnknownHostException;

importar android.app.Activity;

importar android.content.Context;

importar android.os.Bundle;

importar android.os.Handler;

importar android.os.Message;

importar android.view.View;

importar android.widget.Button;

importar android.widget.EditText;

importar android.widget.Toast;

público clase TCPSocketActivity extiende la actividad {

importar android.widget.Toast;

p>

public static final String TAG = TCPSocketActivity.class.getSimpleName();

/* Dirección del servidor*/

cadena privada host_ip = null;

/* Puerto del servidor*/

private int host_port = 0;

Botón privado btnConnect;

Botón privado btnSend;

EditText privado editSend;

hostIP privado de EditText;

EditText privado hostPort;

socket de socket privado;

salida de PrintStream privado;

p>

buffer de cadena privado = "";

contexto de contexto privado ;

@Override

protected void onCreate(Bundle saveInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R. layout.activity_socket_test);

contexto = esto;

initVi

ew();

btnConnect.setOnClickListener(new Button.OnClickListener() {

@Override

public void onClick(View v) {

host_ip = hostIP.getText().toString();

host_port = Integer.parseInt(hostPort.getText().toString());

nuevo hilo (nuevo ConnectThread()).start();

}

});

btnSend.setOnClickListener(new Button.OnClickListener() {

@Override

public void onClick(View v) {

new Thread(new SendThread(editSend.getText().toString())).start(); p>

}

});

}

brindis privado vacío (mensaje de cadena) {

Toast. makeText( contexto, mensaje, Toast.LENGTH_LONG).show();

}

public void handleException(Exception e, String prefix) {

e. printStackTrace( );

tostadoText(prefijo + e.toString());

}

public void initView() {

btnConnect = (Botón) findViewById(R.id.btnConnect);

btnSend = (Botón) findViewById(R.id.btnSend);

editSend = (EditText) findViewById(R .id .sendMsg);

hostIP = (EditText) findViewById(R.id.hostIP);

hostPort = (EditText) findViewById(R.id.hostPort);

}

private void closeSocket() {

prueba {

output.close();

socket. close();

} catch (IOException e) {

handleException(e, "cerrar excepción: ");

}

}

Controlador controlador = new Controlador() {

@Override

public void handleMessage(Mensaje msg) {

super. manejarMensaje( m

sg);

if (0x123 == msg.what) {

tostadoText("¡Conexión exitosa!");

}

}

};

/* Conectar hilo de socket*/

la clase pública ConnectThread implementa Runnable {

@Override

public void run() {

// TODO Código auxiliar de método generado automáticamente

Message msg = Message.obtain();

try {

if (null == socket || socket.isClosed()) {

socket = new Socket();

socket.connect(new InetSocketAddress( host_ip,host_port),5000);

salida = new PrintStream(socket.getOutputStream(), true,

"utf-8");

}

msg.what = 0x123;

handler.sendMessage(msg);

} catch (UnsupportedEncodingException e) {

e. printStackTrace();

} captura (IOException e) {

e.printStackTrace();

}

}

}

/*Enviar hilo de mensajes*/

clase pública SendThread implementa Runnable {

String msg

public SendThread(String msg) {

super();

this.msg = msg;

}

@Override

public void run() {

// TODO Código auxiliar de método generado automáticamente

prueba {

output.print(msg); p>

} catch (Excepción e) {

e.printStackTrace();

}

closeSocket();

}

}

clase pública SocketThread implementa Runnable {

public String txt1;

public SocketThread(String txt1) {

p>

super();

this.txt1 = txt1;

}

@Override

ejecución pública vacía() {

>

// TODO Código auxiliar de método generado automáticamente

Message msg = Message.obtain();

prueba {

/* Conéctate al servidor y establezca el tiempo de espera de la conexión en 5 segundos*/

if (socket.isClosed() || null == socket) {

socket = new Socket();

socket.connect(new InetSocketAddress(host_ip,host_port),5000);

}

// Obtener el flujo de entrada y salida

PrintStream o = nuevo PrintStream(socket .getOutputStream(),

true, "UTF-8");

BufferedReader bff = nuevo BufferedReader(nuevo InputStreamReader(

socket .getInputStream()) );

// Lee la información enviada desde el servidor

String line = null;

buffer = "";

while ( (line = bff.readLine()) != null) {

buffer = línea + buffer;

}

// Enviar información al servidor

ou.print(txt1);

ou.flush();

// Cerrar varios flujos de entrada y salida

bff.close ();

ou.close();

socket.close();

msg.what = 0x123;

controlador .sendMessage(msg);

} captura (UnknownHostException e) {

} captura (IOException e) {

}

}

}

}

-------------------- ------ --Archivo de diseño Activity_socket_test.xml------------------------------- ---------

android:layout_width ="fill_parent"

android:layout_height="fill_parent"

android:background="@color/white"

android:orientación="vertical" >

android:id="@+id/ho

stIP"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_margin="5dip"

android:hint="ip del servidor"

android:singleLine="true"

android:inputType="text" />

android:id="@+id/hostPort"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_margin="5dip"

android:hint="puerto"

android:singleLine="true"

android:inputType="número" />

android:id="@+id/btnConnect"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_gravity="center_vertical|center_horizontal"

android:background="@drawable/style_btn_shape"

android:layout_margin ="5dip"

android:text="@string/connect"

android:textColor="@color/white" />

android:id="@+id/sendMsg"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_margin="5dip"

android:hint="Contenido a enviar"

android:inputType="texto" />

< Botón

android:id="@+id/btnSend"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_margin="5dip"

android:background="@drawable/style_btn_shape"

android:layout_gravity="center_vertical|center_horizontal"

android:text ="@string/send"

android:textColor="@color/white" />

------ ------------------Archivo de estilo style_btn_shape.xml-------------------------- - -------

xmlns: android ="/apk/res/android"

android:shape="rectangle">

< android sólido :color="#0465b2" />

< / p>

android:left="10dp"

android:top="10dp"

android:right="10dp"

android:bottom="10dp"

/>

--------- - --------------------FIN---------------------------- ---- ----------

上篇: DNF Capítulo 6: Forzar exorcismo a cepillar el mapa para agregar puntos 下篇: Código fuente de recompensa 20232023 llegará pronto. Este es mi quinto año trabajando en Alibaba. Hasta ahora, he estado profundamente involucrado en el campo de Android y tengo muy clara la dirección de la reforma y la innovación tecnológicas. El desarrollo de Android ha capturado rápidamente los corazones de las personas con sus ventajas de belleza, velocidad, eficiencia y apertura. Sin embargo, los materiales de aprendizaje avanzados que necesitan muchos entusiastas de Android no son lo suficientemente sistemáticos y completos. Este artículo es mi último resumen de algunos conocimientos avanzados sobre Android. Cubre una amplia gama de conocimientos, pero todos son puntos de conocimiento y puntos extra que casi a menudo se preguntan en las entrevistas. ¡En esta era de pagar por el conocimiento, la mejora de conocimientos y habilidades es fundamental! Comparto este material de aprendizaje aquí con la esperanza de ayudar a las personas necesitadas. El siguiente es un conjunto completo de materiales de aprendizaje para arquitectos de desarrollo móvil que pasé dos meses compilando. ¡Por favor, guárdalos! ¡Haga clic en la tarjeta a continuación para ver cómo obtener el PDF completo! Un conjunto completo de arquitectos de notas de estudio de la serie Android debe tener las habilidades necesarias para construir las bases. Comprenda las anotaciones genéricas de Java de forma sencilla. Programación concurrente transmisión y serialización de datos Principio de máquina virtual Java IO eficiente Análisis de código fuente del marco top 100 de Android Análisis de código fuente Retrofit2.0 Análisis de código fuente Okhttp3 Análisis de código fuente ButterKnife Análisis de código fuente MPAndroidChart Análisis de código fuente Glide Lea. Análisis del código fuente de Kcanary Análisis del código fuente de Universal-image-Loader Análisis del código fuente de EventBus3.0 Análisis del código fuente de zxing Análisis del código fuente de Picasso Uso de Lottie Android Explicación detallada y análisis del código fuente Análisis del código fuente de Fresco: proceso de carga de imágenes Optimización del rendimiento de Android Análisis práctico para desarrollar una APLICACIÓN El propósito esencial es servir a los usuarios, por lo que, sobre la base de funciones poderosas, qué APLICACIÓN tiene un rendimiento más estable y una mejor experiencia se ha convertido en el factor principal para que los usuarios elijan. La optimización del rendimiento es un proceso continuo y una habilidad esencial para los ingenieros de desarrollo de Android. En esta parte, analizaré la optimización del rendimiento a partir de casos reales de fabricantes de Internet de primera línea, encontraré y resolveré problemas en combates reales y me familiarizaré con problemas comunes de optimización del rendimiento. Tencent Bugly: una pequeña comprensión del algoritmo de coincidencia de cadenas iQiyi: solución de captura de fallas de la aplicación de Android-XCRASH ByteDance: comprensión profunda de uno de los marcos de Gradle: complemento, extensión, tecnología BuildRCC Baidu APP: práctica de optimización de la primera pantalla de Android H5 Cliente Alipay Análisis de arquitectura: optimización de la velocidad de inicio del cliente Android "recolección de basura" Ctrip: práctica de arquitectura de componentes del proyecto Zhixing Android NetEase News Optimización de compilación: cómo hacer que su velocidad de compilación sea "relámpago" Kotlin, como nuevo lenguaje de programación funcional, es más seguro y conciso , versátil, interoperable y muchas otras ventajas, ya sea que se use para el desarrollo de Android o Java, Kotlin puede reducir una gran cantidad de código y mejorar en gran medida la eficiencia del trabajo. En la actualidad, muchas empresas han abandonado Java y han cambiado a Kotlin, y todas tienen requisitos más altos para el lenguaje Kotlin en la contratación.