サーバ・コード
地元へのコードクローンは、適切な環境(乗り心地がここに示されていないか、良い乗り心地、HA)の設定
、一般的なライブラリーは、最初のmain.pyファイルを見て、デバッグモードで実行を開始します
tornado.ioloopとは接触を始めていない、ビット偏った下、頭痛、または給油はそれを行います
この事前知識がポイントを理解する前に、ioloopの下で最初の、それのいくつかの知識をより詳細のいくつかを理解するために
、ファイルディスクリプタ
ファイルディスクリプタに基づいて実装ioloop、その後のepollは何ですか?epollは、大量の文書を処理するために、Linuxカーネルが記述され
た文字を、改善の世論調査を行いました。その世論調査は何ですか?まず、私たちは、見つけるときに我々は何の完成がないクライアントの接続情報を知っていない時点で、通信するための接続と通信(コネクション)を確立した後、サーバソケット通信、それは受け入れるとき(受け入れます)。この時点で2つのオプションがあります。
- ここでは、送信の終わりまで滞在し、データを受信します。
-
データがない場合は、定期的に確認してください。
まず、複数の接続よりも良い第二のアプローチはしませんでしたあそこに行く順番に一定の期間内に統一することができ
ルックスが複数の接続を処理することができ、読み書きするデータを持って、この方法は/選択ソリューションをポーリングすることですプログラム。問題を解決するようだが、実際には、より多くの接続として、ポーリングがかかる
ソケットサーバー接続が主にアクティブではありませんが、長くなりますし、長い時間を、ので、ポーリングのほとんどはかかる
時間をそれは無用になります。この問題を解決するために、ファイルディスクリプタは、概念とそのポーリングに似て作成されますが、それぞれの時間は、世論調査では、彼は唯一のデータポーリングアクティブなソケットを選択する必要がありますので、接続するときは、ポーリング多数の多くが保存されます時間。
操作のepollについては、実際には、非常に単純な、限り4つのAPIとしてそれを完全に操作することができます。
epoll_create
epollディスクリプタを作成するには(つまり、ファイルディスクリプタを作成します)
epoll_ctl
操作のepollイベント、利用可能なパラメータは以下のとおりです。
パラメータ | 意味 |
---|---|
EPOLL_CTL_ADD | 新しいのepollイベントを追加 |
EPOLL_CTL_DEL | epollイベントを削除するには |
EPOLL_CTL_MOD | イベントリスナーの方法を変更 |
モードを聞いているときがあり7つのイベントがありますが、我々はそれらの3を心配する必要があります。
マクロ定義 | 意味 |
---|---|
EPOLLIN | フルバッファ、データが読み込まれます |
EPOLLOUT | 空、書き込み可能なデータをバッファ |
EPOLLERR | エラーが発生しました |
イベントがepoll_wait
作業するファイルディスクリプタを作ることです、ゼロ以外の正の整数を設定するときの引数が、タイムアウトがある、(ブロッキング)タイムアウト秒をリッスン; 0はあなたが-1に耳を傾けてきたが、すぐに返すように設定されています。
アクティブなデータ接続があるとき(ここではソケットファイルハンドル)を聴いたときには、アクティブなファイルのリストにハンドルを返します。
閉じる
閉じるのepoll
今のepollをざっと見てみると、私たちはコードを理解するために来ることができるioloop
二ioloop.pyファイル
ioloopは、それが彼の下で、竜巻の鍵となります。
ioloopが単一の実施形態を実装するI / O多重パッケージであり、本実施形態はIOLoop._instanceに単一に記憶されている
二つの主要な点を有します。設定可能なメカニズム、つまり、サイクルのepollです
2.1インスタンスの作成IOLoop
IOLoopは、直接のサブクラスの下に配置されている:ビューIOLoop、そのスーパークラスが設定可能なクラスであり、それは言うことです
クラスIOLoop(設定可能):
......
設定可能なクラスと併せて説明することはここでは必要:
設定可能な新しい方法で
1 「クラスオブジェクト実行」第1の構成例即時のサブクラス、クラスメソッドが呼び出され、戻りはIMPLに割り当てられconfigurable_default。
2.2のepoll
コード上で、)(スタートから始めて、結果的に言うことはありません
asyncio.get_event_loop()メソッドは、内側ループに彼がコルーチンにパラメータとしてコルーチンループ伝達関数を取得する必要がないこと
この方法は、新しいスレッドが、それがなければならない場合new_event_loopで新しいループを得るために)、同じスレッドで有効になり(、及びset_event_loop(ループによって)糸のループに設定する()get_event_loop注意。
(一時的にここまで、トピックを放浪、恥ずかしい)
継続
)(IOLoop.currentを開始main.pyファイルを実行する。Run_sync(async_main)がやっています
コール・パラメータを追加するIOLoop機能run_sync方法、これは理解しやすいです。
(ここでは一時的に不在で、深い恐れといった広い、記録yiが継続する時間を持っています)
非同期(コルーチン構文)
力に、新しいものを使い続けるには、これはpython3.5非同期を提供し、asyncioの新しい構文を待っている
コルーチンをよりよく理解するために、一例として、これを見てすることができます知ってほしいHTTPSを:// zhuanlan .zhihu.com / P / 25228075
注:非同期キーワードもコルーチン(コルーチン)、コルーチンオブジェクトを定義します。コルーチン直接、イベントループ(ループ)に加え同時駆動する必要を実行しない、後者によって適切な時間にコルーチンを呼び出します。
非同期DEF async_main(定義された非同期関数)
三つは、コードを見ていき、それ
#DEFINE非同期関数
非同期DEFのasync_main(): #解析対象を確立ArgumentParser formatter_class:リセットし、ヘルプ情報出力形式の パーサ = argparse.ArgumentParser( formatter_class = argparse.ArgumentDefaultsHelpFormatter) #は、アプリケーションのためのオプションを使用してパラメータを追加するには - オプションのパラメータは、デフォルトのデフォルトパラメータであります値 parser.add_argument( ' -s '、' --server '、デフォルト = ' localhostを:4000 '、=ヘルプ' サーバーアドレス' ) #アクションパラメータの処理方法の parser.add_argumentを( "リモート--allow "アクションは= " store_trueと"ヘルプ= " リモートデバイスを接続可能" ) parser.add_argument( ' -t '、' --test '、アクションは= " store_trueと"ヘルプ= " ランテストコード」) #タイプ参数的数据类型 parser.add_argument( ' -p '、' --port '、タイプ= int型、デフォルト = 3500、ヘルプ= "ポート聞く" ) parser.add_argument(" --owner "、タイプ= strのを助ける= " プロバイダの所有者の電子メール" ) parser.add_argument( " --ownerファイルは"、タイプ= argparse.FileTypeは(" R ")、助けます= 「ファイルからプロバイダの所有者の電子メール」)
3.1通話のparse_args()
オブジェクト保存ArgumentParserコマンドラインパラメータを解決するには、次の対応するデータ型にコマンドライン引数を解析し、適切な行動を取る、それがNamespaceオブジェクトを返します。
引数= parser.parse_args()
接続待ちの3.2 heartbeat_connect
ここで直接実行されます
その理由は何ですか、それはローカルホストに接続する必要が見るために簡単なはず:4000を、サービス、よく、実行rethinkdbデータベースを果たし、その後、ATX-server2のを開始しませんでした
さて、その後、実行します
3.3)(make_appを入力
tornado.web.Applicationを使用して制御をルーティング
3.4 heartbeat_connect去连接设备,这里可以看到过程中基本都是异步方法aysc,运行到_connect这个方法时:
async def _connect(self): ws = await websocket.websocket_connect(self._server_ws_url) ws.__class__ = SafeWebSocket await ws.write_message({ "command": "handshake", "name": self._name, "owner": self._owner, "secret": self._secret, "url": self._provider_url, "priority": self._priority, # the large the importanter })
发现通过websockt 服务来连接
3.5 hbc.open()
IOLoop.current().spawn_callback(coroutine_visit) #开始调用协程
3.6 device_watch()
開始使用adb進行監控 127.0.0.1:5037 这里就不再说name多了
_init_binaries() 这里刚开始获取了设备信息] [设备名] [sdk: 28, abi: arm64-v8a, abis: ['arm64-v8a', 'armeabi-v7a', 'armeabi']
根据设备选择要使用的atx 代理use atx-agent: atx-agent-armv7
3.7 _install_apk()安装whatsInput 和ATX这里只看这两个,另一个属于测试包
这里手机初始化准备好后会向前端页面发送
websocket send: {'udid': '2d869e6', 'platform': 'android', 'colding': False, 'provider': {'atxAgentAddress': '127.0.0.1:20001', 'remoteConnectAddress': 'Ip:20004',
'whatsInputAddress': '127.0.0.1:20003'}, 'properties': {'serial': '设备名', 'brand': 'Xiaomi', 'version': '9', 'model': 'MI 9', 'name': 'MI 9'}, 'command': 'update'}
暂时写到这里吧,明天有时间看下atx-server2的部分代码,觉得结合着看更方便去了解
目前还在学习中,希望会对大家有所帮助,觉得不错,就点赞支持一下。 另外,有什么错误的地方需要大家指正。谢谢!