Dies ist ein Dokument, das verzweifelt existieren muss, aber die Implementierung des Wire-Protokolls ist in einem single object implementiert, so dass es nicht zu schwer sein sollte, von dort zu grok. Die message spec doc, die Sie verlinkt haben, deckt den Inhalt der Anwendungsebene jedes Feldes ab, aber nicht, wie es tatsächlich über zeromq serialisiert wird. Angenommen, Sie haben eine Nachricht, wie in diesem Dokument beschrieben, ist das Kabelformat ziemlich einfach. Es ist ein mehrteiliger zeromq Nachricht von mindestens sechs Teilen:
- Die führenden Nachrichtenteile sind die zeromq Routing-Identitäten (Null-to-many)
- diese durch eine Delimiter-Nachricht gefolgt werden, wobei die Bytes
<IDS|MSG>
- die HMAC
digest
der Nachricht (eine leere Zeichenfolge, wenn die Authentifizierung ''
deaktiviert)
header
parent_header
metadata
content
header
, parent_header
, metadata
und content
alle sind in der Messaging-doc beschrieben - diese Wörterbücher sind, und serialisiert Bytes mit dem, was Serialisierung zurzeit verwendet wird. Der Standard in IPython ist utf8-codiertes JSON, aber willkürliche Serialisierung ist erlaubt (msgpack ist der häufigste Nicht-Standard). Noch nicht in der Dokumentation beschrieben ist die digest
, die für die Authentifizierung verwendet wird. Dies ist ein MD5 HMAC Digest der Nachricht. Der Schlüssel für den Digest befindet sich im Feld key
der Verbindungsdatei. Die vom HMAC-Digest verwendete "Nachricht" ist die Verkettung der Bytes des serialisierten Headers, des übergeordneten Headers, der Metadaten und des Inhalts in derselben Reihenfolge, die über die Verbindung gesendet wird.
Sie können durch die Angabe des Konfigurationswertes Nachrichtensignierung deaktivieren
Session.key = ''
die IPython bezogenen Teile des Codes, in welchem Fall das Digest Feld wird immer ''
eine leere Zeichenfolge sein. Ich würde empfehlen, dies zu tun, während Sie beginnen, damit Sie die interessanteren Teile der Implementierung zuerst ausarbeiten können.
Hier sind eine Beispiel-Ausführungsanforderung und ihre Antwort tatsächlich von IPython gesendet.
Die Anfrage:
[
<IDS|MSG>
6ea6b213262402cc1ad3c1d3e342a9f6
{"date":"2013-04-27T23:22:13.522049","username":"minrk","session":"5b03b89a-93c9-4113-bb85-17ba57233711","msg_id":"c6d0f85e-fc25-4f1e-84e1-3d706b615393","msg_type":"execute_request"}
{}
{}
{"user_variables":[],"code":"1\n","silent":false,"allow_stdin":true,"store_history":true,"user_expressions":{}}
]
und seine Antwort:
[
5b03b89a-93c9-4113-bb85-17ba57233711
<IDS|MSG>
47d1052f6e8f333d18480938ca91719b
{"date":"2013-04-27T23:22:13.528239","username":"kernel","session":"d7eb303b-d2d0-4723-aef2-738545a8da11","msg_id":"9ed1d332-398c-4132-b203-1e7bf8fed712","msg_type":"execute_reply"}
{"date":"2013-04-27T23:22:13.522049","username":"minrk","session":"5b03b89a-93c9-4113-bb85-17ba57233711","msg_id":"c6d0f85e-fc25-4f1e-84e1-3d706b615393","msg_type":"execute_request"}
{"dependencies_met":true,"engine":"645fb29f-37ab-40c9-bc01-b7fbfe3c2112","status":"ok","started":"2013-04-27T23:22:13.524114"}
{"status":"ok","execution_count":2,"user_variables":{},"payload":[],"user_expressions":{}}
]
Es gibt einen Blog-Post, die zu dieser Frage verknüpft, die beschreibt, wie eine ipython kernel http implementieren: // Stackoverflow. com/questions/16240747/sending-messages-from-other-sprachen-zu-einem-ipython-kernel – dirceusemighini
http://andrew.gibiansky.com/blog/ipython/ipython-kernels/ ist worüber @dirceusemighini spricht. –