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> 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); p>
}
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> 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 p>
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---------------------------- ---- ----------