Jump to content

Externe Schnittstelle mit Java


gmd

Empfohlene Beiträge

Hallo, 

loesungen fuer Python und VisualBasic hatte ich gefunden. Andy hat eine C++ version, die er mir nettwerweise zur verfuegung gesteltt hat. 
Hier ist eine Java version und dann mache ich noch einen test mit C# bevor ich mich entscheide ob C# oder Java verwende.

package mbs_listener;

import java.io.BufferedReader;
import java.net.Socket;
import java.net.UnknownHostException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;

/**
 *
 * @author gmd
 */
public class MBS_Listener {

    final static String ip = "127.0.0.1";
    final static int port = 31286;

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        Socket socket       = null;
        byte[] tempIn       = new byte[1024];
        InetAddress target  = null;
        BufferedReader in   = null;
        String inputLine;
        boolean connected   = true;
        
        try {
            target = InetAddress.getByName(ip);
            socket = new Socket(ip, port);
            socket.setSoTimeout(1000);
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        } catch (UnknownHostException e) {
            System.out.println(e);
        } catch (IOException e2) {
            System.out.println(e2);
        }


        while (connected && in != null && socket != null) {
            try {
                inputLine = in.readLine();
                System.out.println("Client said : " + inputLine);

                if (inputLine == null) {
                    System.out.println("Client Disconnected!");
                    connected = false;
                }
            } catch (java.net.SocketTimeoutException e) {
                System.out.println("Timed out trying to read from socket");
            } catch (IOException e2) {
                System.out.println(e2);
            }

        }
    }
}

 Das ist nur ein einfacher listener. Wenn ich mich entschieden habe welchen weg ich gehe mache ich ein einfaches multithreaded bidirektionales beispiel bevor ich dann weiter ausbaue.

Das wird ne weile dauern. 

Vielleicht is ja jemand interessiert. Obiges beispiel kann mit Netbeans geladen werden. 

gruss

gmd

 

Bearbeitet von gmd
Link zu diesem Kommentar
Auf anderen Seiten teilen

Und hier ist die C# version. Projekt initialisiert als WPF application und fuer test mal gerade in die window class eingebaut.

Das wird natuerlich anders in einer richtigen app. 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Net;
using System.Net.Sockets;
using System.Diagnostics;

namespace MBS
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        
        public MainWindow()
        {
            InitializeComponent();
        
            Socket socket           = null;
           
            TcpClient tcpClient = new TcpClient("127.0.0.1", 31286);
            NetworkStream networkStream = tcpClient.GetStream();
            try
            {
                Debug.WriteLine("Waiting for connection");
                while (tcpClient != null) { 
                   Byte[] data  = new Byte[1024];
                   String responseData = String.Empty;
                    // Read the event data
                    Int32 bytes = networkStream.Read(data, 0, data.Length); //(**This receives the data using the byte method**)
                    responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes); //(**This converts it to string**)
                 
                    Debug.WriteLine(responseData);    
                }
            }
            catch (Exception e)
            {
                socket.Close();
            }
        }   
    }
}
 

 gruss

gmd

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo gmd,
das ist für einen Kanal.
Aber da die receive-Funktionen 'hängen', solange nichts reinkommt, muß da noch Multithreading rein, wenn der andere Kanal parallel genutzt werden soll.
Da wird's schon aufwändiger.

Gruß
  Andy

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja sicher aber multithreading und timeout handling ist weder in Java noch in C# ein problem. 
Werde das posten wenn es soweit ist. Derzeit gehe ich erst mal an die Weichensteuerung in der Blockverwaltung. 

gruss

gmd

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hier ist die multi threaded version in C# mit dem event display in WPF. Die versionsnummer wird ausgelesen um das kommando senden zu demonstrieren. Es ist eine minimale version ohne viel schnickschnack. 
Die naechsten schritte sind erstmal ein vernuenftiges filter einzubauen um die events zu sortieren und verarbeitbar zu machen.  Die einfache anzeige mit filter wird bleiben, auch mit dem stellpult, zum testen. In MBS kann man ja nur einen filterwert setzen, zumindest habe ich das so verstanden. Das reicht mir nicht.

logProgram.thumb.jpg.10dfc7796a85eea1678a2ebee50038dc.jpg

 

MBS_C#.zip

gruss

gmd

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo gmd

Danke für den Code!
Schließlich gehört die Schnittstelle auch zum MBS.
Und es haben alle was davon, wenn jemand Plugins entwickelt.
Und je mehr sich damit auskennen, um so besser.

Die Absicht der Mehrheit hier, das alles zu boykottieren verstehe ich irgendwie nicht.
Man hat immer noch nicht verstanden, daß es unterschiedliche Interessen gibt.
Und auch eine Minderheit hat ihre Berechtigung. Übrigens nicht nur beim MBS.


Gruß
Thomas

P.S. Compilieren hat funktioniert. Läuft schonmal ganz gut:

aaa.thumb.jpg.49518e15ce1dffe29a92e41a7c302a7e.jpg

Bearbeitet von HaNNoveraNer
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

an dieser Stelle möchte ich nur anmerken, das das Themengebiet um was es geht schon sehr eindeutig umschrieben ist...

Erweiterungen (Plugins)

Erweitern Sie das 3D-Modellbahn Studio um eigene Funktionen durch Anbindung externer Programme.

... da kann wohl jeder für sich schon im Vorfeld entscheiden, ob es ihn anspricht oder nicht... und dass da auch mal ein Code-schnipsel in einer Programmiersprache auftaucht ist eigentlich (bei der Unterzeile des Themas) nicht weiter verwunderlich... 

Gruß
EASY

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich bin dabei das programm taeglich zu erweitern (nehme mir 1-2 Stunden pro Tag) werde aber nicht mehr posten. Das ist mir einfach zu bloede mit diesen besserwissern.
Falls interesse besteht dann sende PN und ich werde  jeden persoenlich bedienen. Sind ja wahrscheinlich sowiso nicht viele. Das gleiche gilt in zukunft fuer meine LUA scripts und testanlagen.
Ich sehe das als ob man jemandem 10 Euro schenkt. und man wird angemeckert wie man dazu kaeme oder warum es nicht 100 sind.

gruss
gmd

 

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hello fellow members

Please do not discourage others from posting in this forum. I have learned a great deal from reading other peoples' posts. If you do not like the idea of coding in Lua (or C# or Java or even VB) then don't code in Lua etc and don't bother reading the posts which contain  code. But please do not try to stop other people from discussing such things.

I use the Pascal interface to control such things as locomotive routing. I have gained enormous pleasure from developing Delphi programs to control my layouts. I can, therefore, see the potential of an interface in a more frequently used language. 

When Lua was included in V5 I chose to learn that from scratch - nobody forced me to, but it gave me great pleasure. A lot of what I learnt came from reading posts in this forum.

Programmers - please do continue to share your knowledge here in the forum. Please do not confine your knowledge to PN.

Best wishes

EricD

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo @gmd ,

mach auf jeden Fall weiter, keine PN, dieser Teil des Forums ist genau dafür eingerichtet. Wer nicht will (kann) muß hier nicht die Beiträge lesen.

Ich selbst mache zur Zeit ein paar Test mit Python, da brauche ich keinen Compiler.

Ein Programm wie Rocrail zu lernen, da ist mir der Aufwand zu groß.

Mit welchem Compiler (kostenlos) kann man das compilieren?

Gruß Martin

Link zu diesem Kommentar
Auf anderen Seiten teilen

Martin,

VisualStudio C# Community version. 
Ich benutze das nur weil ich ein alte lizenz habe und weil ich viel UI teile bauen muss.
Es ist nicht die einfachste umbegung aber leistungsfaehig wenn man nicht gerade eine 
webapp baut.
RocRail ist nicht nur aufwendig zu lernen sondern auch sehr muehsam zu bedienen.
Ist halt uralt. Du kannst mira aber eine PN schicken dann gebe ich dir meine email.

gruss

gmd 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto besitzen, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen.

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...