I developed a two-way chat system using ServerSocket and Socket in B4X. This project allows a connection to be established between a client and a server within a local network, enabling messages to be exchanged in real time.
Code structure
The system is based on:
- ServerSocket for accepting incoming connections.
- Socket for connecting the client to the server.
- AsyncStreams for handling two-way communication.
- ListView to show available IPs and sent/received messages.
Operation
The server starts listening on the default port (5050).
The client connects to a selected IP via ClientSocket.Connect().
Data is transmitted using AsyncStreams.Write().
Received messages are handled in the AStreamsServer_NewData() and AStreamsClient_NewData()
methods:
GetLocalIP() - Obtains the IP address of the device.
ScanNetwork() - Generates a list of IPs available on the local network.
Ping() - Checks the reachability of a given IP.
SendMessage_Click() - Sends the entered text to the server or client.
If you think this codicie is useful support my efforts here: Donate
'B4XPages

The system is based on:
- ServerSocket for accepting incoming connections.
- Socket for connecting the client to the server.
- AsyncStreams for handling two-way communication.
- ListView to show available IPs and sent/received messages.





methods:




If you think this codicie is useful support my efforts here: Donate
'B4XPages
Code:
Sub Class_Globals
Private Root As B4XView
Private xui As XUI
Private lstIPs As ListView
Private btnConnect As Button
Private selectedIP As String
Private xui As XUI
Private ServerSocket As ServerSocket
Private ClientSocket As Socket
Private AStreamsServer As AsyncStreams
Private AStreamsClient As AsyncStreams
Private defaultPort As Int = 5050
Private EditTextIP As EditText
Private BT_clear_log As Button
Private SendMessage As Button
End Sub
Public Sub Initialize
' B4XPages.GetManager.LogEvents = True
End Sub
'This event will be called once, before the page becomes visible.
Private Sub B4XPage_Created (Root1 As B4XView)
Root = Root1
Root.LoadLayout("MainPage")
lstIPs.SingleLineLayout.Label.TextSize = 13
lstIPs.SingleLineLayout.ItemHeight = 16dip
Dim myIP As String = GetLocalIP
lstIPs.AddSingleLine("Indirizzi ip:"&myIP)
Log("IP Device:"&myIP)
Sleep(500)
' Avvia il server
ServerSocket.Initialize(defaultPort, "ServerSocket")
ServerSocket.Listen
lstIPs.AddSingleLine("VMS server in ascolto... "&myIP)
Sleep(500)
lstIPs.AddSingleLine("porta predefinita: "&defaultPort)
Sleep(500)
End Sub
Sub GetLocalIP As String
Dim Server As ServerSocket
Server.Initialize(0, "")
Dim localIP As String = Server.GetMyWifiIP
Server.Close
Return localIP
End Sub
'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage.
Sub lstIPs_ItemClick(Position As Int, Value As Object)
lstIPs.Clear
selectedIP = Value
ToastMessageShow("IP selezionato: " & selectedIP, False)
lstIPs.AddSingleLine("IP Selezionato: "&selectedIP)
Sleep(500)
If selectedIP <> "" Then
ToastMessageShow("Connessione a " & selectedIP, False)
lstIPs.AddSingleLine("Connessione a:" & selectedIP)
Sleep(500)
' Qui puoi avviare la connessione al server
' Avvia il server
'ServerSocket.Initialize(defaultPort, "ServerSocket")
'ServerSocket.Listen
ToastMessageShow("Server in attesa di connessioni...", False)
lstIPs.AddSingleLine("Server in attesa di connessione...:" )
Sleep(500)
' ' Connetti al server remoto (modifica l'IP con quello del dispositivo server)
ClientSocket.Initialize("ClientSocket")
ClientSocket.Connect(selectedIP, defaultPort, 5000) ' Sostituisci con l'
Else
ToastMessageShow("Seleziona un IP prima di connetterti!", True)
End If
End Sub
Sub btnConnect_Click
ScanNetwork
End Sub
' Gestione connessione in entrata (Server)
Sub ServerSocket_NewConnection (Successful As Boolean, NewSocket As Socket)
If Successful Then
ToastMessageShow("Connessione stabilita con un client!", False)
lstIPs.AddSingleLine("Connessione stabilita con client: " & selectedIP)
Sleep(500)
AStreamsServer.Initialize(NewSocket.InputStream, NewSocket.OutputStream, "AStreamsServer")
Else
ToastMessageShow("Connessione fallita!", True)
lstIPs.AddSingleLine("Connessione fallita: " & selectedIP)
Sleep(500)
End If
End Sub
' Gestione connessione in uscita (Client)
Sub ClientSocket_Connected (Successful As Boolean)
If Successful Then
ToastMessageShow("Connesso al server remoto!", False)
lstIPs.AddSingleLine("Client connesso al server remote: " & selectedIP)
Sleep(500)
AStreamsClient.Initialize(ClientSocket.InputStream, ClientSocket.OutputStream, "AStreamsClient")
Else
ToastMessageShow("Connessione fallita!", True)
lstIPs.AddSingleLine("Connessione fallita: " & selectedIP)
Sleep(500)
End If
End Sub
' Ricezione dati dal server
Sub AStreamsServer_NewData (Buffer() As Byte)
Dim msg As String = BytesToString(Buffer, 0, Buffer.Length, "UTF8")
ToastMessageShow("client: " & msg, False)
lstIPs.AddSingleLine("client: " & msg)
Sleep(500)
End Sub
' Ricezione dati dal client
Sub AStreamsClient_NewData (Buffer() As Byte)
Dim msg As String = BytesToString(Buffer, 0, Buffer.Length, "UTF8")
'ToastMessageShow("Messaggio ricevuto dal server: " & msg, False)
lstIPs.AddSingleLine("client: " & msg)
Sleep(500)
End Sub
' Invio messaggio al server o client
Sub SendMessage_Click
Dim str As String = EditTextIP.Text
If AStreamsServer.IsInitialized Then AStreamsServer.Write(str.GetBytes("UTF8"))
If AStreamsClient.IsInitialized Then AStreamsClient.Write(str.GetBytes("UTF8"))
ToastMessageShow("Messaggio inviato!", False)
lstIPs.AddSingleLine("@> "&EditTextIP.Text)
Sleep(500)
End Sub
Sub ScanNetwork()
ToastMessageShow("Scansione Avviata...",True)
Dim baseIP As String = "192.168.178."
Dim activeIPs As List
activeIPs.Initialize
Log(activeIPs)
For i = 1 To 255
Dim ip As String = baseIP & i
'If Ping(ip) Then
activeIPs.Add(ip)
Log(activeIPs)
'End If
Next
Log(activeIPs)
lstIPs.Clear
lstIPs.AddSingleLine("Generazione lista IP")
For Each ip As String In activeIPs
lstIPs.AddSingleLine(ip)
Next
End Sub
Sub Ping(targetIP As String) As Boolean
Dim p As Phone
Dim result As Int = p.Shell("ping", Array As String("-c", "178", targetIP), Null, Null)
Return (result = 0)
End Sub
Sub GetConnectedDevices
Dim p As Phone
Dim result As String = p.Shell("ip", Array As String("neigh"), Null, Null)
Log("Dispositivi connessi: " & result)
lstIPs.AddSingleLine(result)
End Sub
Private Sub BT_Connetti_Click
ToastMessageShow("Server in attesa di connessioni...", False)
lstIPs.AddSingleLine("Server in attesa di connessione... ")
Sleep(500)
' ' Connetti al server remoto (modifica l'IP con quello del dispositivo server)
If EditTextIP.Text.Length>0 Then
selectedIP= EditTextIP.Text
ClientSocket.Initialize("ClientSocket")
ClientSocket.Connect(selectedIP, defaultPort, 5000) ' Sostituisci con l'
Else
ToastMessageShow("Inserisci un indirizzo IP e premi 'Connetti'",True)
End If
End Sub
Private Sub BT_clear_log_Click
lstIPs.Clear
Dim myIP As String = GetLocalIP
lstIPs.AddSingleLine("Indirizzo ip:"&myIP&" ~ VMLOG Ver.1.1")
Sleep(500)
End Sub
Last edited: