Italian B4J - Easy Network no Internet

marco.canta

Active Member
Licensed User
Longtime User
Dopo aver passato due giorni a leggere e scrivere codice, non ci sto capendo più nulla.
Vi chiedo un suggerimento su quale strada seguire per realizzare questo progetto.

Riepilogo :
Ho un PC windows (B4J) (inizialmente doveva essere Android, ma ora partiamo con Windows ... ) che dovrà interrogare e scambiare dati (solo stringhe) con due o più PC Windows (B4J)
Non sono connessi a internet.
Ho cercato la soluzione con MQTT (ma non ce la possibilità di connessione Internet) e
poi con TCP ... la quale soluzione funzionerebbe ma solo con un solo Client, ho provato poi a creare più Socket per connessione multiple .... ma non sono stato in grado di farlo funzionare.


a questo punto ho solo tanta confusione in mente .... mi serve il vostro aiuto.

GRAZIE !!!! Marco



Questo il codice che avevo sviluppato per il Client B4J
B4X:
Sub Process_Globals
    Private fx As JFX
    Private MainForm As Form
    
    Private Serzt As B4XSerializator
    Type MyMessage (Valore1 As String)

    Private Client As Socket
    Public Server As ServerSocket
    Private Astream As AsyncStreams
    Private const PORT As Int = 51042

    Private btnSend As Button
    Private btnConnect As Button
    Private connected As Boolean
    Private lblStatus As Label
    Private edtIP As TextField
    Private lblRxVal1 As Label
    Private txtTxVal1 As TextField
End Sub

Sub AppStart (Form1 As Form, Args() As String)
    MainForm = Form1
    MainForm.RootPane.LoadLayout("1") 'Load the layout file.
    MainForm.Show
    
    edtIP.Text = "192.168.1.19"

    UpdateState(False)
End Sub




Sub UpdateState (NewState As Boolean)
    connected = NewState
    btnSend.Enabled = connected
    If connected Then
        btnConnect.Text = "Disconnect"
        lblStatus.Text = "Connected"
    Else
        btnConnect.Text = "Connect"
        lblStatus.Text = "Disconnected"
    End If
End Sub




'********************************************************************************
'
'********************************************************************************

Sub btnConnect_Action
    If connected = False Then
        ConnectToServer(edtIP.Text)       
    Else
        Disconnect
    End If
End Sub

Private Sub ConnectToServer(Host As String)
    Log("Trying to connect to: " & Host)
    CloseExistingConnection

    Dim Client As Socket
    Client.Initialize("client")
    Client.Connect(Host, PORT, 10000)
    Wait For Client_Connected (Successful As Boolean)
    If Successful Then
        Astream.InitializePrefix(Client.InputStream, False, Client.OutputStream, "astream")
        UpdateState (True)
    Else
        Log("Failed to connect: " & LastException)
    End If
End Sub


Private Sub Disconnect
    CloseExistingConnection
End Sub


Sub CloseExistingConnection
    If Astream.IsInitialized Then Astream.Close
    If Client.IsInitialized Then Client.Close
    UpdateState (False)
End Sub



'********************************************************************************
'
'********************************************************************************

Sub btnSend_Action
    Dim mm As MyMessage
    mm.Initialize
    mm.Valore1 = txtTxVal1.Text

    SendData(Serzt.ConvertObjectToBytes(mm))
End Sub

Public Sub SendData (data() As Byte)
    If connected Then Astream.Write(data)
End Sub



'********************************************************************************
'
'********************************************************************************

Sub AStream_NewData (Buffer() As Byte)
    Dim mm As MyMessage = Serzt.ConvertBytesToObject(Buffer)
    Log(mm)
    lblRxVal1.Text = mm.Valore1
End Sub

Sub AStream_Error
    UpdateState(False)
End Sub

Sub AStream_Terminated
    UpdateState(False)
End Sub




'*** End ***



e questo è il codice su cui stavo lavorando per il lato Server B4J

B4X:
Sub Process_Globals
    Private fx As JFX
    Private MainForm As Form
    Private Server As ServerSocket
    Type LabelAndString (lbl As Label, val As String, connected As Boolean)

    Dim connections As Map
    Dim slots As List

    Dim lblIP As Label
    Dim lblStatus1, lblStatus2 As Label
    Dim Valore1, Valore2 As String
    Dim ListView1 As ListView
    Private lblVersione As Label
End Sub

Sub AppStart (Form1 As Form, Args() As String)
    MainForm = Form1
    MainForm.RootPane.LoadLayout("Layout1")
    MainForm.Show

    slots.Initialize
    connections.Initialize

    slots.Add(CreateLstSlot(lblStatus1, Valore1))
    slots.Add(CreateLstSlot(lblStatus2, Valore2))

    Server.Initialize(51042, "Server")
    Server.Listen
    lblIP.Text = Server.GetMyIP

End Sub



'***************************************************************************

Private Sub CreateLstSlot(lbl As Label, val As String) As LabelAndString
    Log(GetType(lbl))
    Dim tLS As LabelAndString
    tLS.Initialize
    tLS.lbl = lbl
    tLS.val = val
    tLS.connected = False
    Return tLS
End Sub

Private Sub ReleaseLstSlot(astream As AsyncStreams)
    If connections.ContainsKey(astream) Then
        Dim tLS As LabelAndString = connections.Get(astream)
        tLS.connected = False
        tLS.lbl.Text = "Status: Disconnected"
        connections.Remove(astream)
    End If
End Sub





Sub Server_NewConnection (Successful As Boolean, NewSocket As Socket)
    If Successful Then
        Dim astream As AsyncStreams
        astream.InitializePrefix(NewSocket.InputStream, False, NewSocket.OutputStream, "astream")

        For Each LS As LabelAndString In slots
            If LS.connected = False Then
                LS.connected = True
                LS.lbl.Text = "Status: Connected"
                connections.Put(astream, LS)
                Exit
            End If
        Next

    Else
        Log(LastException)
    End If
    Server.Listen
End Sub




'***************************************************************************

Sub astream_NewData (Buffer() As Byte)
    Log("received: " & DateTime.GetSecond(DateTime.Now))
    Dim tLS As LabelAndString = connections.Get(Sender)
    Log(tLS.lbl)
    Log(tLS.val)
    
    ListView1.Items.Add(tLS.val)
End Sub

Sub astream_Error
    Log("Error: " & LastException)
    Dim astream As AsyncStreams = Sender
    ReleaseLstSlot(astream)
    astream.Close
End Sub

Sub astream_Terminated
    Log(Sender)
    Dim astream As AsyncStreams = Sender
    ReleaseLstSlot(astream)
    astream.Close
End Sub
 

marco.canta

Active Member
Licensed User
Longtime User
Tutto era partito dallo studiare "Network" ... che sarebbe andato bene se fossi stato capace di creare la connessione con più periferiche ...
 

giannimaione

Well-Known Member
Licensed User
Longtime User
ho realizzato qualcosa di simile tempo fa;
in pratica ho condiviso una cartella in cui TUTTI i pc (B4J) possono leggere e scrivere file di testo;
il nome del file identifica il destinatario e il (esempio 0207_progressivo.txt) ; il progressivo è generato tenendo conto dell'orario TIMEDATE;
07 = il messaggio parte dal pc B4J (identificato in un file .ini) e stesso discorso 02 (pc destinazione);
quindi il pc 02 , accede alla cartella condivisa e legge TUTTI i file a lui indirizzati, cioè tutti quelli che hanno il nome che inizia con 02 (0203......, 0210..... , 0238.....)

questa soluzione funziona perché su ogni pc c'è una persona che lavora; ogni persona (quindi ogni pc) interroga volutamente la cartella condivisa oppure scrive un nuovo file di testo indirizzato ad altro pc.
non uso timer, network, socket
 
Top