XML bei Zuganforderung unvollständig

wollw
Beiträge: 31
Registriert: Mi 16. Mär 2011, 21:43

XML bei Zuganforderung unvollständig

Beitragvon wollw » Fr 6. Jan 2012, 22:46

Liebe Server-Entwickler, liebe SC-Teilnehmer,

dieses Thema richtet sich an diejenigen, die ein Client-Programm ohne Zuhilfenahme des Simple-Clients programmieren wollen.

Ich habe mich mit der Kommunikation Server<->Client beschäftigt. Anlass war, dass meine Schüler mit der XML-Kommunikation nicht zurecht kamen. Sie haben dies unter dem Thread "Auswahl der Hauptdatei" diskutiert, ohne zu einem Ergebnis zu kommen.

Mithilfe eines Client-Testprogramms in Ruby [1] komme ich zu dem Ergebnis, dass im Falle einer Zuganforderung der XML-String des Servers unvollständig ist.
Ablauf des Tests:
1.) Starten des Servers (Version c7a508110950f13b98fd727daa474fb235f456d6)
2.) Spiel->Neues Spiel erstellen; Spieler1: Computerspieler(manuell), Spieler 2: Mensch, Zeitlimit deaktivieren, Port: 13050
3.) Spiel starten; Warte auf Spieler...
4.) Starten des Client-Testprogramms
5.) Blaue Start-Taste im Server-GUI klicken

Die Verbindung zum Server wird aufgebaut und die Kommunikation läuft bis zur Zugaufforderung. Die Ausgabe des Client-Testprogramms [2] zeigt, dass das abschließende </room> fehlt. Allerdings ist das debug-Info des Servers vollständig, s. [3].

Eine Analyse mit Wireshark [4] führte zur Klärung: Das letzte TCP-Paket des Servers endet mit </room>, es folgt aber kein newline-Zeichen. Daher wartet das Client-Programm im gets() auf das Zeilenende.

Ein Client Programm muss also bei diesem Server zeichenweise aus dem socket lesen.

In der Dokumentation "Client-Server Kommunikation Manhattan" ist dies nicht erwähnt.

Lieber Server-Entwickler, vielleicht könnt ihr den Server dahingehend ändern, das XML-Strings mit einem newline-Zeichen abschließen.

mfg
Kai Wollweber
Peter-Ustinov-Schule
Eckernförde

[1] Client-Testprogramm:

Code: Alles auswählen

require 'socket'     
host = 'localhost'
port = 13050
s = TCPSocket.open(host, port);
s.puts('<protocol><join gameType="swc_2012_manhattan"/>');
while true do
  print(s.gets());
end;


[2] Ausgabe des Client-Testprogramms:

Code: Alles auswählen

<protocol>
  <joined roomId="2f97c4c4-5b7d-48a7-8430-625d44da7cc0"/>
  <room roomId="2f97c4c4-5b7d-48a7-8430-625d44da7cc0">
    <data class="manhattan:welcome" color="red"/>
  </room>
  <room roomId="2f97c4c4-5b7d-48a7-8430-625d44da7cc0">
    <data class="memento">
      <state class="manhattan:state" turn="0" start="red" current="red" type="select">
        <red displayName="Spieler 1" points="0">
          <segment size="1" usable="0" retained="11"/>
          <segment size="2" usable="0" retained="6"/>
          <segment size="3" usable="0" retained="4"/>
          <segment size="4" usable="0" retained="3"/>
          <card slot="4"/>
          <card slot="0"/>
          <card slot="3"/>
          <card slot="0"/>
        </red>
        <blue displayName="Spieler 2" points="0">
          <segment size="1" usable="0" retained="11"/>
          <segment size="2" usable="0" retained="6"/>
          <segment size="3" usable="0" retained="4"/>
          <segment size="4" usable="0" retained="3"/>
          <card slot="2"/>
          <card slot="0"/>
          <card slot="1"/>
          <card slot="4"/>
        </blue>
      </state>
    </data>
  </room>
  <room roomId="2f97c4c4-5b7d-48a7-8430-625d44da7cc0">
    <data class="sc.framework.plugins.protocol.MoveRequest"/>


[3] Debug-Info des Servers:

Code: Alles auswählen

22:47:43 DEBUG sc.networking.clients.XStreamClient - DataDump:
<room roomId="2f97c4c4-5b7d-48a7-8430-625d44da7cc0">
  <data class="sc.framework.plugins.protocol.MoveRequest"/>
</room>


[4] Wireshark-Protokoll (letztes TCP-Paket des Servers):

Code: Alles auswählen

0000  00 00 03 04 00 06 00 00  00 00 00 00 00 00 86 dd   ........ ........
0010  60 00 00 00 00 9f 06 40  00 00 00 00 00 00 00 00   `......@ ........
0020  00 00 00 00 00 00 00 01  00 00 00 00 00 00 00 00   ........ ........
0030  00 00 00 00 00 00 00 01  32 fa cf b7 47 f5 9a 58   ........ 2...G..X
0040  98 7b 19 09 80 18 07 fe  00 a7 00 00 01 01 08 0a   .{...... ........
0050  01 64 be ed 01 64 b9 72  0a 20 20 3c 72 6f 6f 6d   .d...d.r .  <room
0060  20 72 6f 6f 6d 49 64 3d  22 66 34 35 64 35 63 37    roomId= "f45d5c7
0070  38 2d 61 35 34 64 2d 34  31 38 62 2d 61 64 62 61   8-a54d-4 18b-adba
0080  2d 31 38 31 35 64 35 33  62 63 61 31 33 22 3e 0a   -1815d53 bca13">.
0090  20 20 20 20 3c 64 61 74  61 20 63 6c 61 73 73 3d       <dat a class=
00a0  22 73 63 2e 66 72 61 6d  65 77 6f 72 6b 2e 70 6c   "sc.fram ework.pl
00b0  75 67 69 6e 73 2e 70 72  6f 74 6f 63 6f 6c 2e 4d   ugins.pr otocol.M
00c0  6f 76 65 52 65 71 75 65  73 74 22 2f 3e 0a 20 20   oveReque st"/>. 
00d0  3c 2f 72 6f 6f 6d 3e                               </room> 
Kai Wollweber
Peter-Ustinov-Schule
Eckernförde

SvenK
Beiträge: 114
Registriert: Mo 17. Okt 2011, 08:40

Re: XML bei Zuganforderung unvollständig

Beitragvon SvenK » Mo 9. Jan 2012, 08:54

Vielen Dank fuer die Ausfuehrliche Diagnose! Wir werden eine neue Version erstellen, in der die Daten mit einem Newline abgeschlossen werden.

SvenK
Beiträge: 114
Registriert: Mo 17. Okt 2011, 08:40

Re: XML bei Zuganforderung unvollständig

Beitragvon SvenK » Do 23. Feb 2012, 13:25

Es ist leider doch nicht so einfach wie vermutet, dieses Zeilenendezeichen hinzuzufuegen. Leider wird sich die Aenderung noch etwas verzoegern.