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 03/05/14, 01:50:18
Array

[xs_avatar]
klauscj2 klauscj2 no está en línea
Usuario novato en la web
 
Fecha de registro: may 2014
Mensajes: 5
Tu operador: Movistar

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
Array

[xs_avatar]
ctkd17 ctkd17 no está en línea
Usuario poco activo
 
Fecha de registro: feb 2012
Mensajes: 37
Modelo de smartphone: Sony xperia neo V
Tu operador: Pepephone
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
Array

[xs_avatar]
klauscj2 klauscj2 no está en línea
Usuario novato en la web
 
Fecha de registro: may 2014
Mensajes: 5
Tu operador: Movistar

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
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
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
Array

[xs_avatar]
klauscj2 klauscj2 no está en línea
Usuario novato en la web
 
Fecha de registro: may 2014
Mensajes: 5
Tu operador: Movistar

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
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
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
Array

[xs_avatar]
klauscj2 klauscj2 no está en línea
Usuario novato en la web
 
Fecha de registro: may 2014
Mensajes: 5
Tu operador: Movistar

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   Portal | Indice > Todo sobre Android > Programación y Desarrollo para Android

Herramientas


Hora actual: 14:43:35 (GMT +2)



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

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