Laden...

Klassenübergreifender Zugriff auf Methode funktioniert nicht

Erstellt von Mazo vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.370 Views
M
Mazo Themenstarter:in
255 Beiträge seit 2006
vor 13 Jahren
Klassenübergreifender Zugriff auf Methode funktioniert nicht

Hallo,
ich bin etwas raus aus CSharp und finde den grund nicht warum bei folgendem Code (gekürzt) in der Klasse ServerInstance in der Methode Receive nicht auf WriteLogMessage aus MainWindow zugegriffen werden kann... Eigentlich ist diese public und ich müsste darauf zugreifen können?


using System;
using System.Windows;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Collections;
using System.Windows.Threading;


namespace Projekt_Manager_Server
{

public partial class MainWindowServer : Window
{
public int CurrentConnections = 0;
public int serverListenPort = 10000;
public const int maxServerConnections = 100;

public System.Collections.ArrayList Clients = new ArrayList(maxServerConnections);
public int sleepTime = 200;
public int TimeOut = 2000;
public IPAddress ipAddress = IPAddress.Any;//Dns.Resolve("127.0.0.1";).AddressList[0];
private Thread mainThread;

public delegate void MyDelegate();

public void WriteLogMessage(string Text)
{
textBox1.Dispatcher.Invoke(DispatcherPriority.Normal, (MyDelegate)
delegate()
{
textBox1.Text += Text + "\r\n";
});
}

public void mainListener()
{
// Alle Netzwerk-Schnittstellen abhören
TcpListener listener = new TcpListener(ipAddress, serverListenPort);
WriteLogMessage("Listening on port " + serverListenPort + "...";);
try
{
listener.Start();
// Solange Clients akzeptieren, bis das
// angegebene Maximum erreicht ist
while (CurrentConnections <= maxServerConnections)
{
while (!listener.Pending()) { Thread.Sleep(sleepTime); }
Socket newSocket = listener.AcceptSocket();
if (newSocket != null)
{
CurrentConnections++;
// Mitteilung bzgl. neuer Clientverbindung
("Neue Client-Verbindung (" +
"IP: " + newSocket.RemoteEndPoint + ", " +
"Port " + ((IPEndPoint)newSocket.LocalEndPoint).Port.ToString() + ";)";);
// Instanz der serverseitigen Verwaltungsklasse erzeugen
serverInstance newConnection = new serverInstance(newSocket);
Clients.Add(newConnection);
}
}
}
catch{...}
}

public void Window_Loaded(object sender, RoutedEventArgs e)
{
// Hauptthread wird instanziiert ...
mainThread = new Thread(new ThreadStart(this.mainListener));
// ... und gestartet
mainThread.Start();

}
}


class serverInstance
{
const int SleepTime = 200;
public Thread serverThread;
public Socket socket;
const int BufferSize = 10240;

public serverInstance(Socket socket)
{
// Thread erzeugen
serverThread = new Thread(new ThreadStart(Process));
serverThread.Start();
}

public void Process()
{
MemoryStream mem = new MemoryStream();// Empfangspuffer
byte[] buffer = new byte[BufferSize];
int TimeOut = 0;
newMessage("Server gestartet";);
while (TimeOut < (10 * 1000 / SleepTime))
{
mem.Seek(0, SeekOrigin.Begin);
mem.SetLength(0);
while (socket.Available > 0)
{
int bytesRead = socket.Receive(buffer, buffer.Length, SocketFlags.None);
if (bytesRead <= 0) continue;
mem.Write(buffer, 0, bytesRead);
}
if (mem.Length > 0)
{
if (mem.Length == 4)
if (System.Text.Encoding.ASCII.GetString(mem.ToArray(), 0, 4) == "quit";)
{
closeConnection();
break;
}
Receive(mem.ToArray());
mem.Seek(0, SeekOrigin.Begin);
mem.SetLength(0);
TimeOut = 0;
}
else
{
TimeOut++;
Thread.Sleep(SleepTime);
}
}
closeConnection();
socket.Close();
socket = null;
serverThread.Abort();
}

public void Receive(byte[] data)
{
//WriteLogMessage(data.Length+" bytes received";);
WriteLogMessage("Received: " + System.Text.Encoding.ASCII.GetString(data));//Wird nicht gefunden - MainWindow.WriteLogMessage auch nicht
int bytesSend = socket.Send(data);
//WriteLogMessage(bytesSend+" bytes returned to sender";);
}

}
}

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

entweder brauchst Du die Instanz des MainWindowServer für den Zugriff, oder die Methode müsste static sein...

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

M
Mazo Themenstarter:in
255 Beiträge seit 2006
vor 13 Jahren

Hallo,
danke für deine schnelle Antwort. Bei static müsste die textBox1 auch static sein bzw müsste man diese über MainWindowServer.textBox1 aufrufen. Unter MainWindowServer.* wird allerdigns weder textBox1 gefunden oder die Methode WriteLogMessenger. Könnte ich aus der Class MainWindowServer das "this" übergeben an die Serverinstance? Ich hab jetzt dem Window ein Name-Attribut gesetzt, allerdigns hilft das nicht weiter ...
Gruß Mazo

1.433 Beiträge seit 2006
vor 13 Jahren

eigenlich sollte diese Klasse ja nicht's vom GUI wissen. Mit Ereignissen kannst Du von anderen Klasse auch mit dem GUI kommunizieren und die Log-Messages an die TextBox weiter geben.

Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt

3.728 Beiträge seit 2005
vor 13 Jahren
Remoting

Hallo Mazo,

wenn ich das richtig verstanden habe, möchtest Du ein Fenster fernsteuern. TCP-Sockets sind dafür nicht die Erste Wahl. Mit Remoting würdest Du schneller bessere Ergebnisse erzielen.

Hier siehst Du, wie einfach sowas mit Remoting realisiert werden kann: Remoting-Helfer

M
Mazo Themenstarter:in
255 Beiträge seit 2006
vor 13 Jahren

Hallo,danke für eure Antworten.

eigenlich sollte diese Klasse ja nicht's vom GUI wissen. Mit Ereignissen kannst Du von anderen Klasse auch mit dem GUI kommunizieren und die Log-Messages an die TextBox weiter geben. Das war der richtige Ansatz. Ich werf jetzt einfach jedesmal ein Event raus wenn die Instanz eine LogNachricht schreiben will - damit funktioneirt es.
wenn ich das richtig verstanden habe, möchtest Du ein Fenster fernsteuern. TCP-Sockets sind dafür nicht die Erste Wahl. Mit Remoting würdest Du schneller bessere Ergebnisse erzielen. An sich will ich nur aus verschiedenen Threads in die gleiche textbox LogNachrichten ausgeben, um zu überprüfen was über die Sockets so für Daten reinkommen.

Grüße Mazo