Laden...

Forenbeiträge von alf468 Ingesamt 196 Beiträge

05.01.2007 - 11:41 Uhr

Erst einmal ein frohes Neues Jahr an alle.

Ich versuche mich gerade an der Dateiübertragung übers Netzwerk. Der Server kann mehrere Client Verbindungen speichern und verarbeiten. Eigentlich ist der Server eine Art Chatserver. Der Client verbindet sich und der Stream wird in einer Hashtable gespeichert. Eine Schleife durchläuft dann immer die Hashtable und führt die entsprechenden Aufgaben aus. Als kleines Feature wollte ich die Dateiübertragung hinzufügen.
Nun könnte es aber auch sein das mehrere Clients gleichzeitig Daten empfangen bzw. senden. Der Server bekommt erst einmal eine Info das eine Dateiübertragung gestartet wird. Da ich für die Dateiübertragung keinen neuen Port benutzen will sondern die bereits vorhandene Verbindung kam ich auf die Idee einen neuen Thread zu starten. Dieser Thread soll dann die Dateiübertragung durchführen. Es hätte also jeder Client für die Dateiübertragung einen eigen Thread. Das Problem ist aber wenn der Client nun unerwartet die Verbindung beendet. So wie ich das mit der Dateiübertragung gelöst habe wartet der Server immer auf Daten ohne ein Timeout.

protected override void Transfer(System.Net.Sockets.NetworkStream ns)
        {
            this.tns = ns;
            this._TransferThread = new System.Threading.Thread(new System.Threading.ThreadStart(Startransfer));
            this._TransferThread.Start(); //Dateiübertragung beginnen
        }

private void Startransfer()
        {
            Stream fileStream=null;
            try
            {
                int offset = 0;
                int size = 1024;
                byte[] buffer = new byte[size];
                long bytesRead = 0;
                string file = ((FileTransferObject)this._openTransfers[tns]).getName;
                int fsize = ((FileTransferObject)this._openTransfers[tns]).getSize;
                int start = ((FileTransferObject)this._openTransfers[tns]).getStart;
                this._openTransfers[tns] = null;
                if (start != 0)
                {
                    fileStream = new System.IO.FileStream(rootpath + "\\" + file, FileMode.Append);
                    //fileStream.Seek(start, SeekOrigin.Begin);
                    bytesRead = start;
                }
                else
                {
                    fileStream = new System.IO.FileStream(rootpath + "\\" + file, FileMode.Create);
                }
                do
                {
                    if (fsize - bytesRead < size)
                    {
                        size = (int)(fsize - bytesRead);
                    }
		    bytesReadOld = bytesRead;
                    bytesRead += this.tns.Read(buffer, 0, size);
                    fileStream.Write(buffer, 0, (int)(bytesRead - bytesReadOld));
                   
                    offset += size;

                } while (tns.CanRead && bytesRead < fsize);
                fileStream.Close();
                this._openTransfers.Remove(tns);
                this._TransferThread.Join();
                this._TransferThread = null;
            }
            catch (Exception e)
            {
                if (fileStream != null)
                    fileStream.Close();
                System.Diagnostics.Debug.WriteLine(e);
                this.RemoveClient(tns);
                this._TransferThread.Join();
                this._TransferThread = null;
            }
        }
 

Wenn der Client nun die Verbindung beendet, bleibt der Server in der Schleife obwohl nix mehr gelesen werden kann.
Warum merkt der Server in dem Moment nicht das er gar nicht mehr lesen kann ?
Das ganze funktioniert im Moment auch nur für einen Client aber ich wäre die Threads dann in einer Hashtable speichern. Ist das eine halbwegs gute Lösung ?

07.05.2006 - 12:16 Uhr

Ich verzweifle da noch dran.

mit m.Index und m.Length von zwei aufeinanderfolgenden Matches, kannst du nicht nur das Tag, sondern auch den Text zwischen den Tags ausschneiden ... und eben wieder zusammenbasteln.

Dies kann ich doch nur machen wenn ich vorher alle nicht geschlossene bzw. nicht geöffnete Tags entfernt habe.

06.05.2006 - 16:20 Uhr

Ich muss das ganze aber doch nach dem Umwandeln wieder in den Text einfügen.
In dem Moment verändere ich doch den Index

06.05.2006 - 13:29 Uhr

Kann sein das ich mich jetzt total dumm anstelle aber irgendwie verstehe ich das nicht.
Ich habe den Index und die Länge vom Start- und Endtag. Damit kann ich ohne Probleme die Tags umwandeln aber wie bekomme ich das wieder in den Text ?

06.05.2006 - 10:42 Uhr

Aber dann müsste ich den Index einmal verändern und alle weiteren Tags würden nicht mehr passen.

Wenn das Programm in der m.Success Schleife ist und bei einem gefundenen Paar eine Änderung an dem original String vorgenommen wird stimmt doch der Index für die anderen Tags nicht mehr.

06.05.2006 - 10:11 Uhr

Wenn ich das habe kann ich ja mit string.Replace(..) die Tags umwandeln.
Aber ich möchte ganz gerne auch die Code Tags verwenden und in innerhalb von Code darf der BBCode nicht umgewandelt werden.
Wie kann ich da am besten vorgehen ?

30.04.2006 - 17:25 Uhr

Sicher du hast das schon klar beschrieben aber irgendwie geht das bei mir nicht so richtig.

string str = " [bold] jjkljk [/bold]";
            string patt = @" (?<bbtag>\[\s*(?<close>)\\?\s*(?<tagname>)[a-zA-Z]+)(?<attribute>[^\]]+?)\s*\] ";
            Regex r = new Regex(patt, RegexOptions.IgnoreCase);

            Match m = r.Match(str);
            while (m.Success)
            {
                Console.WriteLine(m.Groups["tagname"].ToString());
                m = m.NextMatch();
            }
            Console.ReadLine();

Es wird da schon nix ausgegeben 🤔

30.04.2006 - 16:57 Uhr

Irgendwie verstehe ich die Geschichte mit RegEx nicht richtig X(

Wäre nett wenn du mal ein kleines Beispiel machen könntest 👍

15.04.2006 - 19:52 Uhr

Ich glaube mein Problem liegt noch an einer anderen Stelle. Ich kann aus einem Thread, nachdem die Seite geladen wurde, nicht mehr auf die TextBox zugreifen.
Es kommt keine Fehlermeldung aber es wird nicht mehr geschrieben.Eine Ausgabe auf der Console zeigt aber das noch Daten empfangen werden.

Gibt es ASP.NET kein invoke oder gibt es alternative zu Threading ?

15.04.2006 - 12:29 Uhr

Erst einmal Danke für die Antworten.
Ich denke Atlas (AJAX nur von MS) ist schon schon das richtige. Um es mal ein bischen genauer zu machen ich möchte ein IRC Webchat programmieren.
Wenn der User sich einloggt wir eine Verbindung zum IRC hergestellt.Das ganze Netzwerkverfahren läuft als Thread nebenher.

Auf der Seite http://atlas.asp.net/docs/Default.aspx gibt es einige Beispiel nur leider keines wie ich es brauche. Es muss in die TextBox jederzeit was eingetragen werden können oder die Seite zu aktualisieren.

13.04.2006 - 16:14 Uhr

Ich will eine Art Webchat programmieren.Es kann immer ein User eine Nachricht schreiben. Die Webseite müsste nie aufhören zu laden ?!

12.04.2006 - 22:07 Uhr

Ich möchte gerne eine ASP.NET Webseite erstellen. Diese Seite empfängt Daten über ein Socket.Soweit ist auch alles OK nur wie füge dann den empfangenen Text in eine Textbox hinzu wenn die Seite schon geladen ist ?

Danke

04.04.2006 - 19:49 Uhr

Du musst der Klasse auch das Attribut Serializable() mitgeben.

01.04.2006 - 17:52 Uhr

Falls du noch keine Lösung hast, dann schau mal hier Drucken eines Controls????

29.03.2006 - 20:19 Uhr

Hallo ich habe eine kleines Problem.Ich will ein Item in einer Listbox einfügen.
Dabei kommt folgender Fehler:
System.InvalidOperationException: Invoke or BeginInvoke cannot be called on a control until the window handle has been created.

Die Listbox ist static hat das Problem damit was zu tun ?
Das ist das erste Mal das ich damit Probleme habe 🙁

21.03.2006 - 19:26 Uhr

In .NET 2.0 gibt die Methode Control.DrawToBitmap .Damit kann man auch ganz einfach ein Control drucken.
Beispiel:

Bitmap b=new Bitmap(this.textBox1.Width,this.textBox1.Height);
this.textBox1.DrawToBitmap(b, e.PageBounds);
e.Graphics.DrawImage(b, new Point(15, 50));
08.03.2006 - 18:29 Uhr

Ich habe ein Bild welches ich in einer Oracle Datenbank speichern möchte.
Ich benutze dazu die Methode FromBase64String().Nur gibt es in Oracle offenbar kein Datentyp der diese Größe unterstüzt.

Gibt es eine andere Möglichkeit oder gibt es doch einen Oracle Datentyp für so was ?

02.02.2006 - 18:50 Uhr

Wie hast du das Anmeldeproblem den jetzt gelöst? Wenn ich das in der Reihenfolge wie Programmierhans meinte kommt bei NICKSERV identify nick 123456 die Meldung vom IRC: "451 NICKSERV :You have not registered"

17.01.2006 - 19:40 Uhr

Ändert aber nix an meinem Problem.Ich will den Kreis verschieben per Tastendruck.Wenn der Kreis ganz Rechts ist soll ein weiterer Kreis gezeichnet werden.Der alte Kreis soll aber dableiben.

17.01.2006 - 18:48 Uhr

Ich möchte gerne einen Kreis zeichnen und dieses mit den Tasten bewegen.Ist soweit auch alles kein Problem nur wenn ich später einen zweiten Kreis hinzufüge ist der erste wieder weg.

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyData == Keys.Right)
            {
                this.Refresh();
                x+=10;
                g.FillEllipse(b, this.x, this.y, 20, 20);
            }
        }

Die Methode refresh() ist sicher nicht die richtitge für sowas.Aber wie macht man sowas?

17.01.2006 - 18:31 Uhr

Danke für die zahlreichen Antworten.Ich kann also die dll-Datei in meinem kommerziell Programm benutzen, muss aber darauf Hinweisen das die dll. nicht von mir ist ?!

15.01.2006 - 19:09 Uhr

Ich habe jetzt mal versucht was zu LGPL und kommerziellen Einsatz zu finden, aber irgendwie finde ich nix dazu.Wenn sich da einer besser auskennt das würde mich das interessieren.

15.01.2006 - 18:30 Uhr

ZedGraph ist aber doch nicht für kommerzieller Software ?!

15.01.2006 - 18:21 Uhr

Das Programm ist aber für kommerzielle Zwecke gedacht.Ich kann also kein Open-Source verwenden.

15.01.2006 - 18:07 Uhr

Ich möchte keinen Quellcode haben sondern viel mehr wie man so was am besten berechnen kann. Das Zeichnen ist ja nicht das Problem.

15.01.2006 - 17:21 Uhr

Ich würde gerne ein kleines Diagramm selber machen. Dieses Diagramm soll den Aktienkurs mehrerer Aktien in einer Woche anzeigen. Also eine Gerade welche von den Aktienwert an einem Tag zum nächsten verläuft. Wie man es halt von der Börse kennt 😉 .Ich möchte dies ganze aber gerne so individuell wie nur möglich machen.
Die Anzahl der Tage sind frei wählbar, die Anzahl der Aktien.Die Größe der Y-Achse muss natürlich auch variable sein.Der User gibt also die Werte der Aktien pro Tag ein und das Diagramm soll sich automatisch erstellen.
Wie kann ich so was machen ? Ich möchte keinen Quellcode haben sondern viel mehr wie man so was am besten berechnen kann.

31.12.2005 - 14:53 Uhr

Original von herbivore
Hallo alf468,

warum zwei Forms machen und nicht einfach den Statusbar mit in das Login-Form packen?

herbivore

Es kommen ja noch viel mehr Forms dazu.Ausserdem passt dies am besten zu meiner Struktur der Klassen.

31.12.2005 - 12:55 Uhr

Ich glaube ich erkläre mal an einem Beispiel worum es mir bei der ganzen Sache geht.Ich habe eine Login Form und beim klicken auf ein Button werden die eingegeben Daten per Socket an ein Server gesendet, der wiederum die Daten kontrolliert. Während diesem Vorgang will ich ein Fenster anzeigen lassen mit einem Label und einer ProgessBar.Das Statusfenster soll in das Loginfenster ganz überdecken und die ProgessBar +Label soll mittig angezeigt werden.

Aber es ist ja auch ganz leicht die Zentrierungsposition selbst auszurechnen.

Bei meinen Rechnungen klappte das nie X(

31.12.2005 - 11:24 Uhr

Also Form2 wird in Form1 angezeigt nur eben nicht zentriert.Das sieht so aus:

Ob ich StartPosition im Konstruktor übergebe spielt keine Rolle.Das übergeordnete Fenster übergebe ich auch. Also entweder ich verstehe den Sinn von CenterParent falsch oder ich mache was falsch 🤔 .

30.12.2005 - 21:15 Uhr

Ne es ist kein MDI-Child.Also in Form2 habe ich folgendes stehen:

public void parent(Control c)
{
     this.TopLevel = false;
     this.Parent = c;
     this.StartPosition = FormStartPosition.CenterParent;
}

Dazu die Standart einstellugen vom Form Designer.

In Form1 wird Form2 aufgerufen:

Form2 f= new Form2();
f.parent(this);
f.Visible=true;
30.12.2005 - 20:23 Uhr

Die Mouse Position bezieht sich auf die ganze Form. Der Location des Controls bezieht sich auf den verfügbaren Bereich. Das heißt zB auch unter einer Menübar.

30.12.2005 - 19:57 Uhr

Ich möchte gerne meine Forum zentriert in einer anderen Forum anzeigen lassen.Dies dürfe normal doch mit

Form.StartPosition=FormStartPosition.CenterParent;

Nun wird die Form zwar in der anderen Forum angezeigt aber nicht zentriert. 🤔

20.12.2005 - 17:46 Uhr

Ne das meine ich nicht. Ich weiß nicht genau aber es soll doch eine Möglichkeit geben das aussehen einzelner Controls zu verändern. Das ganze auch ohne die Win32 API.

19.12.2005 - 19:26 Uhr

Wie kann ich den jetzt in .NET 2.0 die Skins ändern? Irgendwo habe ich gelesen das man zB den Style eines Button ändern kann. Ich meine damit nicht die schon in .NET 1.1 vorhanden Styles Flat usw.

19.12.2005 - 19:05 Uhr

@herbivore

Mal angenommen ich brauche in vielen Klassen ein Wert einer Variable. So ist es doch am besten die Variable static zu machen um auch Klassen übergreifend auf die Variable zuzugreifen. Richtig ? 😁

@roberto
DU machst das mit
Connect test = new Connect();
test.myInspectors_NewInspector(......);

Oder direkt in der Konstruktor
public Connect ()
{
this.myInspectors_NewInspector(......);
}

19.12.2005 - 18:37 Uhr

Oh ich habe das auch etwas falsch gelesen 🙁
Mache einfach folgendes:
In der Klasse Connect eine Eigenschaft hinzufügen

public string getTester
{
get{ return this.tester;}
}

Der Aufruf aus invoke machst du so
Connect test = new Connect();
textEMail.Text = test.Tester;

Wobei dein Fehler darin besteht das die Methode myInspectors_NewInspector gar nicht aufgerufen wird und somit tester auch kein Wert hat.

19.12.2005 - 18:19 Uhr

Ich benutzte auch nicht direkt ListView sondern wie ein paar Topics hir drunter erwähnt TreeListView. Eigentlich wird die von ListView abgeleitet und müsste diese Eigentschaft auch haben.
Ich habe gerade mal getestet bei ListView geht es auch 🙁 . Das ist ja wieder toll gemacht 🤔

19.12.2005 - 18:13 Uhr

Original von herbivore
Hallo alf468,

sorry, den Vorschlag mit der static-Variablen finde ich noch schlechter.

herbivore

Ich kann doch aber nicht von der Instanz y auf eine Variable die von Instanz x einen Wert bekommen hat zugreifen. So ist es doch mit statischen Variablen am besten ?!

19.12.2005 - 18:09 Uhr

Original von herbivore
laut Doku sollte auch lv.Items _ = new ListViewItem () gehen.
herbivore

Die Eigenschaft ist readonly , also so geht es bei mir nicht.

19.12.2005 - 18:05 Uhr

Am besten du machst eine statische Variable so hast du auch Zugriff auf die Variable aus einer anderen Klasse. So wie du es jetzt hast wird es nicht gehen. Du kannst nicht von einer Instanz auf Variablen (oder sonstiges ) die nicht mit dieser Instanz erstellt wurden zugreiffen.

19.12.2005 - 17:56 Uhr

Eine sehr Interessante Diskussion hier 😁 Man kann doch auf direkt auf die Win32 API Zugriffen und somit doch die .NET Komponenten aus dem Programm raus lassen. Man wird zwar immer noch .NET Klassen benötigen für die Implementierung der Win32 Klassen aber dies würde doch auch gehen ?

Aber am besten ist noch C++ lernen und damit programmieren. Aber C++ ist leider nicht so schön wie C# 😁

19.12.2005 - 17:50 Uhr

Richtig das kann ich natürlich aber es wäre viel besser dies auch über die Klasse ListViewItem zu machen.

Was mir bei lv.Items_.Text auch aufgefallen ist, dass man im Programm nachher immer sieht wann ein Update stattfindet. Ich meine damit dieses Flackern.

19.12.2005 - 17:36 Uhr

Wie kann ich am schnellsten die ListView Updaten ? Ich ein Timer am laufen und bei Tick sollen die ListView Items updatet werden. Das Problem ist aber das ich an der Stelle i kein neues ListView Item setzen kann.

18.12.2005 - 21:36 Uhr

Man muss die + und - Icons setzen. Es wundert mich nur das bei zum Teil trotzdem zu sehen waren. Nja egal 😁

Andere Frage:
Wie kann ich am schnellsten die TreeListView Updaten ? Ich ein Timer am laufen und bei Tick sollen die TreeListView Items updatet werden. Das Problem ist aber das ich an der Stelle i kein neues TreeListView Item setzen kann.
Bei normalen ListView geht das auch nicht 🙁

18.12.2005 - 18:41 Uhr

Ich habe mir die TreeListeView Komponente von codeproject geladen und auch gleich in mein Projekt eingebaut. Das Komische ist nur das ich bei mir die + Zeichen erst dann sehe wenn ich einmal mit der Maus drüber gegangen bin. Auch wird der Text nicht versetzt angezeigt wie in der Demo sondern untereinander.

Ich benutzte übrigens .NET 2 mit Visual Studio 2005

11.12.2005 - 19:41 Uhr

Seit dem Umstieg auf .NET 2 kommt bei mir auch immer dieser Fehler

Cross-thread operation not valid:

Ich will aber nicht meinen ganzen Quellcode umschreiben. Gibt es keine schnellere Möglichkeit außer invoke() und delegate ?

13.11.2005 - 11:55 Uhr

Problem gelöst 😁

byte[] bytes=new byte[client.ReceiveBufferSize];
int intBytes=ns.Read(bytes,0,client.ReceiveBufferSize);
								MemoryStream MStream = new MemoryStream();
								MStream.Write(bytes, 0, intBytes);
								MStream.Seek(0,SeekOrigin.Begin);
								XmlSerializer serializer = new XmlSerializer(typeof(SendObject));


Hier gab es schon mal so ein Problem XmlSerializer.Deserialize
Hatte das aber vorher nie gefunden.

12.11.2005 - 21:24 Uhr

OK dummer Fehler 😁
Der Type muss natürlich die Object Klasse sein. Das Senden geht nun nur kommt beim Server eine Fehlermeldung: "Fehler in XML Dokument (0,0).
Was ist nun wieder Falsch?

12.11.2005 - 20:35 Uhr

Dann verwende ich die Klasse XmlSerializer. Nur leider kommt da schon ein Fehler beim Senden.

Unbehandelte Ausnahme: System.InvalidOperationException: Beim Generieren des XML-Dokuments ist ein Fehler aufgetreten. ---> System.InvalidCastException: Die angegebene Umwandlung ist ungültig.
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write3_Codierung(Object o)
--- Ende der internen Ausnahmestapelüberwachung ---

public class Codierung
	{
		private static XmlSerializer serializer = new XmlSerializer(typeof(Codierung));
		public Codierung()
		{
			//
			// TODO: Fügen Sie hier die Konstruktorlogik hinzu
			//
		}
		public static object decodieren(NetworkStream ns)
		{
			return (object)serializer.Deserialize(ns);
		}
		public static NetworkStream encodieren(NetworkStream ns,object ob)
		{
			serializer.Serialize(ns,ob);
			return ns;
		}
	}
12.11.2005 - 20:10 Uhr

Ich möchte gerne ein Object per NetworkStream verschicken,dazu verwende ich die Klasse BinaryFormatter.

public class Codierung
	{
		private static BinaryFormatter serializer = new BinaryFormatter();
		public Codierung()
		{
			//
			// TODO: Fügen Sie hier die Konstruktorlogik hinzu
			//
		}
		public static object decodieren(NetworkStream ns)
		{
			return (object)serializer.Deserialize(ns);
		}
		public static NetworkStream encodieren(NetworkStream ns,object ob)
		{
			serializer.Serialize(ns,ob);
			return ns;
		}
	}

Wenn ich beim Client nun das Object sende kommt beim Server folgender Fehler:
"Die Assembly ClientProjekt ,Version xyz,Culture=neutral,PublicKeyToken=null kann nicht gefunden werden,
Die Serverklasse und die Clientklasse befinden sich in 2 verschiedenen Projekten.

Mfg alf468