Laden...

Schnittstellen-Implementation/ "Übersetzung" aus bestehendem Java-Code nach C#

Erstellt von Dominicano vor 5 Jahren Letzter Beitrag vor 5 Jahren 2.269 Views
D
Dominicano Themenstarter:in
23 Beiträge seit 2007
vor 5 Jahren
Schnittstellen-Implementation/ "Übersetzung" aus bestehendem Java-Code nach C#

Hallo zusammen

Nachdem ich viele Jahre (ca.8) nicht mehr im Bereich Programmierung tätig war, möchte ich jetzt wieder anfangen. Es hat sich allerdings viel getan.....
Habe mich in den letzten Wochen in Xamarin vertieft, allerdings auf c#-Basis. Dabei stieß ich auf ein interessantes Beispiel für ein Server-Client-Programm - Server = PC , Client = Android) als Java und versuche nun, es in C# zu schreiben. Bis auf den letzten Punkt , die Implementierung einer Schnittstelle, funktioniert alles. Den ursprünglichen Java-Code findet man hier : https://www.myandroidsolutions.com/2013/03/31/android-tcp-connection-enhanced/
Das Problem liegt in der "MainActivity.cs" des Clienten :

        public class ConnectTask : AsyncTask<String, String, TCPClient>
        {
            protected override TCPClient RunInBackground(String[] message)
            {
                mTcpClient = new TCPClient(IOnMessageReceived<String>
                    {
                        override MessageReceived(String message)
                        {
                            PublishProgress(message);
                        }
                    });
                return null;
            }
            protected override void OnProgressUpdate(String[] values)
            {
                base.OnProgressUpdate(values);
                arrayList.Add(values[0]);
                mAdapter.NotifyDataSetChanged();
            }
        }

Ich habe es ohne Generics versucht und auch mit... es kommt immer die Fehlermeldung : > Fehlermeldung:

CS0119 "IOnMessageReceived<string>" ist "Typ" und im angegebenen Kontext nicht gültig. TCPClientTest C:\Users\Domin icano\source\repos\TCPClientTest\TCPClientTest\MainActivity.cs

Hat jemand eine Idee woran es liegt?

Ich arbeite mit VS2017.
Gruß Domi

16.807 Beiträge seit 2008
vor 5 Jahren

[Hinweis] Syntaxfehler selbst lösen (Compilerfehlermeldungen)

Hinweis: die Überladung an TCPClient kann so nicht passen.

2.078 Beiträge seit 2012
vor 5 Jahren

In C# gibt es keine Inline Implementierung, Du brauchst eine eigene Klasse.

public class MyClass : IOnMessageReceived
{
    public MessageReceived(string message)
    {
        PublishProgress(message);
    }
}

Die PublishProgress-Methode musst Du dann anderweitig verfügbar machen, z.B. indem Du das Objekt, von dem Du die Methode aufrufen willst, als Parameter an den Konstruktor übergibst und in der Klasse dann merkst.

Alternativ kannst Du auch eine "Dummy-Implementierung" basteln, die den Inhalt der MessageReceived-Methode als Delegat im Konstruktor übergeben bekommt.

D
Dominicano Themenstarter:in
23 Beiträge seit 2007
vor 5 Jahren

Die Klasse ist vorhanden:

 public class TCPClient
    {
        public static String SERVER_IP = "192.168.2.107";
        public static int SERVER_PORT = 8000;
        private String mServerMessage;
        public IOnMessageReceived<String> mMessageListener = null;
        private bool mRun = false;
        private BinaryWriter mBufferOut;
        private BinaryReader mBufferIn;

        public TCPClient(IOnMessageReceived<String> listener)
        {
            mMessageListener = listener;
        }
        public void SendMessage(String message)
        {
            if (mBufferOut != null)
            {
                mBufferOut.Write(message);
                mBufferOut.Flush();
            }
        }
        public void StopClient()
        {
            SendMessage(ClientMessages.Disconnect);
            mRun = false;
            if (mBufferOut != null)
            {
                mBufferOut.Flush();
                mBufferOut.Close();
            }
            mMessageListener = null;
            mBufferIn = null;
            mBufferOut = null;
            mServerMessage = null;
        }
        public void Run()
        {
            mRun = true;
            try
            {
                IPAddress serverAdress = IPAddress.Parse(SERVER_IP);
                Log.Error("TCP Client", "C: Connecting...");
                TcpClient tcpClient = new TcpClient();
                tcpClient.Connect(serverAdress, SERVER_PORT);
                try
                {
                    NetworkStream stream = tcpClient.GetStream();
                    mBufferIn = new BinaryReader(stream);
                    mBufferOut = new BinaryWriter(stream);
                    while (mRun)
                    {
                        mServerMessage = mBufferIn.ReadString();
                        if (mServerMessage != null && mMessageListener != null)
                        {
                            mMessageListener.MessageReceived(mServerMessage);
                        }
                    }
                    Log.Error("RESPONSE FROM SERVER", "S: Received Message: '" + mServerMessage + "'");
                }
                catch (Exception err)
                {
                    Log.Error("TCP", "S: Error", err);
                }
                finally
                {
                    tcpClient.Close();
                }
            } catch (Exception e)
            {
                Log.Error("TCP","C: Error",e);
            }
        }
//        public interface IOnMessageReceived<T> { void MessageReceived(String message); }
    }
    public interface IOnMessageReceived<T> { void MessageReceived(String message); }

Dort treten auch keine Fehler auf.

2.078 Beiträge seit 2012
vor 5 Jahren

Ich hab wohl TCPClient mit IOnMessageReceived verwechselt, jetzt passt mein winziges Beispiel.

Das ändert aber nichts daran, dass es in C# keine Inline-Implementierung gibt und Du das Interface in Form einer eigenen Klasse implementieren musst.

D
Dominicano Themenstarter:in
23 Beiträge seit 2007
vor 5 Jahren

Konnte das Problem jetzt lösen, indem ich den BackgroundWorker erfolgreich einsetzte.
Jetzt habe ich allerdings eine Kuriosität: Bei der Ausführung auf meinem Smartphone wird manchmal eine Ausnahme (NullReferenceException) ausgegeben, manchmal nicht......Habe eine Testschleife eingerichtet mit 100 Durchläufen und 100ms sleep , dabei kommt die Exception zu verschiedenen Zeiten : mal beim 10ten Durchlauf, mal beim 89ten, und manchmal garnicht....
Sleep habe ich auch schon geändert auf bis zu 5000...keine Änderung.
Hat jemand dazu eine Idee?