Probleme mit TCP Client.

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Mono.

    Probleme mit TCP Client.

    Hey Leute,

    irgendwie kapiere ich das einfach nicht. Ich will mir eine Library schreiben worüber ich eine TCP Connection zu meinem Haus Server öffne, und mit dort enthaltenden Funktionen Statuse von Objekten in unserer Haussteuerungs Software abfragen. Nun scheitere ich daran, das ich die Connection offen halte. Ich möchte nämlich nicht die ganze Zeit die Connection neu öffnen und direkt wieder schließen.

    C#-Quellcode

    1. ​using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Net.NetworkInformation;
    5. using System.Net.Sockets;
    6. using System.Text;
    7. using System.Threading.Tasks;
    8. namespace HomePuterExecuteLibrary
    9. {
    10. public class Lib
    11. {
    12. private static System.Net.Sockets.TcpClient tcpClient;
    13. private static System.Net.Sockets.NetworkStream networkStream;
    14. private static System.IO.StreamReader streamReader;
    15. private static System.IO.StreamWriter streamWriter;
    16. private static String pw = "";
    17. public static void openConnection(String ip, int port)
    18. {
    19. //tcpClient.Connect(ip, port);
    20. tcpClient = new System.Net.Sockets.TcpClient(ip, port);
    21. networkStream = tcpClient.GetStream();
    22. streamReader = new System.IO.StreamReader(networkStream);
    23. streamWriter = new System.IO.StreamWriter(networkStream);
    24. streamWriter.AutoFlush = true;
    25. }
    26. public static void closeConnection()
    27. {
    28. streamReader.Close();
    29. streamWriter.Close();
    30. networkStream.Close();
    31. tcpClient.Close();
    32. }
    33. public static string writeintoconnection(String va)
    34. {
    35. streamWriter.Write(va);
    36. string response = streamReader.ReadLine();
    37. return response;
    38. }
    39. public static string getStatusFromString(string d)
    40. {
    41. string[] tokens = d.Split('=');
    42. return tokens[tokens.Length - 1];
    43. }
    44. public static string getStatus(String obje)
    45. {
    46. String re = writeintoconnection(pw + " G" + obje);
    47. if (re.Equals("access denied"))
    48. {
    49. return "acces denied.";
    50. }
    51. if (String.IsNullOrWhiteSpace(re))
    52. {
    53. return "Get Empty Response.";
    54. }
    55. String status = getStatusFromString(re);
    56. return status;
    57. }
    58. public static Boolean isConnected()
    59. {
    60. if (tcpClient.Connected == true)
    61. {
    62. return true;
    63. } else
    64. {
    65. return false;
    66. }
    67. }
    68. /*
    69. public static bool IsConnected
    70. {
    71. get
    72. {
    73. try
    74. {
    75. if (tcpClient != null && tcpClient.Client != null && tcpClient.Client.Connected)
    76. {
    77. if (tcpClient.Client.Poll(0, SelectMode.SelectRead))
    78. {
    79. byte[] buff = new byte[1];
    80. if (tcpClient.Client.Receive(buff, SocketFlags.Peek) == 0)
    81. {
    82. return false;
    83. }
    84. else
    85. {
    86. return true;
    87. }
    88. }
    89. return true;
    90. }
    91. else
    92. {
    93. return false;
    94. }
    95. }
    96. catch
    97. {
    98. return false;
    99. }
    100. }
    101. }*/
    102. }
    103. }

    Irgendwie funktioniert das nicht wirklich. Meine Kenntnisse sind auch noch nicht so extrem weit, also wäre Hilfe ganz nett. Bin diesen Monat auch noch nicht wirklich zum C# programmieren gekommen obwohl ich letzten erst damit angefangen habe.

    Ich hoffe auf Hilfe.

    MFG Nils
    Hi,
    wie äußert sich denn das Problem?

    Grüße
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!

    C#-Quellcode

    1. ​using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Threading.Tasks;
    5. using System.Windows.Forms;
    6. namespace WindowsFormsApplication1
    7. {
    8. static class Program
    9. {
    10. /// <summary>
    11. /// Der Haupteinstiegspunkt für die Anwendung.
    12. /// </summary>
    13. [STAThread]
    14. static void Main()
    15. {
    16. Application.EnableVisualStyles();
    17. Application.SetCompatibleTextRenderingDefault(false);
    18. Application.Run(new Form1());
    19. }
    20. public static string ok()
    21. {
    22. HomePuterExecuteLibrary.Lib.openConnection("192.168.0.45", 54711);
    23. return HomePuterExecuteLibrary.Lib.getStatus("Licht_SZDecke");
    24. }
    25. }
    26. }

    C#-Quellcode

    1. ​using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Drawing;
    6. using System.Linq;
    7. using System.Text;
    8. using System.Threading.Tasks;
    9. using System.Windows.Forms;
    10. using HomePuterExecuteLibrary;
    11. namespace WindowsFormsApplication1
    12. {
    13. public partial class Form1 : Form
    14. {
    15. public Form1()
    16. {
    17. InitializeComponent();
    18. }
    19. private void statusbutton_Click(object sender, EventArgs e)
    20. {
    21. listBox1.Items.Add(Program.ok());
    22. }
    23. }

    Ich habe eine Test Application erstellt um die Lib zu testen und dort komm ich immer an dem Punkt raus:


    Mir sagt der Fehler jetzt auch nicht wirklich etwas. Also schon das etwas Null ist, aber was. Wenn die Antwort vom Server Null ist hätte er mir "Get Empty Response." zurückgeben müssen.

    Fakiz schrieb:

    HomePuterExecuteLibrary.Lib serverLib = new HomePuterExecuteLibrary.Lib()

    Dann kannst du deine Methoden mit serverLib.openConnection(...) aufrufen.


    VS meint das ich das mit einem Typnamen qualifizieren muss. Was bedeutet das.

    Noim schrieb:

    TCP Connection
    Wer ist Server, wer ist Client?
    Dein Haus-Dingens sollte der Server sein, der arbeitet rund um die Uhr.
    Wenn Du was schalten willst, bist Du Client, machst eine Verbindung auf, sagst was, empfängst eine Antwort und schließt die Verbindung wieder.
    Gugst Du MSDN Socket Server und MSDN Socket Client.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ah, da hätt ich besser lesen sollen.
    Prüf mal in der Methode writeconnection ob dein StreamWriter Null ist.

    PS: wenn da alles passt prüf das Array tokens

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Fakiz“ ()

    Fakiz schrieb:

    Prüf mal in der Methode writeconnection ob dein StreamWriter Null ist.
    Da muss er wenig prüfen. Der ist null (wie ThuCommix das auch schon erklärt hat).
    Du kannst nicht einfach globale Variablen uninitialisiert deklarieren und dann Methoden aufrufen, die darauf zugreifen. Wenn Du das Grundprinzip der OOP verstanden hast, @Noim, müsste das ja klar sein, wie es benutzt werden muss. ;) Sieht allerdings so aus, als würden Dir noch die wichtigsten Grundlagen fehlen. Das solltest Du evtl. nachholen, weil sonst ist das ja etwas problematisch.

    Ich nehme mal an, dass Du den Code dann nicht geschrieben hast, oder? Die Architektur ist aber imho sowieso gänzlich ungeschickt. Macht absolut keinen Sinn, das alles statisch zu verwalten. Eine normale Klasse mit Instanzmembern wäre hier viel angebrachter, denn das baut ja alles aufeinander auf.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    @Trade und @ThuCommix

    ihr seid etwas vorschnell und liegt leider daneben. So sehr man auch über das rein statische Konstrukt streiten kann (würde das nie so machen, warum alles statisch?), grundsätzlich würde es so funktionieren. Ich vermute das bei

    VB.NET-Quellcode

    1. string response = streamReader.ReadLine();


    response null ist (weil nix zurück gesendet wird von 192.168.0.47) und dann

    VB.NET-Quellcode

    1. String re = writeintoconnection(pw + " G" + obje);
    2. if (re.Equals("access denied"))


    den Fehler wirft.(re is null)

    Der TCP Client verbindet sich im Konstruktor, wenn man IP und Port übergibt. Und vor writeconnection wird openconnection aufgerufen und damit sind alle globalen Variablen initialisiert. Also erstmal genauer hinschauen.

    LG
    Das ist meine Signatur und sie wird wunderbar sein!
    was ist "Licht_SZDecke" ?
    dein client schickt dem server eine Nachricht "ey sag mal ob das licht an der Decke an is".
    Dein Server bekommt diese Anfrage, macht damit etwas und schickt eine nachricht zurück mit "joa ich glaube das licht is an";
    Keine Ahnung was dein Client da für unfug macht :D
    Holy.., ich habe das openConnection nicht gesehen. Jo, dann nehme ich das zurück.
    Der Punkt, dass es statisch ist, bleibt natürlich.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Naja es ist halt so dort auf dem Server läuft einfach ein Programm womit man sich über Telnet verbinden kann und dort Commands hinsenden kann. Die sind dann wirklich einfach wie:
    password GLampe oder so. Das Programm auf dem Server hookt sich in die eigentlich Software ein und setzt den Status oder holt ihn.