Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

Schnittstellen-Implementation/ "Übersetzung" aus bestehendem Java-Code nach C#
Dominicano
myCSharp.de - Member



Dabei seit:
Beiträge: 23
Herkunft: Dajabon

Themenstarter:

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

beantworten | zitieren | melden

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 :
Fehler
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
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16.030

beantworten | zitieren | melden

[Hinweis] Syntaxfehler selbst lösen (Compilerfehlermeldungen)

Hinweis: die Überladung an TCPClient kann so nicht passen.
private Nachricht | Beiträge des Benutzers
Palladin007
myCSharp.de - Member

Avatar #avatar-4140.png


Dabei seit:
Beiträge: 1.818
Herkunft: Düsseldorf

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Palladin007 am .
private Nachricht | Beiträge des Benutzers
Dominicano
myCSharp.de - Member



Dabei seit:
Beiträge: 23
Herkunft: Dajabon

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Palladin007
myCSharp.de - Member

Avatar #avatar-4140.png


Dabei seit:
Beiträge: 1.818
Herkunft: Düsseldorf

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Dominicano
myCSharp.de - Member



Dabei seit:
Beiträge: 23
Herkunft: Dajabon

Themenstarter:

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
KroaX
myCSharp.de - Member

Avatar #avatar-4080.jpg


Dabei seit:
Beiträge: 301
Herkunft: Köln

beantworten | zitieren | melden

[FAQ] NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.433

beantworten | zitieren | melden

Sowie [Artikel] Debugger: Wie verwende ich den von Visual Studio?.
private Nachricht | Beiträge des Benutzers