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


 
Herramientas
  #1  
Viejo 03/05/14, 01:50:18
Avatar de klauscj2
klauscj2 klauscj2 no está en línea
Usuario novato en la web
Mensajes: 5
 
Fecha de registro: may 2014
Mensajes: 5
Tu operador: Movistar
Mencionado: 0 comentarios
Tagged: 0 hilos
Socket en java

Hola amigos estoy desarrollando una aplicacion basica para hacer un chat entre un programa desarrollado en java y un app en android que se comunicaran mediante socket's

el problema esq no puedo conectarme desde el cliente, es decir mi app llega solamente hasta antes de establecer:

servidor = new Socket(IP, PORT);

esta linea es la que no ejecuta es como si se saltara la instruccion, mi app esta desarrollada en froyo y no entiendo el problema
aqui el codigo
package com.klauscj2.led2;
Código:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class Led2 extends Activity {

	private EditText txtIp, txtPuerto, txtMensaje, txtArea;
	private Button bConectar, bEnviar;
	Socket servidor;
	private boolean bandera = false;
	DataInputStream dis = null;
	DataOutputStream dos = null;
	String msg = "";
	int conta = 0;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.activity_led2);
		txtIp = (EditText) findViewById(R.id.editText1);
		txtPuerto = (EditText) findViewById(R.id.editText2);
		txtMensaje = (EditText) findViewById(R.id.editText4);
		txtArea = (EditText) findViewById(R.id.editText3);
		bConectar = (Button) findViewById(R.id.button1);
		bEnviar = (Button) findViewById(R.id.button2);
		bEnviar.setEnabled(false);
		txtMensaje.setEnabled(false);

	}

	public void clicBoton(View view) {
		// Toast.makeText(Led2.this, "Hola",Toast.LENGTH_SHORT).show();
		boolean flag = Conectar();
		conta = 0;
		if (flag) {
			iniciarHandler();
			Toast.makeText(Led2.this,
					"Conectado a " + servidor.getRemoteSocketAddress(),
					Toast.LENGTH_SHORT).show();
			bEnviar.setEnabled(true);
			txtMensaje.setEnabled(true);
			InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
			imm.hideSoftInputFromWindow(txtMensaje.getWindowToken(), 0);
		} else {
			InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
			imm.hideSoftInputFromWindow(txtMensaje.getWindowToken(), 0);
			Toast.makeText(Led2.this, "No se ha podido conectar al servidor",
					Toast.LENGTH_SHORT).show();
		}

	}

	public void clicEnviar(View view) {
		if (!txtMensaje.getText().toString().trim().equals("")) {
			txtArea.append("Yo: " + txtMensaje.getText() + "\n");
			txtMensaje.setText("");
			InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
			imm.hideSoftInputFromWindow(txtMensaje.getWindowToken(), 0);
		}
	}

	public boolean Conectar() {
		boolean retornar = false;
		String IP = txtIp.getText().toString();
		if (IP.matches("[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}")) {

			if (!txtPuerto.getText().toString().trim().equalsIgnoreCase("")) {
				if (txtPuerto.getText().toString().matches("[0-9]+")) {
					try {
						int PORT = Integer.valueOf(txtPuerto.getText()
								.toString());
						
						servidor = new Socket(IP, PORT);
						Toast.makeText(Led2.this, "Entra hasta servidor", Toast.LENGTH_SHORT).show();
						if (servidor.isConnected() == true) {
							bandera = true;
							dis = new DataInputStream(servidor.getInputStream());
							dos = new DataOutputStream(
									servidor.getOutputStream());
							retornar = true;
						} else {
							retornar = false;
						}
					} catch (Exception e) {
						Log.e("Error connect()", "" + e);
						retornar = false;
					}
				} else {
					Toast.makeText(Led2.this,
							"Error: Puerto Invalido\nIngrese un numero entero",
							Toast.LENGTH_SHORT).show();

					retornar = false;
				}
			} else {
				Toast.makeText(Led2.this,
						"Error: Puerto Invalido\nIngrese un numero entero",
						Toast.LENGTH_SHORT).show();

				retornar = false;
			}

		} else {
			Toast.makeText(Led2.this, "Error: IP invalida", Toast.LENGTH_SHORT)
					.show();
			retornar = false;
		}
		return retornar;

	}

	public void iniciarHandler() {
		final Handler myHandler = new Handler();

		(new Thread(new Runnable() {
			boolean bandera = true;

			public void run() {
				while (bandera) {

					String recibe;
					try {
						if (dis != null) {
							recibe = dis.readUTF();
							if (recibe != null) {
								Led2.this.setMsg(recibe);
							}
						} else {
							bandera = false;
						}

					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}

					myHandler.post(new Runnable() {
						public void run() {
							analizar();
						}

					});

				}
			}
		})).start();
	}

	public String getMsg() {
		return msg;
	}

	public void setMsg(String msg) {
		this.msg = msg;
	}

	public void analizar() {
		txtArea.append("Servidor: " + getMsg() + "\n");
	}

}

adjunto todo el proyecto
Archivos Adjuntos
Tipo de Archivo: rar Led2.rar (2.04 MB, 1 visitas)
Responder Con Cita


  #2  
Viejo 03/05/14, 10:17:59
Avatar de ctkd17
ctkd17 ctkd17 no está en línea
Usuario poco activo
Mensajes: 37
 
Fecha de registro: feb 2012
Mensajes: 37
Modelo de smartphone: Sony xperia neo V
Versión de ROM: CROM kk v5.9 20140413
Tu operador: Pepephone
Mencionado: 0 comentarios
Tagged: 0 hilos
Muy buenas,

Creo que tienes dos potenciales errores. El primero es que compruebes el casteo que haces con PORT. Intenta hacer un Toast de esa variable para ver que es lo que se ha asignado.

Segundo: IP no es un string sino un objeto InetAddress. Las direcciones IP cuando usamos sockets no deben ir en formato xxx.xxx.x.x sino en bytes que es lo que entienden los enrutadores. Prueba a modificar esa llamada por:

Código:
servidor = new Socket(InetAddress.getByName(IP),PORT);
Te dejo aquí el javadoc para que le heches un vistazo:
http://docs.oracle.com/javase/7/docs...etAddress.html

Un saludo!

Última edición por ctkd17 Día 03/05/14 a las 10:19:00 Razón: Añadir info
Responder Con Cita
  #3  
Viejo 03/05/14, 22:50:27
Avatar de klauscj2
klauscj2 klauscj2 no está en línea
Usuario novato en la web
Mensajes: 5
 
Fecha de registro: may 2014
Mensajes: 5
Tu operador: Movistar
Mencionado: 0 comentarios
Tagged: 0 hilos
he echo los cambios que me indicas, pero la app sigue sin funcionar ya comprobe con el toast el valor de la variable PORT y si esta bien, pero no se porque no funciona me baje un ejemplo de un chat y se conecta de la misma manera en la que y hago y esa aplicacion si funciona correctamente
Responder Con Cita
  #4  
Viejo 04/05/14, 10:58:57
Avatar de kriogeN
kriogeN kriogeN no está en línea
Colaborador/a
Mensajes: 4,637
Compra y venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Versión de ROM: CM13 - CM 11
Tu operador: Vodafone
Mencionado: 60 comentarios
Tagged: 3 hilos
Le has dado al Manifest permiso de Internet, no?

Y la conexión al Socket deberías de hacerla en otro hilo, fuera del UI Thread.

Lo raro es que tanto con un error como con el otro debería saltarte una excepción, no simplemente no hacer nada.

EDIT: Vale, acabo de ver que tienes un Try-Catch con un general Exception, así que 99% que va a ser que estás creando la conexión en el UI Thread, porque el permiso creo que es de tipo Error, no Exception.

Última edición por kriogeN Día 04/05/14 a las 11:01:34
Responder Con Cita
  #5  
Viejo 05/05/14, 14:52:44
Avatar de klauscj2
klauscj2 klauscj2 no está en línea
Usuario novato en la web
Mensajes: 5
 
Fecha de registro: may 2014
Mensajes: 5
Tu operador: Movistar
Mencionado: 0 comentarios
Tagged: 0 hilos
los permisos de internet si lo tengo en el manifest, si quiero crear solo la conexion del socket en un hilo aparte, este hilo solo recibiria 2 parametros, la ip y el puerto?? o como seria
Responder Con Cita
  #6  
Viejo 05/05/14, 15:24:48
Avatar de kriogeN
kriogeN kriogeN no está en línea
Colaborador/a
Mensajes: 4,637
Compra y venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Versión de ROM: CM13 - CM 11
Tu operador: Vodafone
Mencionado: 60 comentarios
Tagged: 3 hilos
Echa un vistazo a los AsyncTask, es la forma más sencilla de crear hilos e interactuar con el hilo principal cuando terminan.
Responder Con Cita
  #7  
Viejo 07/05/14, 01:45:29
Avatar de klauscj2
klauscj2 klauscj2 no está en línea
Usuario novato en la web
Mensajes: 5
 
Fecha de registro: may 2014
Mensajes: 5
Tu operador: Movistar
Mencionado: 0 comentarios
Tagged: 0 hilos
he solucionado el problema, se me hacia muy raro que no funcione ya que hace unos meses atras hice una app parecida y funcionaba sin problemas, en aquel entonces eclipse al crear un proyecto no adjuntaba al proyecto la "Android Private Libraries", en el actual eclipse donde he creado mis aplicaciones quite todo lo relacionado a esta libreria y mi aplicacion a funcionado como debe

Responder Con Cita
Respuesta

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


Reglas de Mensajes
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Las caritas están On
Código [IMG] está On
Código HTML está Off

Saltar a Foro



Hora actual: 15:22:36 (GMT +1)

Cookies settings
Powered by vBulletin™
Copyright © vBulletin Solutions, Inc. All rights reserved.
 
HTCMania: líderes desde el 2007