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 ?
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.
Ich muss das ganze aber doch nach dem Umwandeln wieder in den Text einfügen.
In dem Moment verändere ich doch den Index
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 ?
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.
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 ?
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 🤔
Irgendwie verstehe ich die Geschichte mit RegEx nicht richtig X(
Wäre nett wenn du mal ein kleines Beispiel machen könntest 👍
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 ?
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.
Ich will eine Art Webchat programmieren.Es kann immer ein User eine Nachricht schreiben. Die Webseite müsste nie aufhören zu laden ?!
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
Du musst der Klasse auch das Attribut Serializable() mitgeben.
Falls du noch keine Lösung hast, dann schau mal hier Drucken eines Controls????
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 🙁
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));
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 ?
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"
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?
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 ?!
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.
ZedGraph ist aber doch nicht für kommerzieller Software ?!
Das Programm ist aber für kommerzielle Zwecke gedacht.Ich kann also kein Open-Source verwenden.
Ich möchte keinen Quellcode haben sondern viel mehr wie man so was am besten berechnen kann. Das Zeichnen ist ja nicht das Problem.
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.
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.
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(
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;
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.
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. 🤔
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.
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.
@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(......);
}
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.
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 🤔
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 ?!
Original von herbivore
laut Doku sollte auch lv.Items _ = new ListViewItem () gehen.
herbivore
Die Eigenschaft ist readonly , also so geht es bei mir nicht.
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.
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# 😁
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.
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.
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 🙁
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
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 ?
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.
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?
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;
}
}
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