Laden...

Forenbeiträge von Nexus633 Ingesamt 54 Beiträge

21.10.2018 - 14:28 Uhr

Wenns funktioniert ist es schon mal gut. Aber Bilddaten haben wirklich nirgends etwas als String zu suchen.
Das hier

public string Image { get; set; }  

verunsichert jeden der das liest. Auch dich in ein paar Monaten, wenn du ein besseres Verständnis von dem hast was du da tust..

Nein haben Sie auch nicht, es wird aber als solches übergeben, daher


var response = RestClient.Execute<Rrd>(request);

speichert der RestClient es als String. Ich hätte es ja sonst direkt als Byte[] verarbeitet.
Ich verarbeite es weiter unten dann als Byte[]

21.10.2018 - 14:07 Uhr

Der debugger zeigt mir den datenstrom so an.
ich habe das problem aber bereits gelöst. 😃

um es genacu zu zeigen


        public Image LoadCpuImage(List<FormatRrd> formatRrd, FormatRrdTime time = FormatRrdTime.hour, FormatRrdUsed formatRrdUsed = FormatRrdUsed.MAX)
        {
            string format= "";
            foreach (FormatRrd rrd in formatRrd)
                format+= rrd.ToString() + ',';
            var request = LoadImage($"nodes/ProxmoxApiServer/rrd", format, time.ToString(), formatRrdUsed.ToString());
            var response = RestClient.Execute<Rrd>(request);

            byte[] imageByte = response.Data.ImageByte;

            return Image.FromStream(new MemoryStream(imageByte));
        }

        private RestRequest LoadImage(string resource, string ds, string timeframe, string cf = null)
        {
            var request = new RestRequest(resource, Method.GET) { RequestFormat = DataFormat.Json };
            request.AddCookie("PVEAuthCookie", Ticket.ticket);
            request.AddParameter("ds", ds);
            request.AddParameter("timeframe", timeframe);
            if(cf != null)
                request.AddParameter("cf", cf);
            request.RootElement = "data";
            return request;
        }


    public class Rrd
    {
        
        public string Filename { get; set; }
        public string Image { get; set; }

        public byte[] ImageByte
        {
            get { return Image.Select(x => (byte)x).ToArray(); }
        }
    }

21.10.2018 - 08:10 Uhr

Nein leider reicht das nicht, das war das erste was ich probierte. Leider nimmt er das nicht. Ungültiger Parameter kommt als exception 😦

Das Base64 habe ich direkt nach dem Post entfernt und als edit nachgetragen.

20.10.2018 - 22:15 Uhr

Ich habe die lösung gefunden. Das bild wird mir als string geben warum weiß ich nicht. Ich entwickel aktuell ein Proxmox Client. Proxmox gibt es mir so 😃

Ich habe aber festgestellt das



byte[] imageByte = response.Data.Image.Select(x => (byte)x).ToArray();
string base64String = Convert.ToBase64String(imageByte);

return Image.FromStream(new MemoryStream(Convert.FromBase64String(base64String)));

ausreicht. Die einfachsten dinge kommen immer zum schluss 😃

Ich danke dir dennoch für die anteilnahme. 😃

edit: das Base64 ist sinnlos 😃



byte[] imageByte = response.Data.Image.Select(x => (byte)x).ToArray();

return Image.FromStream(new MemoryStream(imageByte));

20.10.2018 - 17:29 Uhr

Keiner hier kann an dem Ausschnitt erkennen, was der String wirklich darstellt.

der String ist knapp 25k zeichen lang, soll ich den wirklich posten ?

20.10.2018 - 17:18 Uhr

Hallo,
danke für die schnelle Antwort. Nein das suche ich nicht. Ich bekomme mittels einer RestAbfrage ein Bild als string gesendet was das format hat was ich unten beschrieben hatte.

diesen string will ich als bild wieder datrstellen. Leider klappt es nicht. 😃

Mehr als den fehler ungültiger Parameter kann ich nennen da kein anderer fehler kommt.-
Bei deinem Link wird nach einer Datei gefragt. Wenn ich dort den string verwende, kommt folgender fehler - Ungültige Zeichen

20.10.2018 - 16:41 Uhr

Hallo´liebe leute,
ich stehe vor einem Problem. Ich habe ein Bild als String und möchte dieses Bild nun Darstellen. Ich habe schon einige ansätze probiert.

Fehlermeldung:
Fehler: Image.FromStream(ms); - Ungültieger Parameter

Das habe ich aktuell versucht:

Versuch 1.


byte[] imageBytes = Encoding.UTF8.GetBytes(Controller.LoadCpuImage());
byte[] byteArray = GetImageBytesFromOLEField(imageBytes);
using (MemoryStream ms = new MemoryStream())
{
    ms.Write(byteArray, 0, byteArray.Length);
    ms.Position = 0;
    ImageBoxCpu.Image = Image.FromStream(ms, false, false);
}

Versuch 2.


var result = String.Join("", Controller.LoadCpuImage().Select(b => b > '0' && b < '9' ? b.ToString() : String.Format(@"\u{0:x4}", b)));

byte[] imageBytes = Encoding.UTF8.GetBytes(result);

using (MemoryStream ms = new MemoryStream())
{
    ms.Write(imageBytes, 0, imageBytes.Length);
    ms.Position = 0;
    ImageBoxCpu.Image = Image.FromStream(ms);
}



 private byte[] GetImageBytesFromOLEField(byte[] oleFieldBytes)
        {

            const string BITMAP_ID_BLOCK = "BM";

            const string JPG_ID_BLOCK = "\u00FF\u00D8\u00FF";

            const string PNG_ID_BLOCK_HDR = "\u0089PNG\r\n\u001a\n\0\0\0\rIHDR\0\0\u0003";

            const string PNG_ID_BLOCK = "\u0089PNG\r\n\u001a\n";

            const string GIF_ID_BLOCK = "GIF8";

            const string TIFF_ID_BLOCK = "II*\u0000";



            byte[] imageBytes;



            // Get a UTF7 Encoded string version

            Encoding u8 = Encoding.UTF7;

            string strTemp = u8.GetString(oleFieldBytes);



            // Get the first 300 characters from the string

            string strVTemp = strTemp.Substring(0, 300);



            // Search for the block

            int iPos = -1;

            if (strVTemp.IndexOf(BITMAP_ID_BLOCK) != -1)

                iPos = strVTemp.IndexOf(BITMAP_ID_BLOCK);

            else if (strVTemp.IndexOf(JPG_ID_BLOCK) != -1)

                iPos = strVTemp.IndexOf(JPG_ID_BLOCK);

            else if (strVTemp.IndexOf(PNG_ID_BLOCK_HDR) != -1)

                iPos = strVTemp.IndexOf(PNG_ID_BLOCK_HDR);

            else if (strVTemp.IndexOf(GIF_ID_BLOCK) != -1)

                iPos = strVTemp.IndexOf(GIF_ID_BLOCK);

            else if (strVTemp.IndexOf(TIFF_ID_BLOCK) != -1)

                iPos = strVTemp.IndexOf(TIFF_ID_BLOCK);

            else if (strVTemp.IndexOf(PNG_ID_BLOCK) != -1)

                iPos = strVTemp.IndexOf(PNG_ID_BLOCK);

            else

                throw new Exception("Unable to determine header size for the OLE Object");



            // From the position above get the new image

            if (iPos == -1)

                throw new Exception("Unable to determine header size for the OLE Object");



            //Array.Copy(

            imageBytes = new byte[oleFieldBytes.LongLength - iPos];

            MemoryStream ms = new MemoryStream();

            ms.Write(oleFieldBytes, iPos, oleFieldBytes.Length - iPos);

            imageBytes = ms.ToArray();

            ms.Close();

            ms.Dispose();

            return imageBytes;

        }

Der String ist 24513 Zeichen lang daher werde ich nur einen ausschnitt anhängen-

"\u0089PNG\r\n\u001a\n\0\0\0\rIHDR\0\0\u0003 \0\0\0È\b\u0002\0\0\0\u009fí\u0012M\0\0\0\u0006bKGD\0ÿ\0ÿ\0ÿ ½§\u0093\0\0 \0IDATx\u009cí\u009d}P\u0014WºÿÏø\u0012\u008d0à*\u0013^6JF\u0083\u001a \u0098\u0014r£\u0094Ê\u0010ÄP[zoR˾äÞ-Öº%+\u001bcUÖìjîn\u0095\u00187u\u008dn¼\u009bÊÊ\u008dZhÝÕZ7Ù¤v\u0013\*¤¤Â\u0018(I)\u0094/\u0089¸ÃUæ\na\u0080À usw.... ... .... .... ... "

Wie kann ich das zu einem bild wandeln ?

Ich hoffe ihr könnt mir helfen.

LG

26.08.2018 - 09:51 Uhr

Auch hier lenke ich wieder ein 😃 die list gebe ich ja aktuell in dem zenario zurück. Oder eher ich würde in dem zenario eine list zuruckgeben.

Das Ziel ist eine list. Wie man im json erkennen kann ist der Typ storage 2x vorhanden. Das kann auch vom Typ Pool und node vorkommen. Demnach benötige ich eine Liste. Das Problem ist aber auch nicht die Liste sondern die Klasse oder Methode an sich. Ich weiß nicht wie genauer ich das Problem noch beschreiben soll/kann oO

26.08.2018 - 09:04 Uhr

Hallo,
nein daran liegt es nicht. Das war noch ein Überbleibsel eines versuchs 😃 das kommt wieder raus.
Das Problem ist das ich sie einzeln Aufschlüssen muss. Sprich ich muss durch den case prüfen welcher Typ angegeben ist und die Funktion dann für die entschprechende Klasse aufrufen.

Allerdings versuche ich das mittels den propertys in der resource Klasse. Das scheitere ich.

Wenn ich den methoden Aufruf so gestalte


var o = JObject.Parse(response.Content);
var a = o.SelectToken("data").Select(jt => jt.ToObject<Dictionary<string,object>>()).ToList();
List<Resources> resources = a.DictionaryToObject<Resources>();

Möchte ich es ja in Recources entpacken. Nun Recources hat ja 3 propertys die als reference hinterlegt sind.
im der erweitwrungsmethode sucht er sie die property und legt diese als key fest dann versucht er die value zu binden. Das klappt aber nicht. Er findet ja nicht die dazugehörige property.

Nun hatte ich versucht in der erweitwrungsmethode zu mittels einer while Schleife zu prüfen ob die Klasse einen Typ oder eine reference besitzt. Bei einer reference wiederhole ich den Vorgang. So meine Idee!

Leider ohne Erfolg. Es kommt jedesmal die exception das die Typen nicht zu einander passen. Der Werte kann er auch nicht richtig zuordnen.

Ich hoffe jetzt habe ich mich etwas besser ausgedrückt.

25.08.2018 - 21:28 Uhr

Hallo liebe leute,
nach langem Googlen und testen bin ich nun am punkt der verzweiflung angekommen. Ich bitte um mithilfe und denkanstöße!

Ich habe mittels einer Rest anfrage, daten abgefragt.


200 OK
[
   {
      "id" : "/pool/Admin",
      "pool" : "Admin",
      "type" : "pool"
   },
   {
      "cpu" : 0.000748888497192211,
      "disk" : 2205855744,
      "id" : "node/ProxmoxApiServer",
      "level" : "",
      "maxcpu" : 8,
      "maxdisk" : 1950353915904,
      "maxmem" : 33586642944,
      "mem" : 1339650048,
      "node" : "ProxmoxApiServer",
      "status" : "online",
      "type" : "node",
      "uptime" : 1111322
   },
   {
      "disk" : 2205855744,
      "id" : "storage/ProxmoxApiServer/local",
      "maxdisk" : 1950353915904,
      "node" : "ProxmoxApiServer",
      "status" : "available",
      "storage" : "local",
      "type" : "storage"
   },
   {
      "disk" : 2205855744,
      "id" : "storage/ProxmoxApiServer/Images",
      "maxdisk" : 1950353915904,
      "node" : "ProxmoxApiServer",
      "status" : "available",
      "storage" : "Images",
      "type" : "storage"
   }
]


Das habe ich nun in ein Dictionary<string, object> umgewandelt. nun habe ich mir eine erweiterungsmethode geschrieben die es mir in einer Klasse deserializen soll.


 var o = JObject.Parse(response.Content);
 var a = o.SelectToken("data").Select(jt => jt.ToObject<Dictionary<string,object>>()).ToList();
            List<Resources> resources = new List<Resources>();
            int pool = 0;
            int node = 0;
            int storage = 0;
            var dummi = new Resources();
            foreach (Dictionary<string,object> dd in a)
            {

                switch (dd["type"])
                {
                    case "pool":
                        var Resourcepool = dd.DictionaryToObject<Resources.Resourcepool>();
                        pool++;
                        break;
                    case "node":
                        var Resourcenode = dd.DictionaryToObject<Resources.Resourcenode>();
                        node++;
                        break;
                    case "storage":
                        var Resourcstorage = dd.DictionaryToObject<Resources.Resourcestorage>();
                        storage++;
                        break;

                        
                }
            }

Das funktioniert auch super, nur möchte ich die vorgehensweise verkleinern und es am besten so schreiben.


var o = JObject.Parse(response.Content);
var a = o.SelectToken("data").Select(jt => jt.ToObject<Dictionary<string,object>>()).ToList();
List<Resources> resources = a.DictionaryToObject<Resources>();

Leider komme ich an diesem Punkt zum scheitern...

Meine erweiterungsmethode:


    public static class Extension
    {
        public static T DictionaryToObject<T>(this Dictionary<string, object> values) where T : new()
        {
            TextInfo ti = CultureInfo.CurrentCulture.TextInfo;
            Type t = typeof(T);
            T instance = new T();
            
            foreach (KeyValuePair<string, object> kvp in values)
            {
                PropertyInfo prop = t.GetProperty(ti.ToTitleCase(kvp.Key));
                prop.SetValue(instance, kvp.Value, null);
            }

            return instance;
        }
    }

meine Klasse:


    public class Resources
    {
        public Resourcenode ResourceNode { get; set; }
        public Resourcepool ResourcePool { get; set; }
        public Resourcestorage ResourceStorage { get; set; }

        public class Resourcenode
        {
            public double Cpu { get; set; }
            public long Disk { get; set; }
            public string Id { get; set; }
            public string Level { get; set; }
            public long Maxcpu { get; set; }
            public long Maxdisk { get; set; }
            public long Maxmem { get; set; }
            public long Mem { get; set; }
            public string Node { get; set; }
            public string Status { get; set; }
            public string Type { get; set; }
            public long Uptime { get; set; }
        }

        public class Resourcepool
        {

            public string Id { get; set; }
            public string Pool { get; set; }
            public string Type { get; set; }
        }

        public class Resourcestorage
        {
            public long Disk { get; set; }
            public string Id { get; set; }
            public long Maxdisk { get; set; }
            public string Node { get; set; }
            public string Status { get; set; }
            public string Storage { get; set; }
            public string Type { get; set; }
        }
    }

Hat jemand eine idee ?

Mit freundlichem Gruß

12.02.2018 - 16:24 Uhr

danke für die schnelle Antwort, dann werde ich es anders lösen.

12.02.2018 - 13:58 Uhr

Hallo liebe Leute,
ich habe eine kurze Frage.

Ich nutze NLog und benötige beim logevent 2 weitere Eigenschaften. Ist es möglich die hinzuzufügen?

Es ist eine assembly

Ich benötige



public string Customer { get; set; } 
public string Action { get; set; } 

Wie kann ich das bewerkstelligen?

Vielen lieben Dank

22.01.2018 - 22:50 Uhr

Hallo,
nun mische ich mich mal ein... Wenn du solche Antworten von dir gibst und nicht auf Rat anderer hörst, bist du hier falsch...

Dein Antworten anderen gegenüber sind sehr frech und undankbar. Dein Problem was du zu lösen versuchst ist relativ einfach - auch für ein neuling. Nur verstehst du die Antworten anderer nicht die dir die Lösung bereits gegeben haben.

Dieses Problem lässt sich mit den basics lösen... Lese dir diese durch und setzte sie durch. Dann bekommst du dein Problem auch gelöst.

Auch ich sage dir - lass singleton daraus. - lass es einfach. Wenn du mal weiter bist und Erfahrungen gesammelt hast, beschäftige dich mit dem Thema, dann kennst du auch dessen Aufgabe Gebiet.

Ich bin derzeit z.B. an mono dran, hier lerne ich quasi auch von Anfang. Ich könnte es mir auch leicht machen und 1zu1 die unterstützten Funktionen von C# nutzen. Da es aber Linux ist nutze ich die mono libs die wiederum andere Funktionen die spezifisch sind um Linux Inhalte zu nutzen. Bestes Beispiel Syscal.uname().

Einfachste Dinge müssen neu erlernt werden. Das bedeutet lesen, studieren und probieren!

So mehr vom Thema abgeschweift, ich hoffe aber das du weißt was ich dir sagen will.

Lieben Gruß

22.12.2015 - 18:24 Uhr

Hey,
danke euch für die Antwort 😃
Ich bin gerade dabei ein angefangenes Projekt neu mit MVC zu schreiben.
Der Anfang klappt soweit und es ist gleich viel übersichtlicher.

Danke euch 😃

20.12.2015 - 12:13 Uhr

Hallo,
ich habe nun schon einige kleinere Projekte Realisiert. Nun komme ich aber zu einem Projekt was ein wenig größer ist und eine gewisse Struktur zur Übersicht benötigt.

Nun stellt sich mir die Frage ob ich ein UI Design Pattern nutze... Ich habe mich mit diesem Thema noch nicht intensiv beschäftigt, habe mir aber gewiss 3stk angesehen und mir einiges angelesen.

MVC
MVP
MVVM

Ich würde aber gerne die Unterschiede dieser 3 erfahren, was wird wo am besten eingesetzt wo kann ich mit was am besten Arbeiten.

Gibt es noch andere als diese 3 ?

Meine Anwendung soll viele GridViews und Events verwenden...

Ich weiß leider auch nicht wie ich das ganze besser beschreiben kann 😃 ?!
Ich hoffe ihr könnt mir da Tipps geben 😃

17.08.2015 - 14:13 Uhr

Warum liest Du nicht einfach die Dokumentation, schaust Dir Tutorials an.
Also bei aller Liebe.. aber ein bisschen Eigeninitiative kann man verlangen.

Das werde ich 😃 Tut mir leid.

Dann hast du aber die PackageManager von Linux komplett falsch verstanden und fällst auf diejenigen Linuxer rein die meinen die reine Leere ( ist so gemeint ) zu vertreten.

Wenn du dein Package richtig erstellst, werden die richtigen Dependencies mit installiert.

Ich persönlich würde es blöder finden wenn jede mini Anwendung das ganze Mono mitbringen würde.

Das ist mir durchaus bewusst. Wäre nicht das erste Paket von mir 😃 Dennoch dient die Software als schnittstelle und daher wäre es unnötig eine gesammte runtime zu Installieren. Daher frage ich hier 😃

Aber jeder hat da eine andere Meinung 😃 Du siehst es so und ich so 😃.
Trtzdem danke an alle 😃

Mit freundlichem Gruß

17.08.2015 - 12:44 Uhr

Dann verwendest du mkbundle falsch. Wenn du mono statisch dagegen linkst sind alle nötigen Libraries mit in der executable.

Ja dann verwende ich es falsch... Wie funktioniert das denn ? Meine kenntnisse mit verlinken über die Konsole sind = 0 leider ^^... Kann mir da jemand den richtigen ansatz liefern ?

17.08.2015 - 11:47 Uhr

Hey,

Hey,
was du auch noch versuchen kannst ist das tool mkbundle. Das generiert dir aus deiner Anwendung und mono eine einzelne Executable. Sollte für deinen Zweck ausreichen:
Für mehr Informationen siehe hier:

>

mkbundle verwende ich bereits bringt aber nichts auf einem Frischen System. Es geht mehr darum das sobald das Produkt veröffentlich wird, Leute sich das Paket runterladen können und ausführen können ohne noch 20 weitere Pakete installieren zu müssen.

Das beste beispiel was ich nannte ist der Server 7 Days to Die 😃

Hi,

das gehört jetzt vielleicht nicht unbedingt zum Thema ... aber wieso möchtest du auf dem System keine Mono-Runtime installieren? Ich wüsste auf Anhieb nicht, was dagegen sprechen könnte. Es sei denn, es ist ein Produktivsystem, dessen Konfiguration aus irgendwelchen Gründen nicht angefasst werden darf.

Dass man die Mono-Runtime in das Programm mit rein packen kann, wusste ich noch nicht. Aber ist das nicht ein bisschen viel Overhead? Du musst das ja dann für jedes Projekt machen ...

Aus diesem grund 😃.

Mit freundlichem Gruß

15.08.2015 - 15:02 Uhr

Hey,
Danke für die Info 😃 die Dokumentation bin ich durchgegangen nur beim verstehen harpet es 😃
Daher frage ich hier um Unterstützung 😃.

15.08.2015 - 13:14 Uhr

Hallo,
ich beschäftige mich gerade mit Mono.

Ich habe mir ein kleine Test Programm geschrieben... Naja was heißt geschrieben - ist ein einfaches Hello World. Das Hello world reicht aber aus um zu testen wie ich dieses Projekt ohne Mono zu Installieren auf einem Frisch Installiertem Debian System auszuführen.

Ich habe einen ansatz gefunden das es mir ermöglicht die datei ohne mono hallo.exe auszuführen.


using System;

namespace Mono_Test
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hallo Mono Welt !");
        }
    }
}

root@srv003-Debian-Mono:/home# mcs hallo.cs
root@srv003-Debian-Mono:/home# mkbundle --static hallo.exe -o hallo

nun kann ich das Programm mit ./hallo ausführen und es kommt:

root@srv003-Debian-Mono:/home#
Hallo Mono Welt !
root@srv003-Debian-Mono:/home#

Nun möchte ich das Programm auf einem Frisch Installiertem Debian System ausführen.
Es kommt:

root@srv001-Debian:/home#./hallo

The assembly mscorlib.dll was not found or could not be loaded.
It should have been installed in the `/usr/lib/mono/4.5/mscorlib.dll' directory.

Was auch Logisch ist, da Mono nicht Installiert ist 😃 Es ist Möglich die assembly manuel in den Ordner "/usr/lib/mono/4.5/" zu kopieren. Das Programm lässt sich nun ausführen.

Das soll aber nicht sinn und Zweck der geschichte sein. Mir ist aufgefallen das dass Spiel (Server)

7 Days to Die in C# auf Mono geschrieben wurde und ohne Installation von Mono ausgeführt werden kann.

Nun meine eigentliche Frage:
Wie funktioniert das ganze ? Ist es überhaupt möglich oder Tricksen die Entwickler von "7 Days to Die" ?

Mit freundlichem Gruß

13.08.2015 - 00:05 Uhr

Hier ein kleines Beispiel 😃

Online Status ändern 😃


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SKYPE4COMLib;

namespace SkypeTest
{
    class Program
    {
        public static Skype skype = new Skype();
        static void Main(string[] args)
        {
            User currentUser = skype.get_User();
            // Online Setzten
            skype.ChangeUserStatus(skype.Convert.TextToUserStatus("ONLINE"));

            // Beschäftigt Setzten kann ich dir nicht sagen :-)
            // skype.ChangeUserStatus(skype.Convert.TextToUserStatus("DO NOT DITURB"));

            // Abwesend Setzten
            // skype.ChangeUserStatus(skype.Convert.TextToUserStatus("AWAY"));
            
            // Unsichtbar Setzten
            // skype.ChangeUserStatus(skype.Convert.TextToUserStatus("INVISIBLE"));
           
            // OfflineSetzten
            // skype.ChangeUserStatus(skype.Convert.TextToUserStatus("OFFLINE"));
        }
    }
}

12.08.2015 - 23:53 Uhr

Hey,
schau dir das mal an 😃

Need Skype4ComLib Documentation

Du benötigst die SKYPE4COMLib 😃 Leider wird in diesem Thread beschrieben, das keine weiteren entwickler diese Lib erhalten. Er hat aber ein Link geschickt 😃

Bischen googlen dann findest du auch Code Snippets 😃

Mit freundlichem Gruß

11.08.2015 - 13:57 Uhr

Hey,
danke für eure ansätze

@wcseller
ich habe mir die Klasse angeschaut und eine weitere Eigenschaft hinzugefügt die bei True den Rahmen Rot setzt und die Animation auch.

Funktioniert Tadellos.

Danke dir für den Hinweis.

10.08.2015 - 21:10 Uhr

Hey,
Ok das jetzt Peinlich... In der Normalen Form funktioiert es.
Ich nutze derzeit das MaterialForm von MaterialSkin.Controls.

Kann das daran liegen das es von dem Framework nicht unterstützt wird ?
Gibt es auch noch andere wege um dies zu virsualisieren ?

Möchte ungerne das Style ändern 😃

Ich finde das sieht gut aus 😃

Lieben Gruß

10.08.2015 - 17:26 Uhr

Hallo,
ich benötiege wieder einen Tipp von euch.

Ist es möglich einen roten Rahmen um eine Textbox zu setzten, sofern eine Validierung fehlgeschlagen ist ?

Ich habe mehrere ansätze über goolge gefunden. z.B.


        bool focus = false;
        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            if (focus)
            {
                textBox1.BorderStyle = BorderStyle.None;
                Pen p = new Pen(Color.Red);
                Graphics g = e.Graphics;
                int variance = 3;
                g.DrawRectangle(p, new Rectangle(textBox1.Location.X - variance, textBox1.Location.Y - variance, textBox1.Width + variance, textBox1.Height +variance ));
            }
            else
            {
                textBox1.BorderStyle = BorderStyle.FixedSingle;
            }
        }

        private void textBox1_Enter(object sender, EventArgs e)
        {
            focus = true;
            this.Refresh();
        }

        private void textBox1_Leave(object sender, EventArgs e)
        {
            focus = false;
            this.Refresh();
        }

Leider bekomme ich das nicht hin.
Auch klassen die von Panel oder UserControl abgeleitet werden.

UserControl


public class BorderedTextBox : UserControl
{
    TextBox textBox;

    public BorderedTextBox()
    {
        textBox = new TextBox()
        {
            BorderStyle = BorderStyle.FixedSingle,
            Location = new Point(-1, -1),
            Anchor = AnchorStyles.Top | AnchorStyles.Bottom |
                     AnchorStyles.Left | AnchorStyles.Right
        };
        Control container = new ContainerControl()
        {
            Dock = DockStyle.Fill,
            Padding = new Padding(-1)
        };
        container.Controls.Add(textBox);
        this.Controls.Add(container);

        DefaultBorderColor = SystemColors.ControlDark;
        FocusedBorderColor = Color.Red;
        BackColor = DefaultBorderColor;
        Padding = new Padding(1);
        Size = textBox.Size;
    }

    public Color DefaultBorderColor { get; set; }
    public Color FocusedBorderColor { get; set; }

    public override string Text
    {
        get { return textBox.Text; }
        set { textBox.Text = value; }
    }

    protected override void OnEnter(EventArgs e)
    {
        BackColor = FocusedBorderColor;
        base.OnEnter(e);
    }

    protected override void OnLeave(EventArgs e)
    {
        BackColor = DefaultBorderColor;
        base.OnLeave(e);
    }

    protected override void SetBoundsCore(int x, int y,
        int width, int height, BoundsSpecified specified)
    {
        base.SetBoundsCore(x, y, width, textBox.PreferredHeight, specified);
    }
}

**Panel **


public class BorderTextBox : Panel {
  private Color _NormalBorderColor = Color.Gray;
  private Color _FocusBorderColor = Color.Blue;

  public TextBox EditBox;

  public BorderTextBox() {
    this.DoubleBuffered = true;
    this.Padding = new Padding(2);

    EditBox = new TextBox();
    EditBox.AutoSize = false;
    EditBox.BorderStyle = BorderStyle.None;
    EditBox.Dock = DockStyle.Fill;
    EditBox.Enter += new EventHandler(EditBox_Refresh);
    EditBox.Leave += new EventHandler(EditBox_Refresh);
    EditBox.Resize += new EventHandler(EditBox_Refresh);
    this.Controls.Add(EditBox);
  }

  private void EditBox_Refresh(object sender, EventArgs e) {
    this.Invalidate();
  }

  protected override void OnPaint(PaintEventArgs e) {
    e.Graphics.Clear(SystemColors.Window);
    using (Pen borderPen = new Pen(this.EditBox.Focused ? _FocusBorderColor : _NormalBorderColor)) {
      e.Graphics.DrawRectangle(borderPen, new Rectangle(0, 0, this.ClientSize.Width - 1, this.ClientSize.Height - 1));
    }
    base.OnPaint(e);
  }
}

Ein kleines Bespiel zur validierung


if (textBox1.Text != "TestValidierung")
{
      // jetzt soll der rote Rahmen erscheinen.
}

Wie funktioniert das genau ?
Kann mir da jemand weiterhelfen ?

Lieben Gruß

26.06.2015 - 11:17 Uhr

Moin Leute,
erstmal möchte ich mich für das Projekt bedanken. Die Idee ist gut und erleichtert einen das erklären in der Gruppe wenn ein neuer hinzukommt.

Ich habe nur folgendes Problem... Ich kann das Programm nicht nutzen...

Vorgehensweise:

Ich starte das Programm (Als User sowie Admin), gebe einen Projektnamen ein, wähle die SLN aus und den Ausgabe Pfad. Ich wähle die Dokusprache Deutsch aus. Wenn ich nun Daten ausschließen möchte, bekomme ich folgende Fehler:

Bauen

Starte Schritt: "Lese Projektdatei"
Starte Schritt: "Lese Code"
DieDokumentation konne nicht erstellt werden...

Unten ein Roter Balken mit nem Ausrufezeichen im Hauptfenster. Beim Exporter kann ich nichts auswählen. (Eventuell mache ich was falsch und muss Plugins von Werk aus Nachinstallieren ?)

OK Weiter. Da mir der Obliege Fehler schon sagt das es nicht möglich ich, klicke ich aus Neugier dennoch auf bauen um zu schauen wie die Fehler abgefangen und gewertet werden.

Dabei ist mir aufgefallen das er das Projekt einliest und bearbeitet. Er Zeigt mir einen Grünen Balken an und sagt das es abgeschlossen sei (Das steht nirgends aber der Balken ist grün 😃)

In meinem Ausgabe Pfad liegt nichts, also schaue ich mir die Log an...

2015-06-26 11:05:25,037: ERROR – System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
bei SharpDox.Build.NRefactory.Parser.MethodCallParser.ParseMethodCalls(SDNamespace sdNamespace)
bei SharpDox.Build.NRefactory.NRefactoryParser.ParseMethodCalls(CSharpSolution solution, SDRepository sdRepository)
bei SharpDox.Build.NRefactory.NRefactoryParser.ParseSolution(CSharpSolution solution, ICoreConfigSection sharpDoxConfig, Dictionary`2 tokens, Boolean structured)
bei SharpDox.Build.NRefactory.NRefactoryParser.GetStructureParsedSolution(String solutionFile)
bei SharpDox.Build.Context.Step.StructeParseCodeStep.RunStep(SDProject sdProject)
bei SharpDox.Build.Context.BuildContext.StartBuild()

da kommt diese Meldung. Leider passiert mir das bei jedem Projekt was ich versuche zu Dokumentieren.

Kann mir da jemand weiter helfen ?

Ich danke im Voraus.

Mit freundlichem Gruß

27.05.2015 - 17:45 Uhr

war vielleicht ein wenig forsch ausgedrückt. Ich wollte lediglich ein kleines Feedback über die Json REST-Service erhalten, wie die Leute damit zurechtkommen und ob es da was zu beachten gibt oder nicht. Sicherlich verwende ich die Suche und schaue regelmäßig in eure Artikel und Tutos.

  1. Wie meinst du das? 2. Was genau ist deine Frage dazu? 3.Hast du es überhaupt schon mal gelesen und ausprobiert?

zu 1. Ein kleine Feedback halt, Erfahrungen und Umgang mit der REST.
zu 2. Das habe ich bereits beantwortet und sollte aus dem Thread heraus bekannt sein.
zu 3. Ja habe ich, ich habe auch gepostet was ich dazu gefunden und mit was ich angefangen habe zu testen.

ich habe mich meines Wissens nach, an den Hinweis gehalten.
Ich habe weder nach einer Komplett Lösung gefragt, mein Titel ist aussagekräftig und wie bereits gesagt habe ich gesucht und was gefunden worauf ich ein Feedback haben wollte.

Ich hoffe nun ist es vom Tisch 😃 und wir können uns wieder dem Thema widmen.

26.05.2015 - 12:53 Uhr

danke für die Info. 😃

Das ist wesendlich besser und leichter zu verwenden. Ich habe nun ein kleines Projekt unter http://www.codeproject.com gefunden.

ich habe noch nie damit gearbeitet, schaut aber sehr interesannt aus 😃

Könntet ihr mir ein kleines Feedback zu dem sagen ?

http://www.codeproject.com/Articles/167159/How-to-create-a-JSON-WCF-RESTful-Service-in-sec

Danke euch.

25.05.2015 - 17:43 Uhr

@FZelle

Bicht wild rummachen, sondern systematisch.

Nimm einen HexEditor und schau die Datei genau an, dann siehst du was für Zeichen das sind.
Die entstehen nicht aus der Luft.

Das habe ich gemacht, nichts was diese Zeichen verursacht konnte ich finden.
Auch eine Datei (neu erstellt -> Rechtsklick -> Neu -> Textdokument) mit dem Zeichen A gibt mir diese Zeichen...

Kann das sein das esreste aus dem ByteArray des TCP´s sind ?

Meine übergabe an PHP:


        public void SendResponse(string response, object client)
        {
            TcpClient tcpClient = (TcpClient)client;
            NetworkStream clientStream = tcpClient.GetStream();
            ASCIIEncoding encoder = new ASCIIEncoding();
            if (response == null)
            {
                response = "Keine Anfrage zum bearbeiten !";
            }

            byte[] buffer; // Buffer = alles
            byte[] bufferlen;


            buffer = encoder.GetBytes(response);
            bufferlen = encoder.GetBytes(response.Length.ToString());
            // Teile dem PHP-Skript mit, wie viele Bytes nun kommen.
            clientStream.Write(bufferlen, 0, bufferlen.Length);
            clientStream.Flush();

            if (response.Length / 1000 == 0)
            {
                clientStream.Write(buffer, 0, buffer.Length);
                clientStream.Flush();
                return;
            }

            float packs = response.Length / 1000;
            int bytessent = 0;

            int sendbytes = 1000;
            for (int i = 0; i <= packs; i++) // Schleife für die Pakete
            {
                byte[] smallbuf = new byte[1001]; // Smallbuf = bytes fürs paket
                // Wenn beim letzten Paket, dann reduziere die zu sendenden Bytes, sodass er keine NullPointerException bekommt.
                if (i == packs)
                    sendbytes = response.Length - bytessent;
                // Schreibe die Bytes in das Paket
                for (int j = 0; j < sendbytes; j++) // Schleife für die Byte pro Paket
                {
                    smallbuf[j] = buffer[i * 1000 + j]; // I = Offset number des Pakets ; j stelle innerhalb des Pakets 
                }
                bytessent += smallbuf.Length - 1; // Setze zähler hoch
                // Sende Paket los
                clientStream.Write(smallbuf, 0, smallbuf.Length);
                clientStream.Flush();
                //string str4debug = Encoding.ASCII.GetString(smallbuf);
            }

        }

Ich bin am verzweifeln ^^.
Danke für eure Hilfe

23.05.2015 - 11:32 Uhr

Da steht nichts drinne. Das ? im True sowie die anderen sind einfach da...
Im Byte ist nichts und sonst auch nirgends... Sie kommen einfach 😃

Aber das werde ich weiterhin machen 😃 Ich suche wie wild und teste ^^

23.05.2015 - 10:26 Uhr

Top, Merci... Ich sage ja das war so ein leichtsinniger fehler oO oO.. Funktioniert nun...

Kurz noch was anderes. Wenn ich die Ausgabe erhalte, erhalte ich zwischendurch komische ? in einem kästchen. (Siehe Anhang). Liegt es an PHP oder an C# ?

ich lese mit


System.Text.Encoding.UTF8

aus. Habe auch schon andere arten wie ANCII sowie Unicode versucht. Default auch, das aber UTF8...
Ich bin da Ratlos ^^... Das darf nicht sein.

Jemand eine Idee...

22.05.2015 - 21:48 Uhr

och nein, wie Peinlich.... Ja ne ist klar, sorry und Danke...

oha das glaube ich jetzt nicht... arrrrggg.

22.05.2015 - 13:28 Uhr

Dort lese ich die erste Zeile (meines wissens).


         private void GetConfigContent()
        {
            if(!isGameserverExists())
            {
                return;
            }

            using (FileStream stream = File.Open(PathToCFG, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                string flines = "";
                string curline;
                int lineno = 0;
                int lines = 0;
                int lastlines = 50;

                try
                {
                    using (StreamReader reader = new StreamReader(stream))
                    {
                        while (reader.ReadLine() != null)
                        {
                            if (lines == 0)
                            {
                                 System.Windows.Forms.MessageBox.Show(reader.ReadLine());
                                 flines += reader.ReadLine() + Environment.NewLine;
                             }
                             lines++;

                            while ((curline = reader.ReadLine()) != null)
                            {
                                lineno++;
                                if (lines < lastlines)
                                    lastlines = lines;
                                if (lineno >= (lines - lastlines))
                                {
                                    flines += curline + Environment.NewLine;
                                }
                            }
                        }
                        reader.Close();
                    }
                    stream.Close();
                }
                catch (FileLoadException Fex)
                {
                    this.GetConfig = "Beim Lesen der Screenlog ist ein Fehler aufgetreten: " + Fex.Message;
                }
                this.GetConfig = flines;
            }
        }

Danach lese ich mit Curline die nächsten Zeilen bis null kommt.

22.05.2015 - 12:53 Uhr

mit


flines += reader.ReadLine() + Environment.NewLine;

Speichere ich diese doch in "flines " ?!?

Ok, dann anders gefragt. Wie bekomme ich die erste Zeile gespeichert ?

22.05.2015 - 12:15 Uhr

danke für die schnelle Antwort. Nachdem man das so Liest klingt es Plausibel aber


if (lines == 0)
{
    System.Windows.Forms.MessageBox.Show(reader.ReadLine());
    flines += reader.ReadLine() + Environment.NewLine;
}
lines++;

Damit habe ich mir die 1Zeile in flines gespeichert und zuvor ausgegeben. Das Passt alles 😃 Ich erhalte es aber nicht auf der Seite...

Da fehlt Sie einfach. Kann es sein das mein Code richtig ist, der von PHP aber nicht ?

Weil ich zuvor nicht alles ausgegeben bekomme habe... Ich sende immer 1001 Byte an den gegenüber bis alle zeilen leehr sind.

So habe ich es hinbekommen das alles gesendet wird. Bis auf die erste Zeile...

22.05.2015 - 11:30 Uhr

und der letzte Anhang:

Wenn es eine Möglichkeit gibt mehrere Anhänge anzufügen, dann sgt es mir bitte 😃

22.05.2015 - 11:30 Uhr

Weitere Anhänge:

22.05.2015 - 11:28 Uhr

Hallo liebe Community,
mittlerweile muss ich euch wieder um Rat fragen. Wie bereits in zu vor geschriebenen Beiträgen erwähnt, schreibe ich an einem Windows Deamon, den esdem Anwender ermöglichen soll Gameserver über eine Schnittstelle zu PHP (Andere Sprachen sind auch möglich), zu Installieren sowie zu verwalten.

Sprich: Installieren, Deinstallieren, Starten, Stoppen, Restarten, Config Ändern, Screenlog Lesen (Batchlog), Backups, etc...

Das grundgerüst steht bereits und die meisten Funktionen sind vorhanden und Betriebsbereit. Nun bin ich an den Datein. Der Anwender möchte natürlich auch Configurationen am Server vornehmen, diesgeschiet meist über Configfiles.

Wenn Ich nun die Datei Einlese (Siehe Anhang), fehlt direkt die 1 Zeile. Wenn ich diese nun Speichere (ich lasse mir eine MessageBox ausgeben mit dem Inhalt), sieht man in der Box (siehe Anhang), das ich 1zu1 diese Daten Empfage. Lade ich nun die Datei neu, fehlt allerdings die 1Zeile und es wurde unten was hinzugefügt... (siehe Anhang). Wie kommt das zustande.

Ich nutze folgenden Code:


/* Lesen */
         private void GetConfigContent()
        {
            if(!isGameserverExists())
            {
                return;
            }

            using (FileStream stream = File.Open(PathToCFG, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                string flines = "";
                string curline;
                int lineno = 0;
                int lines = 0;
                int lastlines = 50;

                try
                {
                    using (StreamReader reader = new StreamReader(stream))
                    {
                        while (reader.ReadLine() != null)
                        {
                            lines++;

                            while ((curline = reader.ReadLine()) != null)
                            {
                                lineno++;
                                if (lines < lastlines)
                                    lastlines = lines;
                                if (lineno >= (lines - lastlines))
                                {
                                    flines += curline + Environment.NewLine;
                                }
                            }
                        }
                        reader.Close();
                    }
                    stream.Close();
                }
                catch (FileLoadException Fex)
                {
                    this.GetConfig = "Beim Lesen der Screenlog ist ein Fehler aufgetreten: " + Fex.Message;
                }
                this.GetConfig = flines;
            }
        }
        
        /* Schreiben */
        private void SetConfigContent()
        {
            System.Windows.Forms.MessageBox.Show(this.SetConfig);
            try
            {
                using (StreamWriter myFile = new StreamWriter(this.PathToCFG))
                {
                    myFile.Write(this.SetConfig);
                    myFile.Close();
                    this.SetConfig = "OK";
                }
            }
            catch
            {
                this.SetConfig = "NOK";
            }

        }

Ich habe auch eine andereMethode Probiert.


         /* Schreiben 2# */
         private void SetConfigContent()
         {
             using (FileStream stream = File.Open(PathToCFG, FileMode.Open, FileAccess.Write, FileShare.Write))
             {
                 try
                 {
                     using (StreamWriter writer = new StreamWriter(stream, System.Text.Encoding.UTF8))
                     {
                         writer.Write(this.SetConfig);
                         writer.Flush();
                         writer.Close();
                         this.SetConfig = "OK";
                     }
                 }
                 catch(FileLoadException ex)
                 {
                     this.SetConfig = "NOK - FileLoadException: " + ex.Message;
                 }
                 catch (FieldAccessException ex)
                 {
                     this.SetConfig = "NOK - FieldAccessException: " + ex.Message;
                 }
                 catch (FileNotFoundException ex)
                 {
                     this.SetConfig = "NOK - FileNotFoundException: " + ex.Message;
                 }
                 stream.Close();
             }
         }

Egal wie ich es mache, es bringt nicht das Resultat was ich erstrebe. Was mache ich falsch ?

Wird noch Code benötigt, einfach bescheid geben. 😃

21.03.2015 - 13:31 Uhr

OK 😃
Vorab es ist recht viel Code den ich Posten müsste, ich zeige es gerne in einer Teamviewer Sitzung um mein Problem zu schildern. Auch Teamspeak wäre eine Möglichkeit.

Selbstverständlich Poste ich die Lösung. Es soll ja jedem zugutekommen 😃
Also Ich starte das Programm 😃
Das Programm startet im Load einen Thread. Dieser wiederum stratet einen


                    clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
                    clientThread.Start(client)

um die Anfragen aus dem Web zu bearbeiten.
Um die Anfragen zu bearbeiten kommt die HandleClientComm zum Einsatz


private void HandleClientComm(object client)
        {
            licence.HaveLicence();

            if (licence.ServiceKeyOK)
            {
                
                TcpClient tcpClient = (TcpClient)client;
                NetworkStream clientStream = tcpClient.GetStream();

                byte[] message = new byte[4096];
                int bytesRead;

                while (true)
                {
                    bytesRead = 0;

                    try
                    {
                        //blocks until a client sends a message
                        bytesRead = clientStream.Read(message, 0, 4096);
                        break;
                    }
                    catch
                    {
                        //a socket error has occured
                        break;
                    }

                }

                ASCIIEncoding encoder = new ASCIIEncoding();
                ePArg = encoder.GetString(message, 0, bytesRead);
                var rx = new Regex(" ");
                ePArgs = rx.Split(ePArg);


                if (ePArgs[0] == "gameserver")
                {
                    if (ePArgs[1] == "install")
                    {
                        game.main(ePArgs);
                    }
                    else if (ePArgs[1] == "remove")
                    {
                        Respon = game.DelServer(ePArgs[2], ePArgs[3]); 
                    }
                    else if (ePArgs[1] == "checkinstall")
                    {
                        Respon = game.isInstall;
                    }
                    else if (ePArgs[1] == "start")
                    {
                         Respon = game.StartServer(ePArgs);
                    }
                    else if (ePArgs[1] == "stop")
                    {
                        Respon = game.StopServer(ePArgs[2], ePArgs[3]);
                    }
                    else if (ePArgs[1] == "screen")
                    {
                        Respon = game.GetScreenLog(ePArgs[2], ePArgs[3]);
                    }
                }
                else if (ePArgs[0] == "RootServer")
                {
                    if (ePArgs[1] == "status")
                    {
                        Respon = root.systeminfo();
                    }
                }
                else
                {
                    ePRespondeBack("Keine Anfrage zum bearbeiten !", client);
                }  
               
                ePRespondeBack(Respon, client);
            }
            else
            {
                if (ePArgs[0] == "RootServer")
                {
                    if (ePArgs[1] == "status")
                    {
                        Respon = root.systeminfo();
                        ePRespondeBack(Respon, client);
                    }
                }
                else
                {
                    Respon = "Lizenz ist Abgelaufen oder Fehlerhaft";
                }   
            }
        }

Wenn ich nun einen Gameserver starten möchte muss ich demnach, Gameserver start.... an den Deamon senden und dann auswerten. Nun starte ich den Server. und schreibe mir die ProcessID in eine ini Datei damit ich den Später stoppen kann.


            public string StartServer(string[] gamepath)
            {
                if (iniParser.IniReadValue("eP-Settings", "Install-dir") != "")
                {
                    GameInstallDir = iniParser.IniReadValue("eP-Settings", "Install-dir");
                }
                else
                {
                    GameInstallDir = Path.GetDirectoryName(Application.ExecutablePath);
                }

                string Gamepath = GameInstallDir + @"\home\" + gamepath[2] + @"\" + gamepath[3];
                string Game = gamepath[4];
                var processInfo = new ProcessStartInfo("\"" + Gamepath + "\\" + gamepath[4] + "\"", gamepath[5] + " " + gamepath[6] + " " + gamepath[7] + " " + gamepath[8])
                {
                    CreateNoWindow = false,
                    UseShellExecute = false
                };
            

                if ((proc = Process.Start(processInfo)) == null)
                {
                    throw new InvalidOperationException("??");
                }
                else
                {
                    WriteProcID(gamepath[2], gamepath[3], proc.Id.ToString());
                    return "OK";
                }

            }

Nun kommt der Knackpunkt. Wenn ich das Hauptprogramm (den Deamon) nun schließe wenn der Gameserver noch läuft und das Programm dann wieder starte, kann ich nichts mit dem Deamon anfangen. Ich empfange nichts und kann somit nichts auswerten.

Schließe ich nun den Gameserver ist mein Programm (deamon) wieder freigegeben. Nun kann ich Sachen auswerten.

Angenommen eine Firma wie easyPANEL nutzt meinen Deamon. Wenn nun Kunden von easyPANEL 40 Gameserver am Laufen haben und der Deamon geschlossen wird müssen aktuell alle Gameserver die über den Deamon gestartet wurden sind gestoppt werden damit man weiter arbeiten kann. Das ist Wirtschaftlich unzumutbar und mein Produkt somit unbrauchbar.

Ich hoffe man hat es jetzt verstanden. Wenn nicht bitte ich darum im Teamspeak darüber zu reden damit ich das besser erklären kann...

Ich bin über jede Hilfe dankbar.

Mit freundlichem Gruß

21.03.2015 - 12:50 Uhr

Hey,
hehe ok ich habe es am Handy gestern Nacht geschrieben, hab’s noch meiner Freundin gezeigt ob Sie das versteht 😃 Bin nicht der beste in erklären 😃

Also ich starte das Hauptprogramm. Ich übergebe nun aus dem Web einen Befehl.

Gameserver start ....... Nun wird der Gameserver gestartet. Ein neuer Thread entsteht.
Wenn der Nutzer nun aus was weiß ich für Gründen das Programm beenden oder das Programm durch einen Fehler beendet wird, den Gameserver der vorher gestartet wurde aber an bleibt, besteht das Problem wenn man das Hauptprogramm wieder Öffnet das das Interface nicht mehr mit dem Hauptprogramm Kommunizieren kann, demnach nichts auslesen kann etc...

Wenn ich jetzt allerdings den laufenden Gameserver beende funktioniert die Kommunikation wieder.
Da ist das Problem 😃

Ich hoffe man konnte es nun verstehen.
Sorry für den komischen Satz Ausdruck 😃

Mit freundlichem Gruß

21.03.2015 - 09:58 Uhr

Hey,
PHP seitig wurde es nun auch geschafft .
Ich teile dem PHP-Skript vor Sendung der Pakete mit welche Anzahl an Bytes erwartet werden und beginne dann mit der Schleife. PHP wartet solange bis er die angeforderte Menge an Paketen erhalten hat.


        public void ePRespondeBack(string ePRespond, object client)
        {
            TcpClient tcpClient = (TcpClient)client;
            NetworkStream clientStream = tcpClient.GetStream();
            ASCIIEncoding encoder = new ASCIIEncoding();
            if (ePRespond == null)
            {
                ePRespond = "Keine Anfrage zum bearbeiten !";
            }

            byte[] buffer; // Buffer = alles
            byte[] bufferlen;


            buffer = encoder.GetBytes(ePRespond);
            bufferlen = encoder.GetBytes(ePRespond.Length.ToString());
            // Teile dem PHP-Skript mit, wie viele Bytes nun kommen.
            clientStream.Write(bufferlen, 0, bufferlen.Length);
            clientStream.Flush();

            if (ePRespond.Length / 1000 == 0)
            {
                clientStream.Write(buffer, 0, buffer.Length);
                clientStream.Flush();
                return;
            }

            float packs = ePRespond.Length / 1000;
            int bytessent = 0;

            int sendbytes = 1000;
            for (int i = 0; i <= packs; i++) // Schleife für die Pakete
            {
                byte[] smallbuf = new byte[1001]; // Smallbuf = bytes fürs paket
                // Wenn beim letzten Paket, dann reduziere die zu sendenden Bytes, sodass er keine NullPointerException bekommt.
                if (i == packs)
                    sendbytes = ePRespond.Length - bytessent;
                // Schreibe die Bytes in das Paket
                for (int j = 0; j < sendbytes; j++ ) // Schleife für die Byte pro Paket
                {
                    smallbuf[j] = buffer[i * 1000 + j]; // I = Offset number des Pakets ; j stelle innerhalb des Pakets 
                }
                bytessent += smallbuf.Length - 1; // Setze zähler hoch
                // Sende Paket los
                clientStream.Write(smallbuf, 0, smallbuf.Length);
                clientStream.Flush();
                //string str4debug = Encoding.ASCII.GetString(smallbuf);
            }

        }

Damit keine IOOutOfRange Exception entsteht, muss man mitteilen wie viele Byte Pakete die letzte Sendung hat.

Wir gehen mal von 6798Bytes aus. Er läuft also 6x mit 1000bytes durch, beim 7ten mal verkürzt er die schleife um die Anzahl der übrig gebliebenen Pakete und sendet diese dann ab.

Es klappt hervorragend. 😃 ich habe bis zu eine Anzahl mit Millionen von Bytes getestet. Es ist nicht beabsichtigt so viele zu senden aber es ist möglich 😃

Ich danke euch für die Anregungen.

Mit freundlichem Gruß

21.03.2015 - 01:38 Uhr

Guten Abend liebe community,
Ich arbeite derzeit an einem Programm was es ermöglicht anfragen aus dem Web zu bearbeiten und Resultate zu liefern. Hierbei geht es um eine Gameserver Verwaltung. Das Programm ermöglicht es Gameserver Hostern, Interface Entwickler und Privat Anwender, Gsmeserver zu Installieren, Starten, Stoppen, Config bearbeiten, Logs lesen uvm.

Da es mein erstes wirklich sinnvolles Projekt ist, bin ich mit voller Tatendrang daran es fehlerfrei (soweit wie mir mit dem derzeitigen Wissensstand möglich ist) auszuliefern. Nun bin fast in der Phase es Produktiv einzusetzen. Version 1.0.0.0 kommt 😃.

Jetzt habe ich aber ein Knackpunkt der ein no-go ist... Wenn ein Gameserver gestarte wird, nehmen wir Minecraft, und das Programm vom Nutzer geschlossen wird, besteht das Problem das keine Aktion mehr durchgeführt werden kann.

Ich vermute das Problem zu kennen, kenne aber die Lösung nicht. Ich denke es liegt daran das ein thread noch ausgeführt wird (der Gameserver) und ich daher keine Aktion mehr durchführen kann. Nach Beendigung des Gameservers wird mir die Aktion gewährt.

Nun meine Fragen 😃.

1.) Liege ich mit meiner Vermutung richtig, das der Thread mein neuen Thread blockiert ?
2.) Wenn ja, Wie kann ich diesen Thread wieder joinen sodass der Kunde nicht gleich alle Server beenden muss. (Aus wirtschaftlichen gründen unzumutbar)

3.) Kann ich einen Thread bennen oder diesen eine ID zuweisen oder eine ID abrufen/speichern ?
4.) Logisch wenn 3 zutrifft: kann ich anhand der ID oder des Namens den thread beitreten und weiter Arbeiten.

Ich bin im Thema Multithreading recht neu und habe da noch keine großen Erfahrungen.
Ich hoffe auf hilfreiche antworten und bedanke mich im voraus.

Ich wünsche allen die es jetzt in der Nacht noch lesen eine schöne Gute Nacht.

Mit freundlichem Gruß

20.03.2015 - 09:13 Uhr

Ich erhalte so aber alle meine Pakete, egal ob 1000 oder 10000 bei 10000 läuft er das halt 10x durch. Erhalte aber alles 😃

19.03.2015 - 08:28 Uhr

hey,
ich danke dir. So klappt es. Hätte ich auch selber drauf kommen können... Naja jeder hat mal nen Denkfehler. C# seitig funktioniert es. Bei PHP (habe kein plan von php) muss das ganze socket_read() auch noch in eine vernünftige schleife zum empfangen.. 😃

Hier der Code wie es Funktioniert. Da gibt es sicherlich noch andere schleifen arten. Ich splitte meine Paket ab 1000Bytes und lasse Sie schreiben 😃


        public void ePRespondeBack(string ePRespond, object client)
        {
            TcpClient tcpClient = (TcpClient)client;
            NetworkStream clientStream = tcpClient.GetStream();
            ASCIIEncoding encoder = new ASCIIEncoding();
            if (ePRespond == null)
            {
                ePRespond = "Keine Anfrage zum bearbeiten !";
            }

            byte[] buffer; // Buffer = alles
            buffer = encoder.GetBytes(ePRespond);

            if (ePRespond.Length / 1000 == 0)
            {
                clientStream.Write(buffer, 0, buffer.Length);
                clientStream.Flush();
                return;
            }

            for (int i = 0; i < ePRespond.Length / 1000; i++ ) // Schleife für die Pakete
            {
                byte[] smallbuf = new byte[1001]; // Smallbuf = bytes fürs paket
                for (int j = 0; j < 1000; j++ ) // Schleife für die Byte pro Paket
                {
                    smallbuf[j] = buffer[i * 1000 + j]; // I = Offset number des Pakets ; j stelle innerhalb des Pakets 
                }
                clientStream.Write(smallbuf, 0, smallbuf.Length);
                clientStream.Flush();
            }

        }

Zudem habe ich eine if Abfrage für kleiner Pakete eingebaut damit es nicht zu einer OutOfRangeException kommt 😃.

Wie gesagt nur noch PHP 😃 Ich danke dir.

18.03.2015 - 20:39 Uhr

Hey,
ich lese ja alles 😃
Mein String den ich übergebe hat die gesamte Log 😃
Nur sobald ich es an das Interface weitergeben kommen nur 1300 Zeichen 😦

Oder habe ich die Antwort jetzt falsch verstanden ?

18.03.2015 - 18:38 Uhr

Hallo,
ich sitze heute bereits den ganzen Tag daran...
Folgendes 😃

Ich gebe über eine Website einen String an meinem Programm weiter. Dieser wird in einem Array umgewandelt und dann je nachdem was ausgegeben oder verarbeitet werden soll ausgeführt.

ich möchte nun eine Log Datei auslesen und an das Interface zurückgeben. Leider besteht hier schon das Problem. Es wird mir nicht alles ausgeliefert.

Die Zeichenlänge der Log Datei beträgt knapp 4200 Zeichen (Bytes). Empfange aber nur 1300 ca.


        public void ePRespondeBack(string ePRespond, object client)
        {
            TcpClient tcpClient = (TcpClient)client;
            NetworkStream clientStream = tcpClient.GetStream();
            ASCIIEncoding encoder = new ASCIIEncoding();
           
            if (ePRespond == null)
            {
                ePRespond = "Keine Anfrage zum bearbeiten !";
            }

            byte[] buffer;
            buffer = encoder.GetBytes(ePRespond); // Problem byte[] nicht groß genug

            clientStream.Write(buffer, 0, buffer.Length);
            clientStream.Flush();
        }

Wie bekomme ich es hin das ich alles ausgegeben bekomme. Es kann angenommen auch eine Datei mit 10k Zeichen sein.

Ich bin am Verzweifeln und weiß nicht weiter...
Ich bedanke mich im Voraus für eure Hilfe

Mit freundlichem Gruß

17.03.2015 - 19:31 Uhr

hey,
leider hat auch das nicht geholfen.
Ich bin aber auch ganz ehrlich, ich bekomme es nicht so umgesetzt das es mit meinem Vorhaben funktioniert.

Dafür reichen meine Kenntnisse noch nicht aus. Ich habe zwar schon einiges geschrieben aber noch nie so...

Wäre super wenn man mir da helfen könnte. 🙂

schäm X(

17.03.2015 - 11:52 Uhr

Hey,
sag ich doch, sollte recht easy sein aus der Resource die datei zu beziehen.

Ich glaube aber nicht das er den click event meint 😃
Er redet ja bei action ausführung 😃 Aber selbst das ist nicht schwer zu realisieren 😃

Aufjedenfall ist das eine gute Antwort und ein guter ansatz um sein/dein Problem zu lösen.

17.03.2015 - 10:56 Uhr

Hey,
wo genau ist denn das Problem ?
Du kannst ja normal den ResourceManager normal dafür nutzen um deine Datei abzurufen.

Hast du einen Code Beispiel wo es aktuell hängt ?
Dann kann man dir eventuell eher helfen 😃

Mit freundlichem Gruß

17.03.2015 - 10:31 Uhr

hmm...
Ich habe mich gestern mit nem Kumpel nochmal drangesetzt.
Wir haben eine weitere klasse angelegt und ein der Hauptfunktionen einen Thread gestartet.

Dieser Thread Flusht lediglich die Console in einem Intervall von 100ms. Dort haben wie so ein Zufalls Generator vereinzelt ausgaben erhalten.

Ich habe mir überlegt diese Output Funktionen in einen Thema zu legen, quasi das der Thread diese Funktion aufruft und somit eine Ausgabe erzwingt.

Wenn das Ganze mit nem StreamReader macht und in eine While schleife legt, merkt man das eine Kommunikation stattfindet.

Leider bekomme ich das allerdings nicht hin da ich in einem Thread ja keine Parameter übergeben kann und somit nicht dem Prozess mitteilen kann das er aufgerufen werden soll.

Eventuell in diese Richtung eine Idee ?