Italian Network problema insolito

micro

Well-Known Member
Licensed User
Longtime User
Salve ragazzi
premetto che sto lavorando con la versione 3.2 beta3.
Non riesco a capire del perchè non riesco a ricevere nulla con connessioni ethernet sia con invio/ricezione byte che stringhe (quindi InputStrem/OutputStream e TextWriter/TextReader) con prove distinte.
Questa la prova con stringhe:
B4X:
Sub Process_Globals
Dim socketp As Socket
Dim socketpserv As ServerSocket
Dim is As TextReader
Dim os As TextWriter
End Sub

Sub Globals
...............................
Dim ip_ As String
Dim porta_ As String
Dim connesso as Boolean
End Sub

#Region SOCKET
Sub Connetti(ip As String, porta As String)
Dim port As Int
    If socketpserv.IsInitialized = False Then
        socketpserv.Initialize(8234, "socketpserv")
        socketpserv.Listen
        ToastMessageShow("My IP: " & socketpserv.GetMyIP, True)
    End If
    If socketp.IsInitialized = False Then
        socketp.Initialize("socketp")
        If IsNumber(porta) Then port = porta
        socketp.Connect(ip, port, 5000)
    End If
End Sub

Sub socketp_Connected (Successful As Boolean)
    Try
    If    Successful = False Then
        ToastMessageShow("Errore connessione", False)
        connesso = False
        VisError
        Return
    End If
    If is.IsInitialized = False Then is.Initialize(socketp.InputStream)
    If os.IsInitialized = False Then os.Initialize(socketp.OutputStream)
    connesso = True
    Return
    Catch As Exception
        connesso = False
        ToastMessageShow("Errore socket!", False)
    End Try
End Sub
#End Region

Poi in un Timer ho questo codice d'invio e ricezione:
B4X:
.......
Timerp.Enable = False
os.WriteLine("Send prova" & Chr(13)) 'invio dati
'Attesa
Sleep(100) 'è una mia routine di ritardo
Dim sb As StringBuilder
sb.Append(is.ReadLine) '< qui compare l'Errore
Do While is.Ready
     sb.Append(is.ReadLine)
Loop
...........

L'errore in sb.Append è: android.os.NetworkOnMainThreadException
Ma non riesco a capire dove può essere l'errore perchè la connesione avviene e chi trasmette lo fà di sicuro perchè ho provato con Hyperterminal.
Grazie a tutti
 
Last edited:

Dettoloso

New Member
Licensed User
Longtime User
Non puoi effettuare operazioni di network sul main thread(per evitare freeze sull'applicazione) non ricordo da quale ver di Android in poi... metti il codice su un modulo e prova ;)
 

micro

Well-Known Member
Licensed User
Longtime User
Ok provo e ti faccio sapere anche se un precedente lavoro fatto aveva la gestione network in main ed era ok.
 

micro

Well-Known Member
Licensed User
Longtime User
Il codice è un pochino confuso.

Ad esempio, manca:

B4X:
Sub socketpserv_NewConnection(Successful As Boolean, NewSocket As Socket)

Prova a leggere questo tutorial.
Perchè dici che è confuso?
Non guardare la parte relativa a socketpserv, non sono un server ma solo un client.
Ho inserito il socketserv per operazioni future e al momento per visualizzare solo l'ip.
Per il resto sono solo client e c'è tutto quello che è presente nel tutorial.
Almeno io non riesco a trovare incongruenze.....sarà l'eta! :D
Magari qualche occhio in più vede qualcosa che a me sfugge.
Grazie comunque la disponibilità.
 

LucaMs

Expert
Licensed User
Longtime User
Prego (per la disponibilità) ma spesso i miei consigli sono appena sufficienti.

Lascia stare l'età:
1) perché a me pesa la mia :) (non ho guardato la tua)
2) perché qui nel sito abbiamo un esempio di longevità mentale (non so se dire il suo nome, perché voglio fargli un complimento per la sua intelligenza, ma non voglio fare una gaffe sull'età, ma è Klaus :D:D:D - tanto per non farne il nome)

Sì, mi riferivo alla parte server e al fatto che c'è:
B4X:
        If IsNumber(porta) Then port = porta
        socketp.Connect(ip, port, 5000)
e se porta non è numerico ti và in errore.

Poi, mi sembra di capire che non usi il socketserv solo per... ma è da quello che aspetti il testo "Send prova".
Nel tutorial è il pc che fà da client, il dispositivo è il server (dici "connessioni ethernet", quindi hai una parte sul pc? parte client o server?)

Comunque, dato che anche io mi sto perdendo (sarà l'età :(:p) e che Erel consiglia vivamente di usare AsynStream, prova magari a seguire l'esempio che è lì.

Se poi mi si svegliano le celluline grigie, torno qui e tento di nuovo.
 
Last edited:

micro

Well-Known Member
Licensed User
Longtime User
Grazie per la pazienza, risolto con AsyncStreamsText che non è altro che un modulo.
Ricordarsi di caricare la libreria RandomAccessFile che contiene la classe AsyncStreams.
Dopo una lettura attenta di tanti post ne ho beccato uno dove Erel diceva che TextWriter e TextReader non erano idonei per gli stream su socket.
Thread chiuso.
 
Top