|
||
|
![]() |
![]() |
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
|
||||
|
||||
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 |
|
#2
|
||||
|
||||
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); 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 |
#3
|
||||
|
||||
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
|
#4
|
||||
|
||||
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. |
#5
|
||||
|
||||
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
|
#6
|
||||
|
||||
Echa un vistazo a los AsyncTask, es la forma más sencilla de crear hilos e interactuar con el hilo principal cuando terminan.
|
#7
|
||||
|
||||
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
![]() |
![]() |
![]() |
||||||
|
Herramientas | |