Programmierung » ClassPad 300 » Basic » Multi-Player

Multi-Player

(Tutorial)

In diesem Tutorial geht es darum einige grundlegende Dinge, die bei Programmen, die auf zwei ClassPads laufen und mit einander kommunizieren, zu erklären.

Protokoll

Als erstes sollte ein "Protokoll" vereinbart werden. Protokoll ist nicht ganz richtig, denn man schickt ja immer nur Zeichenketten (mit definiertem Inhalt) hin und her. Richtiger wäre etwas wie: Definition des Sprachumfanges, doch das würde den Rahmen einer Überschrift sprengen.

Genug der Worte, lasst uns beginnen. Wie das Protokoll im eizelnen aussieht kann ich nicht sagen, da es von Fall zu Fall verschieden ist. Hier geht es auch nicht darum das was, sondern das wie zu vermitteln.
Eines, was das Protokoll aber haben sollte ist ein Wort für die Synchronität (angebracht ist "sync" oder "rdy")

Hand-Shake

Einen Hand-Shake auszuführen und am Anfang auszumachen, wer zuerst sendet, ist auf den ersten Blick eine gute Idee. Wenn man aber genauer darüber nachdenkt, kommt man zu dem Schluss, dass es doch nicht so gut ist. die Festlegung der Rollen klappt nur solange, wie der "Empfänger" (der ClassPad, der zuerst auf empfang geht) auch zuerst auf Empfang geht.

ClassPad 1 Komm. ClassPad 2


OpenComPort38k

'Handshake
'sendet als 1.

"sync"s
SendVar38k s
GetVar38k g

CloseComPort38k





->
->
->
->
<-
<-
OpenComPort38k

'Hand-Shake
'sendet als 2.

GetVar38k g



"sync"s
SendVar38k s

CloseComPort38k

Anders sieht das Ganze aber aus, wenn der Sender zuerst sendet und gleich darauf auf Empfang geht, dann stecken beide Programme im Empfang fest und warten auf den anderen, es kommt jedoch nichts:

ClassPad 1 Komm. ClassPad 2
OpenComPort38k

'Handshake
'sendet als 1.

"sync"s
SendVar38k s
GetVar38k g
'die Programme
'hängen fest






->|
<-
<- ->
<- ->
.
.
.



OpenComPort38k

'Hand-Shake
'sendet als 2.

GetVar38k g
'die Programme
'hängen fest

Das heißt aber nicht, das Hand-Shakes in den Programmen generell nicht sinnvoll sind (Nur das Tauschen von senden und empfangen ist nicht sinnvoll)!

Synchronität

Synchronität heißt beide Programme (auf beiden Rechnern) sind zum selben Zeitpunkt an der selben Stelle. Dies ist besonders dann notwendig, wenn zum Beispiel beide (oder einer der) Nutzer Eingaben machen müssen und es nach der Eingabe notwendig ist Daten - welcher Art auch immer - auszutauschen. Doch 100% Synchronität kann man nie herstellen, denn der Code der dieses bewerkstelligen soll produziert selbst Insynchronität. Diese ist aber bedeutend weniger gravierend wie ohne den Code.
Wenn es nicht erforderlich ist, zu wissen wo das Programm ist (oder ist durch den Aufbau des Programmes festgelegt ist), reicht eine einfache Synchronisatition aus (Die grün markierten Bereiche sind nicht unbedingt notwendig, verbessern aber das Verhalten):

ClassPad 1 Komm. ClassPad 2
OpenComPort38k

'anderer Porgramm-Code
'ab hier insync

"sync"s
SendVar38k s
GetVar38k g


StrCmp g,s,t
If t=0
Then
StrJoin s,"x",s
SendVar38k s
StrCmp g,s,t
Else
'Kommunikations-Fehler
Stop
IfEnd
'ab hier besser sync

CloseComPort38k






->|
<-
<-
<-
->
->
->
->
->



OpenComPort38k

'anderer Porgramm-Code
'ab hier insync

"sync"s
SendVar38k s
GetVar38k g




StrCmp g,s,t
If t=0
Then
StrJoin s,"x",s
SendVar38k s
StrCmp g,s,t
Else
'Kommunikations-Fehler
Stop
IfEnd
'ab hier besser sync

CloseComPort38k

Wenn nun aber ein Programm mit seinem Partner Daten in einer Bestimmten Reihenfolge austauschen soll, dann reicht dies nicht mehr aus. (Es also mehrere Stellen mit Synchronisierung gibt/geben soll.) Eine einfache Lösung des Problems ist das Anhängen von Nummern an das Sync-Wort (z.B. "sync:1", "sync1", o.ä.).
Dann entsteht u.U. ein anderes Problem: Das Programm kann nicht nach einem Abbruch fortgesetzt werden, weil dann das Programm, welches noch läuft, ein anderes Wort erwartet als das neu gestartete Programm liefert. In diesem Fall gibt es zwei grundsätzliche Wege: Der Nutzer entscheidet, wie fortgesetzt wird (was nicht so gut ist - im Schlimmsten Fall läuft nichts und der Nutzer probiert evtl.) oder man testet das Erhaltene auf die verwendeten Sync-Wörter und springt dann zu der entsprechenden Stelle oder ruft das Entsprechende Programm auf:

"sync1"s
SendVar38k s
GetVar38k g

StrCmp "sync1",g,t
If t=0
Then
SendVar38k s
IfEnd
StrCmp "sync2",g,t
If t=0
Then
SendVar38k s
IfEnd 
StrCmp "sync3",g,t
If t=0
Then
SendVar38k s
Else
'Komm-Fehler
IfEnd
Lbl A

'Code

"sync2"s
SendVar38k s
GetVar38k g

StrCmp "sync1",g,t
If t=0
Then
"sync1"s
SendVar38k s
Goto A
IfEnd
StrCmp "sync2",g,t
If t=0
Then
SendVar38k s
Goto B
IfEnd
StrCmp "sync3",g,t
If t=0
Then
SendVar38k s
Else
'Komm-Fehler
IfEnd
Lbl B

'Code

"sync3"s
SendVar38k s
GetVar38k g

StrCmp "sync1",g,t
If t=0
Then
"sync1"s
SendVar38k s
Goto A
IfEnd
StrCmp "sync2",g,t
If t=0
Then
"sync2"s
SendVar38k s
Goto B
IfEnd
StrCmp "sync3",g,t
If t=0
Then
SendVar38k s
Else
'Komm-Fehler
IfEnd
Lbl C

'Code