Spanish SOLUCIONADO: Cliente Socket solo se conecta en modo DEBUG

Gustavo Holtermann

Member
Licensed User
Longtime User
Hola.

Conecto mi aplicación Android por medio de un socket la cual funciona perfectamente en modo Debug pero al ejecutarla en modo Release no logra conectarse, al usar este ultimo modo el la aplicación de Windows se genera un Socket.Close mientras que en debug no ocurre, ya probé de todo pero no encuentro el problema.

Estoy usando la versión 6.0 del B4A

Agradezco cualquier ayuda. Gracias



B4X:
Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
    Private tr As TextReader
    Private tw As TextWriter
    Private Socket1 As Socket
    Private AStreams As AsyncStreams

End Sub

Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    'Activity.LoadLayout("Layout1")
    ConectarServidor
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub
#Region SOCKET
'------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
'  RUTINAS SOCKET
'------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Sub ConectarServidor()
    Try
        'Si no esta inicializado el SOCKET lo inicializamos
        If Socket1.IsInitialized=True Then Socket1.close
        If Socket1.IsInitialized=False Then Socket1.Initialize("Socket1")
        '??????????????????????????????????????????????
        'Estas dos líneas de arriba si las pongo en un solo If Then Else como seria más lógico no funcionan
        '??????????????????????????????????????????????

        Socket1.Connect(IPServidor , 8573, 500)
    Catch
        Log("Error en ConectarServidor")
    End Try
End Sub
'---------------------------------------------------------------------------------------------------
Sub Desconectar()
    Try
        If AStreams.IsInitialized Then AStreams.close
        If Socket1.IsInitialized Then Socket1.close
        If tr.IsInitialized Then tr.Close
        If tw.IsInitialized Then tw.Close
    Catch
        Log("Error en Desconectar")
    End Try
End Sub
'---------------------------------------------------------------------------------------------------
Sub EnviarDatos(Dato As String)
    Try
        If Socket1.Connected=True Then '
Estaba usando el Socket1.Connected para saber si estaba conectado al servidor pero esto solo me indica si se logro conectar no si el servidor esta listo.


            If tw.IsInitialized=True Then
                tw.WriteLine(Dato & "*")
                tw.Flush
            End If
        Else
            ConectarServidor          
        End If
    Catch
        Socket1.Close 'AQUI ESTABA EL ERROR
        Log("Error al enviar datos a la PC")
        ToastMessageShow("Error al enviar datos a la PC verifique que esten conectados",True)
    End Try
End Sub
'---------------------------------------------------------------------------------------------------
Sub AStreams_NewData (Buffer() As Byte)
    Dim Data As String
    Dim Comando As String
    Try
    Data = BytesToString(Buffer, 0, Buffer.Length, "UTF8")
    Do While Data.IndexOf("*")>0
        Comando = Data.SubString2(0,Data.IndexOf("*"))
        Data = Data.SubString(Data.IndexOf("*")+1)
        EjecutarComandos(Comando)
    Loop
    Catch
        Log("Error en AStreams_NewData " & Data)
    End Try
End Sub
'---------------------------------------------------------------------------------------------------
Sub AStreams_Error
End Sub
'---------------------------------------------------------------------------------------------------
Sub AStream_Terminated
End Sub
'---------------------------------------------------------------------------------------------------
Sub Socket1_Connected (Successful As Boolean)
    Try
        If Successful = False Then
            Return
        End If
        tr.Initialize(Socket1.InputStream)
        tw.Initialize(Socket1.OutputStream)
   
        tw.Flush
        AStreams.Initialize(Socket1.InputStream, Socket1.OutputStream, "AStreams")
        EnviarDatos("IDA")        'Al conectarnos respondemos al servidor dando nuestro ID
    Catch
        Log("Error en Socket_Connected")
    End Try
End Sub
#End Region
'---------------------------------------------------------------------------------------------------
Sub EjecutarComandos(Texto As String)
    Select Case Texto
        Case "COMANDO1"
            .......
        Case "COMANDO2"
            .......
    End Select
End Sub
 
Last edited:

Gustavo Holtermann

Member
Licensed User
Longtime User
SOLUCIONADO:

Asumía que el Socket1.Connected=True me indicaba si la conexión con el servidor estaba establecida pero si el servidor se desconectaba en algún momento no cambia el valor a False.

Usando en su lugar AStreams.IsInitialized=True logro detectar si el servidor esta respondiendo o si no ejecuto un secuencia de reconexión para volver a conectarme al servidor cuando este este disponible.

Como pasa que buscamos una solución a un problema durante un tiempo y luego un par de minutos después de haber publicado la consulta encontramos que la solución era algo simple que no habíamos visto

Saludos.

PD. Donde puedo cambiar el titulo de del post para agregar el SOLUCIONADO no lo encontré o lo hace el administrador.
 
Top