統合クライアントオブジェクト間の通信

As shown in SAMPによるテーブルと画像の送受信, the SAMPIntegratedClient class can be used to communicate with other SAMP-enabled tools such as TOPCAT, SAO DS9, or Aladin Desktop.

本節では,2つの設定方法を知る. SAMPIntegratedClient インスタンス間の通信.

まず,後述するようにSAMPハブを起動する. SAMPハブサーバの起動と停止 それがそうです。

次に、2つのクライアントを作成し、ハブに接続します:

>>> from astropy import samp
>>> client1 = samp.SAMPIntegratedClient(name="Client 1", description="Test Client 1",
...                                     metadata = {"client1.version":"0.01"})
>>> client2 = samp.SAMPIntegratedClient(name="Client 2", description="Test Client 2",
...                                     metadata = {"client2.version":"0.25"})
>>> client1.connect()
>>> client2.connect()

通知、呼び出し、または応答を受信する際に呼び出される関数を定義します:

>>> def test_receive_notification(private_key, sender_id, mtype, params, extra):
...     print("Notification:", private_key, sender_id, mtype, params, extra)

>>> def test_receive_call(private_key, sender_id, msg_id, mtype, params, extra):
...     print("Call:", private_key, sender_id, msg_id, mtype, params, extra)
...     client1.ereply(msg_id, samp.SAMP_STATUS_OK, result = {"txt": "printed"})

>>> def test_receive_response(private_key, sender_id, msg_id, response):
...     print("Response:", private_key, sender_id, msg_id, response)

クライアント1に購読しています "samp.app.*" 相関関数に結合します:

>>> client1.bind_receive_notification("samp.app.*", test_receive_notification)
>>> client1.bind_receive_call("samp.app.*", test_receive_call)

ここで、クライアント2が受信したメッセージタグを適切な関数にバインドする:

>>> client2.bind_receive_response("my-dummy-print", test_receive_response)
>>> client2.bind_receive_response("my-dummy-print-specific", test_receive_response)

今私たちはクライアントとコールバック関数をテストする準備をしています。クライアント2は、ハブを介して:“samp.app.echo”メッセージタイプを使用してすべてのクライアントに通知する。

>>> client2.enotify_all("samp.app.echo", txt="Hello world!")
['cli#2']
Notification: 0d7f4500225981c104a197c7666a8e4e cli#2 samp.app.echo {'txt':
'Hello world!'} {'host': 'antigone.lambrate.inaf.it', 'user': 'unknown'}

どのクライアントが現在受信しているかを指定する辞書を見つけることもできます samp.app.echo メッセージ::

>>> print(client2.get_subscribed_clients("samp.app.echo"))
{'cli#2': {}}

クライアント2すべての所有を呼び出す "samp.app.echo" メッセージタイプ使用 "my-dummy-print" メッセージタグとして:

>>> print(client2.call_all("my-dummy-print",
...                        {"samp.mtype": "samp.app.echo",
...                         "samp.params": {"txt": "Hello world!"}}))
{'cli#1': 'msg#1;;cli#hub;;cli#2;;my-dummy-print'}
Call: 8c8eb53178cb95e168ab17ec4eac2353 cli#2
msg#1;;cli#hub;;cli#2;;my-dummy-print samp.app.echo {'txt': 'Hello world!'}
{'host': 'antigone.lambrate.inaf.it', 'user': 'unknown'}
Response: d0a28636321948ccff45edaf40888c54 cli#1 my-dummy-print
{'samp.status': 'samp.ok', 'samp.result': {'txt': 'printed'}}

そして、クライアント2は、 "samp.app.echo" メッセージタイプ,メッセージをタグ付けする. "my-dummy-print-specific" **

>>> try:
...     print(client2.call(client1.get_public_id(),
...                        "my-dummy-print-specific",
...                        {"samp.mtype": "samp.app.echo",
...                         "samp.params": {"txt": "Hello client 1!"}}))
... except samp.SAMPProxyError as e:
...     print("Error ({0}): {1}".format(e.faultCode, e.faultString))
msg#2;;cli#hub;;cli#2;;my-dummy-print-specific
Call: 8c8eb53178cb95e168ab17ec4eac2353 cli#2
msg#2;;cli#hub;;cli#2;;my-dummy-print-specific samp.app.echo {'txt': 'Hello
Cli 1!'} {'host': 'antigone.lambrate.inaf.it', 'user': 'unknown'}
Response: d0a28636321948ccff45edaf40888c54 cli#1 my-dummy-print-specific
{'samp.status': 'samp.ok', 'samp.result': {'txt': 'printed'}}

同期呼び出しをテストするために名前の関数を定義することができます:

>>> def test_receive_sync_call(private_key, sender_id, msg_id, mtype, params, extra):
...     import time
...     print("SYNC Call:", sender_id, msg_id, mtype, params, extra)
...     time.sleep(2)
...     client1.reply(msg_id, {"samp.status": samp.SAMP_STATUS_OK,
...                            "samp.result": {"txt": "printed sync"}})

私たちは今 samp.test 送信するメッセージタイプ test_receive_sync_call **

>>> client1.bind_receive_call("samp.test", test_receive_sync_call)
>>> try:
...     # Sync call
...     print(client2.call_and_wait(client1.get_public_id(),
...                                 {"samp.mtype": "samp.test",
...                                  "samp.params": {"txt": "Hello SYNCRO client 1!"}},
...                                  "10"))
... except samp.SAMPProxyError as e:
...     # If timeout expires than a SAMPProxyError is returned
...     print("Error ({0}): {1}".format(e.faultCode, e.faultString))
SYNC Call: cli#2 msg#3;;cli#hub;;cli#2;;sampy::sync::call samp.test {'txt':
'Hello SYNCRO Cli 1!'} {'host': 'antigone.lambrate.inaf.it', 'user':
'unknown'}
{'samp.status': 'samp.ok', 'samp.result': {'txt': 'printed sync'}}

最後に、クライアントとハブの接続を終了します:

>>> client1.disconnect()
>>> client2.disconnect()