B4J Question Multicast Server/client with B4J

pixet

Member
Licensed User
Longtime User
I can not initialize a multicast server to intercept the presence of my application in any network.
Does anyone have a solution to solve the problem?

B4X:
'Non-UI application (console / server application)
#Region Project Attributes 
    #CommandLineArgs:
    #MergeLibraries: True 
#End Region

Sub Process_Globals
    Dim mucast As ServerSocket
    Dim packet As UDPPacket
    Private eotTimer As Timer
    Private mAddress As String = "231.0.0.3"
    Private msg As String = "Hello"
End Sub

Sub AppStart (Args() As String)
   
    InitializeWithIp(mucast, "Multicast", 9901, mAddress)
    '
    StartMessageLoop
End Sub

Sub InitializeWithIp(Server As ServerSocket, EventName As String, Port As Int, ip As String)

    Server.Initialize(0, EventName)
    Dim myaddr As JavaObject
    myaddr = myaddr.InitializeStatic("java.net.InetAddress").RunMethod("getByName", Array(ip))
    Log("myAddr : " & myaddr)
   
    Dim ms As JavaObject = Server
    Dim msocket As JavaObject
    msocket.InitializeNewInstance("java.net.MulticastSocket", Array(Port))
    '.InitializeNewIstance("java.net.MulticastSocket", Array(Port))
    Log(" server : " & msocket)

    msocket.SetField("joinGroup", myaddr)

End Sub

These are the messages that I see in debug.

myAddr : (Inet4Address) /231.0.0.3
server : (MulticastSocket) java.net.MulticastSocket@5451c3a8
main._initializewithip (java line: 75)
java.lang.RuntimeException: Field: joinGroup not found in: java.net.MulticastSocket
at anywheresoftware.b4j.object.JavaObject$FieldCache.getField(JavaObject.java:306)
at anywheresoftware.b4j.object.JavaObject.SetField(JavaObject.java:173)
at b4j.example.main._initializewithip(main.java:75)
at b4j.example.main._appstart(main.java:46)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:93)
at anywheresoftware.b4a.BA.raiseEvent(BA.java:84)
at b4j.example.main.main(main.java:29)

tnx :(:(:(

pixet
 

pixet

Member
Licensed User
Longtime User
Hi,
Partially solved.

The objective is to arrive to implement a ENRP server
often used in the multimedia devices.
I'm using a small python script for testing and starts to work.
tnx

RFC sourcebook
http://www.networksorcery.com/enp/protocol/enrp.htm
IETF Tools
https://tools.ietf.org/html/rfc5353


Now the problem is,
I can not seem to send my variables in java code and can not seem to get used by the Java code.

B4X:
'Non-UI application (console / server application)
#Region Project Attributes 
    #CommandLineArgs:
    #MergeLibraries: True 
#End Region

Sub Process_Globals
    Dim muCastSock As UDPSocket
    'Dim muPacket As UDPPacket
    Private eotTimer As Timer
    Public firstTime As Long
   
    Public muAddr As String = "224.2.2.3"   
    'Public muAddr As String = "230.0.0.3"
    Public muPort As Int = 8888
    'Public muPort As Int = 9901
    Private mymsg As String = "End of Multicast Listener"
    Public messaggio As String
    Public sResult As String
    Public tstart As Long
    Public tend As Long
    Public lapsed As Double
    Public myTime As String
    Public t1 As Long
    Private speriod As Long
End Sub

Sub AppStart (Args() As String)
    DateTime.DateFormat = "yyyy-MM-dd"
    DateTime.TimeFormat = "HH:mm:ss.SSS"
    tstart = DateTime.Now
   
     
    'timePassato = CalcTimeLapsed(now, lapsed)
    BloccoEx
    Log("Control returned from blocking situation")
    Log(" : " & mymsg)
    'tstart = DateTime.Now   
   
    ExitApplication2(1)
    'StartMessageLoop
End Sub

Sub InitializeWithIp(EventName As String, Port As Int, ip As String)

    'Server.Initialize(0, EventName)
    Dim multi As JavaObject
    multi.InitializeNewInstance("java.net.MulticastSocket", Array(Port))
   
    Dim myaddr As JavaObject
    multi.RunMethod("joinGroup", Array(myaddr.InitializeStatic("java.net.InetAddress").RunMethod("getByName", Array(ip))))
    Log("myAddr : " & ip)
   
    Dim jo As JavaObject = Me
    jo.RunMethod("SetMulticastSocket", Array(EventName, multi, muCastSock))
    Log(" Info server : Starting Multicast server at ip " & ip & " port:  " & Port )
   
    'jo.RunMethod("rxPacket", Array(0, messaggio))
    'jo.RunMethod("rxPacket", Array(0, jo.RunMethod("getByName",Array(messaggio))))
   
    Log(" OK - Start of Multicast Listener")
    Dim pkt As JavaObject = Me

    'pkt.RunMethod("rxPacket", Array(messaggio))
   
    pkt.RunMethod("rxPacket", Array(muAddr, muPort, messaggio))
    Log("my: " & messaggio)
End Sub

Sub BloccoEx
    Log(" Start Time: " & tstart) 
    Try
        'InitializeWithIp("udp", 8888, mAddress)
        InitializeWithIp("udp", muPort, muAddr)
    Catch
        Log(LastException.Message)
    End Try 
    'mymsg = messaggio
    'TempoPassato(tnow,tend)
    tend = DateTime.Now
    speriod = (tend-tstart)/1000
    Log (" Time: " & speriod & " secondi")
End Sub



#if java
import java.io.*;
import java.net.*;

public static void SetMulticastSocket (String EventName, MulticastSocket socket, anywheresoftware.b4a.objects.SocketWrapper.UDPSocket udp) {
   udp.init(ba, EventName, 8192, socket);
}

//public static void rxPacket (String messaggio)
public static void rxPacket (String AddrMu, Integer PortVal, String messaggio) 

{

//public class MulticastReceiver {
//  public static void main(String[] args) {

    MulticastSocket socket = null;
    DatagramPacket inPacket = null;
    DatagramPacket outPacket = null;
    byte[] inBuf = new byte[256];
    byte[] outBuf = new byte[256];
    try {
      //Prepare to join multicast group
      socket = new MulticastSocket(8888);
      InetAddress address = InetAddress.getByName("224.2.2.3");
     //InetAddress address = InetAddress.getByName(AddrMu);
     
     socket.joinGroup(address);
     
     System.out.println("Start loop wainting Datagram");

      while (true) {
        inPacket = new DatagramPacket(inBuf, inBuf.length);
        outPacket = new DatagramPacket(outBuf, outBuf.length);
        socket.receive(inPacket);
        String msg = new String(inBuf, 0, inPacket.getLength());
        System.out.println("From " + inPacket.getAddress() + " Msg : " + msg);
       
        if (inBuf.length > 0) {
            System.out.println("Exit Loop Datagram arrived");
            break;
        }
        continue;
       
      }
    } catch (IOException ioe) {
      System.out.println(ioe);
    }
       
}

#end if

this is the answer on debug ...

B4X:
 Start Time: 1484244079758
myAddr : 224.2.2.3
 Info server : Starting Multicast server at ip 224.2.2.3 port:  8888
 OK - Start of Multicast Listener
Start loop wainting Datagram
From /192.168.123.155 Msg : very important data
Exit Loop Datagram arrived
my: 
 Tempo: 2 secondi
Control returned from blocking situation
 : End of Multicast Listener
 

Attachments

  • test_MulticastServer.zip
    2.4 KB · Views: 276
Upvote 0
Top