Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android

Respuesta
 
Herramientas
  #1  
Viejo 28/03/16, 17:12:30
Array

[xs_avatar]
autodrc autodrc no está en línea
Usuario poco activo
 
Fecha de registro: mar 2016
Mensajes: 5
Tu operador: Movistar

Conexión servidor-cliente bidireccional

Buenas tardes,

Estoy intentando realizar una conexión servidor-cliente bidireccional con Android Studio pero no hay manera de que el cliente reciba los datos del servidor. La conexión se hace bien y puedo enviar mensajes desde el cliente al servidor y visualizarlos en el servidor sin problema, pero al contrario estoy teniendo problemas.

A ver si me podéis echar una mano!

Gracias

Este es mi código hasta el momento:

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

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

public class SettingsActivity extends AppCompatActivity implements OnClickListener {
EditText etMessage, ipadress, ipport;
Button bSend;
TextView msgrec;

@override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
etMessage = (EditText) findViewById(R.id.welcomeMsg);
bSend = (Button) findViewById(R.id.checkconnection);
ipadress = (EditText) findViewById(R.id.ipadress);
ipport = (EditText) findViewById(R.id.ipport);
msgrec = (TextView) findViewById(R.id.msgrec);

bSend.setOnClickListener(this);
}

@override
public void onClick(View v) {
Thread t = new Thread() {

@override
public void run() {
String dstAddress;
int dstPort;
String datoport;
String response;
String msgToServer;

try {
msgToServer = etMessage.getText().toString();
dstAddress = ipadress.getText().toString();
datoport = ipport.getText().toString();
dstPort = Integer.parseInt(datoport);

Socket socket = new Socket(dstAddress, dstPort);
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());

dos.writeUTF(msgToServer);

socket = new Socket(dstAddress, dstPort);
DataInputStream dis = new DataInputStream(socket.getInputStream());
response = dis.readUTF();
msgrec.setText(response);
dis.close();

dos.flush();
dos.close();
socket.close();

} catch (IOException e) {
e.printStackTrace();
}
}
};
t.start();
}
}
Responder Con Cita


  #2  
Viejo 28/03/16, 17:43:20
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,203
Tu operador: -

Tienes una errata, supongo que de hacer copy-paste, abres el socket dos veces. Después de dos.writeUTF abres otro socket (borra ese segundo socket = new Socket...), así que lo que se supone que ibas a leer no está porque es otra conexión.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Responder Con Cita
  #3  
Viejo 28/03/16, 18:32:09
Array

[xs_avatar]
autodrc autodrc no está en línea
Usuario poco activo
 
Fecha de registro: mar 2016
Mensajes: 5
Tu operador: Movistar

Lo he arreglado pero sigue sin funcionar... he probado varias estructuras y no hay manera... gracias de todas formas mocelet.
Responder Con Cita
  #4  
Viejo 28/03/16, 18:54:17
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,203
Tu operador: -

Entonces fallará otra cosa Resolver los fallos consiste en eso, en ir tirando del hilo.

¿El servidor es Java? ¿Escribes los datos también con writeUTF?
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Responder Con Cita
  #5  
Viejo 28/03/16, 22:21:47
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
Si lo que quieres es que por cada mensaje que envías al servidor tengas una respuesta del cliente tu código es correcto. Ya que se ejecutan en secuencia.

Ahora bien, si quieres poder enviar y recibir datos en cualquier momento, independientemente de lo que ya hayas enviado o recibido, deberás poner los sockets en hilos distintos.
Responder Con Cita
  #6  
Viejo 28/03/16, 22:54:36
Array

[xs_avatar]
autodrc autodrc no está en línea
Usuario poco activo
 
Fecha de registro: mar 2016
Mensajes: 5
Tu operador: Movistar

Perdonarme, soy nuevo en esto de java y android. El servidor no es java y la idea es poder recibir un mensaje del servidor en cualquier momento así que tendré que hacer lo que tu dices, por un lado enviar datos y por el otro recibirlos. Gracias! a ver si me las apaño pronto.
Responder Con Cita
  #7  
Viejo 29/03/16, 00:22:05
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,203
Tu operador: -

Cosas varias entonces:
- No uses readUTF ni writeUTF. Esos están hechos para leer con uno lo que escribes con el otro (añaden información de cuántos bytes hay que leer, si el servidor no sigue la misma convención no funcionará como se espera, que es lo que probablemente te ocurre). En su lugar usa read o write a nivel de bytes, o alguno de los Reader/Writer de Java que te facilita el trabajo con cadenas de caracteres.
- Como te apuntaba kriogeN, si quieres leer todo el rato necesitas otro hilo más que, en bucle, se dedique a leer del input stream. Además del hilo que se dedica a escribir.
- A lo mejor te compensa buscar alguna biblioteca que facilite un poco el trabajo y esté orientada a mensajes y no tanto a la conexión. Aunque para aprender siempre es mejor pelearse con el socket y saber qué ocurre por debajo.

EDIT: Ejemplos de bibliotecas de mensajería ligeras: zeroMQ (que tiene cliente nativo Java jeromq), mosquitto. Para el tema de comunicarse con microcontroladores igual son más apropiados por su orientación a mensajes y permitir patrones de publicación / suscripción además de reconexión automática o envío de mensajes encolados. Ya depende del caso de uso concreto, pero con estas bilbiotecas no tienes que saber qué es un socket ni molestarte en codificar ni en encapsular datos, simplemente envías mensajes y recibes mensajes.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!

Última edición por mocelet Día 29/03/16 a las 13:24:58.
Responder Con Cita
Respuesta

Estás aquí
Regresar   Portal | Indice > Todo sobre Android > Programación y Desarrollo para Android



Hora actual: 19:49:32 (GMT +1)



User Alert System provided by Advanced User Tagging (Lite) - vBulletin Mods & Addons Copyright © 2026 DragonByte Technologies Ltd.

Contactar por correo / Contact by mail / 邮件联系 /