Laden...

TCPClient gesendete Daten trennen

Erstellt von Hendrik vor 17 Jahren Letzter Beitrag vor 17 Jahren 1.708 Views
H
Hendrik Themenstarter:in
37 Beiträge seit 2007
vor 17 Jahren
TCPClient gesendete Daten trennen

Hallo,
ich habe zwei Methoden erstellt welche nacheinander aufgerufen wurden. Diese schicken Daten an eine Server Application.

Als command wird z.B. Test geschickt - leider kommt am Server dann: "Testquit" an. Wie kann ich diese Kommandos voneinander trennen?

Client Methoden:


// Methoden zum Anfragen, Empfangen und Senden der Daten.
public void SendCommand(String command)
{
  Byte[] _sendBytes = Encoding.ASCII.GetBytes(command);
  m_NetworkStream.Write(_sendBytes, 0, _sendBytes.Length);
}

// Methode zum Beenden der Verbindung. (Sendet das quit commando und schließt die Verbindung.)
public void CloseConnection()
{
  Byte[] _sendBytes = Encoding.ASCII.GetBytes("quit");
  m_NetworkStream.Write(_sendBytes, 0, _sendBytes.Length);
  m_NetworkStream.Close();
  m_TcpClient.Close();
}

Server:


while (!this.m_listenerStop)
{
  NetworkStream _NetworkStream = this.m_tcpClientConnection.GetStream();
  if (_NetworkStream.DataAvailable)
  {
    // Empfängt Daten. 
    Byte[] _recivedDataByte = new Byte[m_tcpClientConnection.ReceiveBufferSize];
    int _intBytesRead = _NetworkStream.Read(_recivedDataByte, 0, m_tcpClientConnection.ReceiveBufferSize);
    string _recivedDataString = Encoding.Default.GetString(_recivedDataByte, 0, _intBytesRead);

    switch (_recivedDataString)
    {
      case "quit":
        System.Console.WriteLine("Disconnection request from client.");
        this.m_listenerStop = true;
        break;
      default:
        System.Console.WriteLine("Unknown command from client: " + _recivedDataString);
        break;
    }
  }
  else
  {
    Thread.Sleep(100);
  }
}

Gruß, Hendrik

228 Beiträge seit 2006
vor 17 Jahren

vll überlegst du dir vorher eine art protokoll...
sprich packet type u. length u. inhalt
so kannst du deine wörter einzeln senden und trennen

MfG MEt45

Medieval Fantasy Online - ORPG Projekt
.NET - Try and Error - Blog - Gemeinschaftsblog
MEt45's Dev Garage - Eigener Blog

H
Hendrik Themenstarter:in
37 Beiträge seit 2007
vor 17 Jahren

Also ich habe mir das so gedacht, das der Client Befehle an den Server schickt.
Dann soll der Server z.B. eine ArraList serialisieren und zurück schicken.
Ich bin mir momentan nicht so ganz sicher wie ich das am Besten mache.
Gruß, Hendrik

228 Beiträge seit 2006
vor 17 Jahren

ja deswegen solltest du dir eine art protokoll überlegen
meinetwegen nochmal:

[PACKET ID][PACKET LENGTH][PACKET BODY]

sprich als beispiel:

[0x00][5][HALLO]

ansonsten google mal wenn du immer noch nicht weißt was ich meine...
gestern ging es ja darum wie du deine befehle außeinander bekommst

MfG MEt45

Medieval Fantasy Online - ORPG Projekt
.NET - Try and Error - Blog - Gemeinschaftsblog
MEt45's Dev Garage - Eigener Blog

B
1.529 Beiträge seit 2006
vor 17 Jahren

In diesem einfachen Fall reicht es aber, wenn jeder Befehl eine eigene Zeile bekommt. Du sendest also nach jedem Befehl ein "\n".
Der Server trennt die Daten an jedem "\n" und gibt jede vollständige Zeile zur Verarbeitung weiter.

PS.: In diesem Fall solltest du wirklich NICHT Environment.NewLine verwenden, da die Anwendungen ja - zumindest theoretisch - auf verschiedenen OS laufen können...

H
Hendrik Themenstarter:in
37 Beiträge seit 2007
vor 17 Jahren

Besten dank erstmal.
Ich werde das mit dem Zeilenumbruch versuchen falls das nicht so ganz klappt - muss ich mir halt ein Protokoll basteln.
Gruß, Hendrik

T
512 Beiträge seit 2006
vor 17 Jahren

Das ist schon ein Protokoll:

Ein Befehl muss mit \n beendet werden.

Ziemlich simpel, aber ein Protokoll.

e.f.q.

Aus Falschem folgt Beliebiges