Laden...

Forenbeiträge von Derok Ingesamt 19 Beiträge

24.05.2011 - 20:39 Uhr

@herbivore

ok ich danke dir das serverprogramm hat das Filesharing bereits erlaubt,
musste nur bei dem ZibLib auch auf ReadWrite umstellen, wobei es bisl eigenartig ist das beide exakt gleich eigenstellt sein müssen damit es überhaubt funktioniert.

Danke dir auf jedenfall auch wenn die Lösung sehr simple war ^^ ging es gegen mein Logikdenken das man etwas was nur liest Filesharingrechte geben sollte fürs Lesen und Schreiben

24.05.2011 - 18:23 Uhr

als erstes danke

@herbivore
das mit dem verbieten das er speichert mach ich ja bereits der fehler passiert dennoch.

Zum Vorschlag, hab auf das Serverprogramm keinen zugriff auf den Source, das Serverprogramm gehört mir selber nicht. Oder kann ich über c# auch das Filesharing freischalten?

werd es mir aufjedenfall mal anschauen

@winSharp93 auch dir danke werd es mir mal anschauen

23.05.2011 - 20:27 Uhr

Hey,

Folgendes liegt vor, bin grad dran eine Oberfläche in C# mit extrafunktionen für ein java-consolen programm zu schreiben.

Das java-consolen programm ist ein Server-Programm für ein game namens Minecraft, die Oberfläche selber schreib ich mir persönlich für meinen Server da die console mich nervt.

Soweit ist alles fertig nur das, wenn man es so nennen will, Backupen funktioniert noch nciht so ganz.

Wann tritt das Problem nicht auf:
Wenn kein Spieler auf dem Server ist, sind alle Kartenabschnitte entladen und dadurch hat die Backup funktion freien zugriff auf die datei.

Wann tritt das Problem auf:
Sobald ein Spieler auf dem Server ist, und sich bewegt greift der Server auf daten zu, liest und beschreibt sie, wobei man gegen das beschreiben einfach nur ein Befehl ausführen kann, welches das beschreiben verhindert. Alos liest der Server nurnoch Dateien ein. Durch das zugreifen des Servers auf die Daten verhindert es das meine backup funktion drauf zugreifen kann und es kommt die "IOExeption, datei wird von einem anderen Prozess bereits verwendet".

im Grunde geht es um diesen Part:

//Relativen Pfad für die Zip Datei erstellen
                RelativePath = Files[i].Substring(ParentDirLen);

                //ZipEntry erstellen
                ZipEntry = new ICSharpCode.SharpZipLib.Zip.ZipEntry(RelativePath);
                ZipEntry.DateTime = System.DateTime.Now;

                //Eintrag hinzufügen
                ZOut.PutNextEntry(ZipEntry);

                //Datei in den Stream schreiben
                    FS = new FileStream(Files[i], FileMode.Open, FileAccess.Read, FileShare.Read);

                    do
                    {
                        ByteLen = FS.Read(Buffer, 0, Buffer.Length);
                        ZOut.Write(Buffer, 0, ByteLen);
                    }
                    while (!(ByteLen <= 0));
                    FS.Close();

Probiert hab ich schon folgendes, die IOException abgefangen, die dateien die er nicht lesen konnte gemerkt und versucht, sobald alle daten fertig sind, sie am ende nochmal drauf zu zu greifen.

Bisher allerdings ohne Erfolg, da ich mich mit ZibLib aber auch kaum auskenne, wär es auch möglich das ich dort ein Fehler eingebaut habe.

Ansonsten wüsstet ihr noch einen anderen weg wie ich c# trotzdem zugriff auf diese Datei gewährleisten kann?

Wär euch sehr dankbar dafür weil es das letzte ist was bei meinem Programm noch nicht so ohne Probleme funktioniert.

MFG
Derok

24.04.2011 - 16:41 Uhr

was ich noch vergessen hab, es ist egal ob sw.Write(); oder sw.WriteLine(); beides kommt bei der .jar nicht an

23.04.2011 - 21:37 Uhr

naja wenn man es so genau sehen will ^^.

Ehm hab nun ein anderes Problem, was er im prinzip auch hatte, kann keine befehle an die .jar senden, auslesen der output ist kein Problem.


            Process nPad = new Process();
            nPad.StartInfo.FileName = @"java";
            nPad.StartInfo.Arguments = " -Xincgc " + "-Xmx3096M " + "-jar " + "craftbukkit.jar";
            nPad.StartInfo.UseShellExecute = false;
            nPad.StartInfo.CreateNoWindow = true;
            nPad.OutputDataReceived += new DataReceivedEventHandler(bukkitLoader_OutputDataReceived);
            nPad.ErrorDataReceived += new DataReceivedEventHandler(bukkitLoader_ErrorDataReceived);
            nPad.StartInfo.RedirectStandardError = true;
            nPad.StartInfo.RedirectStandardOutput = true;
            nPad.StartInfo.RedirectStandardInput = true;
            nPad.Start();
            nPad.BeginOutputReadLine();
            nPad.BeginErrorReadLine();
            Streamwriter sw = nPad.StandardInput;
            sw.AutoFlush = true;
            sw.Write("save-all");

der befehl sw.Write zum beispiel wird falls ohne fehler ausgeführt aber die jar nimmt den befehl irgentwie nicht an und den befehl save-all gibt es bei der jar. sw.AutoFlush true oder false ist zumindest egal, das hab ich bereits probiert.
Hab ihn falls angeschrieben aber antworten tut er leider nicht, daher weiß einer von euch was ich falsch mache?

23.04.2011 - 13:10 Uhr

neh .jar ist ausführbar mit der java.exe
das was ich geschrieben hab reicht damit die -jar datei mit der java.exe startet

und danke für den Beitrag

23.04.2011 - 03:36 Uhr

Hey

Ich hab ein java programm auf dem pc das ich nicht entwickelt habe und ziemlich komplex ist. dieses programm wird über eine console gesteuert.
Nun wollt ich mit C# eine GUI entwickeln für das Programm da ich persönlich kein zugang auf den source-code der java application hab.

soweit sogut, noch nebenbei, es muss alles auf 64bit laufen.


            Prozess nPad = new Process();
            nPad.StartInfo.FileName = "craftbukkit.jar";
            nPad.StartInfo.Arguments = "";
            nPad.StartInfo.UseShellExecute = false; //muss auf false sein, ansonsten IOExeption
            StringBuilder sortOutput = new StringBuilder("");
            nPad.OutputDataReceived += new DataReceivedEventHandler(SortOutputHandler);
            nPad.StartInfo.RedirectStandardOutput = true;
            nPad.StartInfo.RedirectStandardInput = true;
            nPad.Start(); //Hier Fehlermeldung
            StreamWriter sortStreamWriter = nPad.StandardInput;


//Der Teil hier stand so im bsp
private void SortOutputHandler(object sendingProcess,
            DataReceivedEventArgs outLine)
        {
            if (!String.IsNullOrEmpty(outLine.Data))
            {
                numOutputLines++;

                sortOutput.Append(Environment.NewLine +
                    "[" + numOutputLines.ToString() + "] - " + outLine.Data);
            }
        }

Fehlermeldung:
System.ComponentModel.Win32Exception wurde nicht behandelt.
Message="Die angegebene ausführbare Datei ist keine gültige Win32-Anwendung."
Source="System"
ErrorCode=-2147467259
NativeErrorCode=193
StackTrace:
bei System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo)
bei Minecraftgui.Form1.BTstart_Click(Object sender, EventArgs e) in C:\Users\Derok\Documents\Visual Studio 2008\Projects\Minecraftgui\Minecraftgui\Form1.cs:Zeile 59.
bei System.Windows.Forms.Control.OnClick(EventArgs e)
bei System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
bei System.Windows.Forms.Control.WndProc(Message& m)
bei System.Windows.Forms.ButtonBase.WndProc(Message& m)
bei System.Windows.Forms.Button.WndProc(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms .UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
bei Minecraftgui.Program.Main() in C:\Users\Derok\Documents\Visual Studio 2008\Projects\Minecraftgui\Minecraftgui\Program.cs:Zeile 18.
bei System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
bei System.Threading.ThreadHelper.ThreadStart()
InnerException:

Unter folgender Bedingung kann ich das java programm mit c# starten allerdings hab ich dann keinen Input Writer und Output reader


            nPad = new Process();
            nPad.StartInfo.FileName = "craftbukkit.jar";
            nPad.StartInfo.Arguments = "";
            nPad.StartInfo.UseShellExecute = true;
            nPad.Start();

Hoffe jemand kennt eine Lösung wie ich das java programm starten kann und dennoch meinen writer und reader behalte.

Noch dazu gesagt sowohl mein programm als auch das java programm laufen als 64bit anwendung, zumindest das java programm muss unter 64bit laufen

MFG Derok

28.03.2011 - 14:03 Uhr

@MarsStein

das problem lag nicht daran ^^ und wurde auch schon vor längeren behoben

27.03.2011 - 23:16 Uhr

die clientverbindungen verwalten sich mitlerweile im prinzip von selber, vor beginn der socketübernahme bekommt noch der server gesagt, hier ist eine verbindung am aufbauen usw. Passieren IOExeptions, oder Socket Exeptions, so schalten sich die Verbindungen selber ab und sagen es dem Server, genauso kann der Server aber über events, sagen das alle bzw nur eine bestimmte Verbindung aufhören soll.

Dein genannter ansatz, werd ich mir mal genauer überlegen.

27.03.2011 - 17:38 Uhr

naja ganz 100% ist es kein ping 😉 hab das so gemacht, von der einen Antwort bis zur nächsten antwort die Zeit ausgelesen. Am anfang ist die extrem niedrig. Aber bei so vielen verbindungen auf einmal wird die zeispanne zwischen beiden Antworten extrem groß.

27.03.2011 - 06:26 Uhr

Werde nun 2 Sachen machen was hoffentlich die Leistung stark erweitert.

1tens, mein Server-Programm erstmal auf 64 bit laufen lassen.

2tens mich mit dem GC beschäftigen. und mal einen starken blick auf den Server-GC werfen, der laut meinen infos extra für multithreading server entwickelt wurde. wobei ich auch gehört habe das der Server-GC kaum mehr leistung bringen soll.

26.03.2011 - 22:54 Uhr

erwarten und das system auf neh bestimmt anzahl zu bringen sit immer so neh sache 😉
hab dann vor das min 300leute aufeinmal auf dem server sein können.

Ich weiß net UDP ist halt so neh sache, bin dem gegenüber halt etwas abgeneigt, weil wenn packete bei einem mmorpg verloren gehen, könnt das fatal sein, zb jemand kauft etwas aber nichts passiert ^^

26.03.2011 - 22:50 Uhr

bei der anzahl an verbindungen, ca 1-2sec ping, was intollarant für mein vorhaben wär. ^^

26.03.2011 - 14:22 Uhr

geht schlecht, jeder Thread soll einen Client abarbeiten, zu simulierenden zwecken, hab ich halt vom meinem pc aus mehrere clients simuliert.
Und wenn ein Thread mehrere Clients betreut, muss immer ein Client warten, daher im Prinzip dann das gleiche Problem.

26.03.2011 - 02:50 Uhr

ok sry hat sich geklärt.

Nach vielen rum probieren hab ich das Problem entdeckt.

Es liegt nicht an der tcp verbindung daher gehört es nicht hier rein.
Grund dafür sind die Threads.
Jeder Thread zum client hat die gleiche Priorität.
Es sind nur sooo viele, das ein Thread auf dem Server so selten dran kommt, da der wohl immer bisl braucht vom Thread zu Thread um zu schalten, ist nur ehn 4corer, dadurch können auch nur 4 threads gleichzeitig vom cpu bearbeitet werden.

Fazit ab 1200 verbindungen ca, kommt der thread sooo selten dran, das er aufgrund des Standart Timeouts abbricht.
Und vermutlich wegen dem often wechsel zwischen den Threads, geht die cpu auch nie auf 100%

25.03.2011 - 23:39 Uhr

Hey,

hab mal einen Test zwischen Server und client gemacht, dazu folgende punkte.

Multithreading-Server
Client, der mehrere verbdinungen aufbauen kann (gleiche ip, gleicher port).

Sobald eine Verbindung aufgebaut wird, bleibt diese bestehen und schickt dauerhaft daten hin und her.

Nun passiert bei ca 1200 verbindungen auf den Server folgendes, die einzelne Threads für jeden client, werfen mir nach und nach IOExeptions raus. Mit der Begründung:
Von der Übertragungsverbindung können keine Daten gelesen werden.

Dies passiert immer ca ab der zahl 1200+-50.

Diesen Test hab ich auch mit einem Kollegen zusammen gemacht, beide haben immer mehr verbindungen aufgebaut und ab 1200+-50 sind uns die ersten verbindungen abgekackt.
Gibt es beim Thread eine maximale anzahl oder nimmt ein TCP-Server nicht mehr als eine bestimmte anzahl an verbindungen an?

Server von mir ist ein root server der an einer 100mbit leitung anliegt.
CPU auslastung war beim test bei 35%.
Hoffe jemand weiß den Grund und was man dagegen tun kann.

Warum ich diesen Test mache, weil ich demnächst eine Server-Architektur aufbauen muss, die sehr viele verbindungen aufeinmal bearbeiten kann.

25.03.2011 - 21:24 Uhr

jo hab bei java mit java.io gearbeitet, war easy ^^ vom grundaufbau haste recht da ist es sehr gleich, nur das es bei einzelnen packeten verschicken easy war ^^

hab nun 2sachen erfolgreich gemacht,
der erste versuch war eigentlich die simplste, hab name und passwort mit ein Slash dazwischen zusammen gepackt und versendet dem entsprechend bei server seite dann halt wieder gesplittet. Probleme bei der möglichkeit, wenn es mal über die 4096bytes geht ^^. Erhöhen wär möglich aber effizient ist was anderes.

Die andere möglichkeit wie es ging war die von ppk auf die ich auch kam ^^, geht auch ohne probleme, ist halt nur die sache das man erstmal dem server sagen muss wielang das teil ist.

Ist jetzt Fraglich, hab vor, in ca 4monaten ein MMORPG an zu fangen, im moment bau ich mir das basis wissen in c# und der dafür vorgesehenen engine auf.

Was vermutet ihr wird von der latenzzeit schneller und effektiver sein? bzw wird sich dadurch überhaubt ein unterschied sichtbar machen? Und gibt es effektivere Methoden daten zu übertragen?

Und damit nicht so Flames entstehen wie... noch so einer der ein mmorpg programmiert, hab bereits eins zu testzwecken programmiert, damals in java halt.
Man konnt kämpfen, lvln, die mobs hatten neh mini-ki, sachen kaufen, chatten, und pvp aber alles halt im maßstab des tests, also nichts davon ausgereift 😉
Und weiß auch wie viel zeit sowas in Anspruch nimmt, damals bei java, zur testzwecken schon alleine 4Monate gebraucht

25.03.2011 - 18:14 Uhr

danke für die schnellen antworten

@Smou, ob TcpClient oder Socket, kam beides das gleiche raus, wie oben schon beschrieben

Durch den Tip von Smou mit dem 8192 bin ich auf die idee gekommen das beide Send Methoden des cleints in eine Read methode des server landen. Habs überprüft und so wars auch

@Pria, werd nun erstmal nach ner eigenen Lösung weiter suchen, und wenn ich keine Lösung find deins Anschauen, bin einer der immer erst alles selber Lösen will, aber auf die idee das beide Strings die vom Client gesendet wurden in einer Read-methode des Servers landen, kam ich irgentwie nicht ^^

25.03.2011 - 16:30 Uhr

Hey,

bin im moment beim umsteigen von Java auf c# und hab mich dort schon öfters mit netzwerkprogrammierung beschäftigt, allerdings ist das in c# ein tick komplizierter ^^.
Aufjedenfall hab ich bereits ein Programm geschrieben, dort hat es ohne Probleme funktioniert, aber nun hab ich grad ein Durchhänger und find den Wald vor lauter Bäumen nicht wenn man es so nennen will 😉.

Server-code um den es sich handelt:


public void HandleClientComm(object client)
        {
            work.meldung(false, "Thread hat client übernommen");
            //TcpClient tcpClient = (TcpClient)client;
            //NetworkStream clientStream = tcpClient.GetStream();
            Socket clients = (Socket)client;
            ASCIIEncoding encoder = new ASCIIEncoding();
            work.meldung(false, "Thread initialisiert");
            try
            {
                //Wartet auf income vom Client
                byte[] bname = new byte[4096];
                work.meldung(false, "Warte auf name");
                //int bytesRead1 = clientStream.Read(bname, 0, 4096);
                clients.Receive(bname);
                work.meldung(false, "name empfangen");
                byte[] bpasswort = new byte[4096];
                work.meldung(false, "warte auf pw");
                //int bytesRead2 = clientStream.Read(bpasswort, 0, 4096);
                clients.Receive(bpasswort);
                work.meldung(false, "pw empfangen");
                String name = BitConverter.ToString(bname);
                work.meldung(false, name);
                String passwort = BitConverter.ToString(bpasswort);
                work.meldung(false, passwort);
                int idss = 1328;
                String ids = ""+idss;
                byte[] id = encoder.GetBytes(ids);
                //clientStream.Write(id, 0, id.Length);
                clients.Send(id);
            }
            catch (SocketException e)
            {
                work.meldung(true, "Ein Socket-Fehler bei einem Login-Client-Thread ist aufgetreten");
                work.meldung(false, "" + e);
            }
            catch (IOException e)
            {
                work.meldung(true, "Ein IO-Fehler bei einem Login-Client-Thread ist aufgetreten");
                work.meldung(false, "" + e);
            }
            //clientStream.Close();
            //tcpClient.Close();
            clients.Close();
        }

Client Code um den es sich handelt:


private void BTlogin_Click(object sender, EventArgs e)
        {
                String name = TBname.Text;
                String pw = TBpw.Text;
                String host = "127.0.0.1";
                int port = 3115;
                ASCIIEncoding encoder = new ASCIIEncoding();
                byte[] bname = new byte[4096];
                bname = encoder.GetBytes(name);
                byte[] bpw = new byte[4096];
                bpw = encoder.GetBytes(pw);
                TBfehler.Text = name + "/" + pw;
                IPAddress ipo = IPAddress.Parse(host);
                IPEndPoint ipEo = new IPEndPoint(ipo, port);
                Socket socket = new Socket(ipo.AddressFamily,
                                               SocketType.Stream,
                                               ProtocolType.Tcp);
                try
                {
                    socket.Connect(ipEo);
                    socket.Send(bname);
                    socket.Send(bpw);
                    byte[] message = new byte[4096];
                    socket.Receive(message);
                    TBfehler.Text = "Nachricht erhalten";
                    int id = BitConverter.ToInt32(message, 0);
                    TBid.Text = "ID: " + id;
                    socket.Close();
                }
                catch (SocketException k)
                {
                    TBfehler.Text = "" + k;
                }
                catch (ArgumentOutOfRangeException k)
                {
                    TBfehler.Text = "" + k;
                }
                catch (ObjectDisposedException k)
                {
                    TBfehler.Text = "" + k;
                }
                catch (ArgumentNullException k)
                {
                    TBfehler.Text = "" + k;
                }
        }

Nun zur sache, das was auskommentiert habe bei dem server ist eine andere methode die ich mal in nen tutorial gesehen hab, dort bin ich aber bis zum gleichen punkt gekommen.
Verbindung baut es erfolgreich auf und der nick name wird übertragen.
Auf serverseite ist der letzte befehl den er erfolgreich ausführt
work.meldung(false, "warte auf pw");
auf clientseite entsprechend
socket.Send(bname);
weiß einer von euch warum es dann nciht weitergeht?
Hoffe ihr könnt mir helfen