next up previous contents
Nächste Seite: Funktionen zur Bewegung auf Aufwärts: Die Implementierung Vorherige Seite: Grundstruktur   Inhalt

Netzwerkfunktionen

Lange Zeit war es nicht möglich, unter Emacs direkt Netzwerkfunktionalität zu verwenden. Emacs Lisp kann seit Emacs 19 TCP-Verbindungen verwenden. Zum Verständnis von den Netzwerkfunktionen ist es nötig, von Emacs Lisp erzeugte und verwaltete Prozesse zu verstehen. Ein Prozess ist ein Raum, in welchem ein Programm ausgeführt wird. Emacs läuft in einem Prozess. Elisp-Programme können Kindprozesse erzeugen. Es existieren synchrone und asynchrone Prozess. Wird ein synchroner Prozess erzeugt, wartet das Lisp-Programm auf das Beenden dieses Prozesses, bevor es mit der Ausführung fortfährt. Asynchrone Prozesse können parallel zu dem erzeugenden Lisp-Programm laufen.

Eingabe an Prozesse geschieht durch spezielle Elisp-Funktionen, zum Beispiel process-send-string. Es gibt zwei Wege, um die Ausgabe, die ein Prozess auf seine Standardausgabe schreibt, zu empfangen. Die Ausgabe kann in einen Buffer eingefügt werden, oder eine Funktion kann aufgerufen werden, welche mit der Ausgabe Operationen ausführt.

Die Filterfunktion eines Prozesses ist eine Funktion, welche die Standardausgabe des zugehörigen Prozesses empfängt. Wenn ein Prozess einen Filter besitzt, wird jede Ausgabe des Prozess an die Filterfunktion übergeben. Eine Filterfunktion akzeptiert zwei Argumente: den assoziierten Prozess und den empfangenen String. Die Filterfunktion hat dann die Möglichkeit, beliebiges mit den empfangenen Daten zu tun.

Eine Netzwerkverbindung in Emacs Lisp verhält sich wie ein Kindprozess und wird auch durch ein Prozessobjekt repräsentiert. Da die Netzwerkverbindung aber kein echter Kindprozess ist, kann man ihm keine Signale schicken oder ihn killen5, sondern nur Daten von ihm empfangen oder senden.[3]

Abbildung 4: Herstellen einer Verbindung zum Phutball Server. phutball-server und phutball-port sind globale Variablen, die beim Start des Major Modes gesetzt werden.
\begin{figure}\small\begin{verbatim}(defun phutball-filter (proc string)
...
...
...end-position))
(insert ''\nOK\n'')))
...)\end{verbatim}\normalsize\end{figure}

Der Phutball-Major-Mode realisiert die Netzwerkkommunikation durch eine TCP-Verbindung mit einer Filterfunktion, welche das Protokoll des Phutball-Spielservers wie in Kapitel 1.5 implementiert. Das Erzeugen der Verbindung ist in Abbildung 4 dargestellt.

Abbildung 5: Auszug aus der Filterfunktion
\begin{figure}\small\begin{verbatim}(defun phutball-goto-xy (x y)
\lq\lq Move poin...
... (- (* (+ 1 x) phutball-square-width)
1)))\end{verbatim}\normalsize\end{figure}

Die Filterfunktion fügt den empfangenen Text erst in einen temporären Buffer ein, und führt noch einige syntaktische Operationen auf den empfangenen Daten durch, wie das entfernen von Leerzeichen und von Kommentaren. Der Grund, warum die Daten nicht sofort verarbeitet werden können liegen darin, dass die Daten nicht zeilenweise ankommen, sondern, da sie über ein Netzwerk übertragen werden, in beliebig kleinen Teilen. In dem Buffer werden aus diesen Teilen ganze Kommandos erzeugt, die dann verarbeitet werden können. Einen Auszug stellt die Abbildung 5 dar. In dem Buffer wird nach Dein_Gegner_ist gesucht, und dann der Name des Gegners kopiert und die Variable phutball-opponent-name gesetzt. Anschliessend wird dem Spielserver mit OK das Kommando bestätigt.


next up previous contents
Nächste Seite: Funktionen zur Bewegung auf Aufwärts: Die Implementierung Vorherige Seite: Grundstruktur   Inhalt
Robert Hoehndorf 2002-08-22