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
e questo è il codice su cui stavo lavorando per il lato Server B4J
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