Hi,
ich habe eine Konsolenanwendung, und ein Script (DLL) das als Mod für ein Spiel dient.
Nun würde ich gerne zwischen Konsole und Script Daten austauschen.
Ich habe mich für NamedPipes entschieden.
Wenn ich nun einen string von Client zu Server schicke, dann wird in meiner Konsole nichts angezeigt das etwas empfangen wurde.
Wenn ich jedoch von meinem Server eine Nachricht zum Client schicke, dann wird meine Nachricht die ich vom Client zum Server geschickt habe auf einmal doch in der Konsole angezeigt.
Ich bin neu in der Entwicklung mit NamedPipes also könnte ich eure Ratschläge gut gebrauchen.
Hier mal mein momentaner Code vom Server:
Spoiler anzeigen
Und hier der aktuelle Code vom Client:
Spoiler anzeigen
Woran könnte es liegen?
Falls noch weitere Fragen bestehen stellt diese gerne.
ich habe eine Konsolenanwendung, und ein Script (DLL) das als Mod für ein Spiel dient.
Nun würde ich gerne zwischen Konsole und Script Daten austauschen.
Ich habe mich für NamedPipes entschieden.
Wenn ich nun einen string von Client zu Server schicke, dann wird in meiner Konsole nichts angezeigt das etwas empfangen wurde.
Wenn ich jedoch von meinem Server eine Nachricht zum Client schicke, dann wird meine Nachricht die ich vom Client zum Server geschickt habe auf einmal doch in der Konsole angezeigt.
Ich bin neu in der Entwicklung mit NamedPipes also könnte ich eure Ratschläge gut gebrauchen.
Hier mal mein momentaner Code vom Server:
C#-Quellcode
- namespace PipeServerTest {
- class Program {
- private static NamedPipeServerStream server;
- private static StreamReader sr;
- private static StreamWriter sw;
- static void Main(string[] args)
- {
- try
- {
- server = new NamedPipeServerStream("testPipe123", PipeDirection.InOut, 1);
- while (true)
- {
- server.WaitForConnection();
- sr = new StreamReader(server);
- sw = new StreamWriter(server);
- // Ich habe auch schon versucht diesen Block auszukommentieren
- string input = Console.ReadLine();
- if (!string.IsNullOrWhiteSpace(input))
- {
- sw.WriteLine(input);
- sw.Flush();
- }
- //
- if (sr.Peek() > 0) {
- string msg = sr.ReadLine();
- Console.WriteLine("Message: " + msg);
- }
- server.Disconnect();
- }
- }
- catch (Exception ex)
- {
- Console.WriteLine("Error: " + ex.Message);
- }
- }
- }
- }
Und hier der aktuelle Code vom Client:
C#-Quellcode
- private bool Pipe_IsRunning;
- private bool Pipe_IsConnected;
- private string Pipe_Name;
- private NamedPipeClientStream Pipe_Client;
- private StreamReader Pipe_sr;
- private StreamWriter Pipe_sw;
- #region Methods
- private bool StartPipe(string pipeName)
- {
- if (!Pipe_IsRunning) {
- Pipe_Name = pipeName;
- Pipe_IsRunning = true;
- Pipe_Process();
- return true;
- }
- return false;
- }
- private bool StopPipe()
- {
- try {
- if (Pipe_IsRunning) {
- Pipe_IsRunning = false;
- if (Pipe_sr != null) {
- Pipe_sr.Dispose();
- Pipe_sr = null;
- }
- if (Pipe_sw != null) {
- Pipe_sw.Dispose();
- Pipe_sw = null;
- }
- return true;
- }
- return false;
- }
- catch (Exception ex) {
- Game.Console.Print("Pipe stop error. Details: " + ex.Message);
- return false;
- }
- }
- private bool WritePipe(string input)
- {
- try {
- if (Pipe_sw != null) {
- // Wenn ich "Task.Run" rausnehme, dann friert das Spiel komischerweiße ein, erst wenn ich den server schließe läuft das Spiel normal weiter
- Task.Run(() => {
- Pipe_sw.WriteLine(input);
- Pipe_sw.Flush();
- Pipe_Client.WaitForPipeDrain();
- });
- //
- return true;
- }
- return false;
- }
- catch (Exception) {
- return false;
- }
- }
- #endregion
- private void Pipe_Process()
- {
- Task.Run(() => {
- while (Pipe_IsRunning) {
- if (Pipe_IsRunning) {
- using (NamedPipeClientStream client = new NamedPipeClientStream("localhost", Pipe_Name, PipeDirection.InOut)) {
- try {
- client.Connect();
- Pipe_Client = client;
- Pipe_sr = new StreamReader(client);
- Pipe_sw = new StreamWriter(client);
- if (Pipe_sr.Peek() > 0) {
- string msg = Pipe_sr.ReadLine();
- Game.DisplayText(msg);
- }
- }
- catch (IOException) {
- // ...
- break;
- }
- }
- }
- }
- });
- }
Woran könnte es liegen?
Falls noch weitere Fragen bestehen stellt diese gerne.
Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button
Für VB.NET Entwickler: Option Strict On nicht vergessen!
Für VB.NET Entwickler: Option Strict On nicht vergessen!