1、RPCパッケージ
RPCパッケージは、ネットワークを介してオブジェクトを導出する接続方法または他のI / Oにアクセスを提供します
この方法は、これらの基準を満たす必要があり、リモートアクセスのために使用することができ、残りは無視されます。
(1)メソッドが導出される
(2)2つのパラメータがありタイプ由来、または内蔵タイプである
(3)は、第2のパラメータの方法はポインタである
(4)インターフェイスエラーの戻り値の唯一のタイプであります
FUNC(T * T)のMethodName(argType T1、replyType * T2)エラー
前記T、T1及びT2は、パケットシーケンスの符号化/ゴブとすることができます。
パラメーターパラメーターは、発信者を提供するための方法を表し、2番目のパラメータは、呼び出し元にパラメータを表します。
それがクライアントに表示され、errors.Newが作成したメソッドの戻り値は、非nilの場合、文字列の戻り値として、となります。
それがエラーを返した場合、リターン・パラメータは、クライアントに送信されません。
コード例:
主パッケージ のインポート( "エラー" "FMT" "ログ" "NET" 、"NET / HTTP" "NET / RPCを" ) // Argsのパラメータは、 Argsの構造体{入力 A、BのINT } //商商、余りの タイプ商構造体を{ クオ、レムのINT } // ARITH算術サービス タイプARITHのINT //乗算乗算サービス FUNC(* ARITH)乗算(*引数をARGS、* INT返信){エラー *返信* = args.A args.B リターンゼロ } //分割分割サービス FUNC(* ARITH)除算(*引数をARGS、クオ商*)エラー{ args.B == 0は{IF errors.New( "ゼロ除数することはできません")を返す } クオを。クオ= args.A / args.B = args.A%args.B quo.Rem 戻りニル } //エラーチェック FUNC checkErr(ERR誤差){ IF ERR =ゼロ{! log.Fatalln(ERR) } } FUNCメイン(){ //オープンサービス ARITH。新新=(ARITH) //デフォルトのサービスオブジェクトの使用 = rpc.Register(ARITH):ERRを checkErr(ERR) //デフォルトのパス // constの( // DefaultRPCPath = "/ _goRPC_" // DefaultDebugPath = "/デバッグ/ RPC" //) rpc.HandleHTTP() //モニタ設定 ERR、LISを:= net.Listen( "TCP"、 ":1234") checkErr(ERR) ゴーhttp.Serve(LISはnil) //クライアントは、サービス要求 クライアントを、ERR:= rpc.DialHTTP( "TCP "、 ":1234") checkErr(ERR) 延期client.Close()使用閉じる() //乗算 引数:=&Argsの{A:17、B:3} VAR応答INT ERR = client.Call( "Arith.Multiply"、引数、および応答) checkErr(ERR) fmt.Printf(「Arith.Multiply:%D *%D =%D \ n」は、args.A、args.B、返信) //除法 商:=新しい(商) の呼び出し:= client.Go( "Arith.Divide"、引数、商はnil) <-call。行わ fmt.Printf( "Arith.Divide:%D /%D =%dの....%d個の\ n"、args.A、args.B、quotient.Quo、quotient.Rem) } //输出 // Arith.Multiply:17 * 3 = 51 // Arith.Divide:3分の17 = 5 .... 2
2、クライアント
2.1型のクライアントのstruct {}
クライアントのタイプは、RPCクライアントを表します。
同じクライアントが複数の呼び出しが返されていない可能性があり、それはより多くの同じ時間を離れて行くかもしれません。
2.2一般的な方法
(1)FUNC NEWCLIENT(CONN io.ReadWriteCloser)*クライアント
NEWCLIENTは、もう一方の端に接続されたサービスに対する要求を管理するために、新しいクライアントを返します。
(2)FUNCダイヤル(ネットワーク、アドレスの文字列)(*クライアント、エラー)
指定されたネットワークアドレスとRPCサーバーに接続されてダイヤルします。
(3)FUNC DialHTTP(ネットワーク、アドレスの文字列)(*クライアント、エラー)
デフォルトのパスHTTPのRPCで指定されたネットワークとアドレスに接続DialHTTPは、HTTPのRPCサーバーをリッスンします。
(4)FUNCのDialHTTPPath(ネットワークアドレス、パス文字列)(*クライアント、エラー)
指定されたネットワークアドレスとHTTPのRPCサーバーに接続されているパスにDialHTTPPath。
(5)FUNC(クライアント*クライアント)コール(serviceMethod列、引数インタフェース{}、{}インタフェース返信)エラー
その後、エラーステータスの実行を返し、結果は返事を書かされ、コールリターンを待って、指定したメソッドを呼び出して呼び出します。
(6)FUNC(クライアント*クライアント)ゴー(serviceMethod列、引数インタフェース{}、{}インタフェースを返信、チャン*コール行わ)*コール
非同期関数呼び出しを移動します。本構造型コールの戻り値の方法は、二次リモート呼び出しへのポインタを表します。
パラメータの種類は、この呼び出しの完了時に(この方法は戻り値を返しを通して移動)チャネル信号を行われます。
行わがnilであると、ゴーは(フィールドの完了、戻り値を書き込む)新しいチャネルのために適用されます。非nilの行われていれば、行ってバッファを持たなければならない、または移動方法は、意図的にクラッシュします。
(7)FUNC(クライアント*クライアント)閉じる()エラー
クライアントを閉じます。
3、サーバー
3.1型サーバーのstruct {}
RPCパッケージは提供し、デフォルトのサービスオブジェクトを使用して直接することができ、「RPC。」。
3.2、一般的な方法
(1)NEWSERVER()*サーバFUNC
作成し、*サーバーを返します。
(2)FUNC(サーバ*サーバ)レジスタ(RCVRインターフェイス{})エラー
登録サービス。
この方法は、RCVR値派生型がない場合、またはタイプが要件を満たしていない場合、登録はエラーを返します。
登録はまた、ログに書き込まれたログのパケットエラーを使用しています。
クライアントは、タイプがRCVRの一種で、特にフォーマット「Type.Method」の文字列のアクセス方法を、使用することができます。
(3)FUNC(サーバ*サーバ)RegisterName(名前ストリング、RCVRインタフェース{})エラー
同様の登録をRegisterNameが、代わりにサービス名などの特定の型の名前RCVR提供された名前を使用します。
(4)FUNC(サーバー*サーバーが)受け入れ(net.Listener LIS)
Lリスナー受信機が接続し、各接続サービスを取得受け入れます。
別のスレッドを開く必要があり、呼び出し元をブロックします受け入れます。
(http.ResponseWriter、REQ * http.Requestワット)(5)FUNC(サーバー*サーバー)ServeHTTP
ServeHTTPはhttp.HandlerはRPC要求に応えるインターフェイスを実装します。
(6)FUNC(サーバー*サーバー)HandleHTTP(rpcPath、debugPath文字列)
HTTPハンドラrpcPathに対応するRPCサーバ登録情報をHandleHTTP、登録されたHTTPサーバプロセッサのデバッグ情報がdebugPathに相当します。
HandleHTTPはhttp.DefaultServeMuxに登録されます。その後、まだ我々はhttp.Serve()を呼び出す必要があり、通常は別のスレッドを開いて、「(L、ゼロhttp.Serveを行きます )」