私の知る限り、デフォルト サーバーのどこかからアドレスを取得することはできません。
リクエスト受信関数を呼び出すサービスコールメソッドでは、コーデックに格納されたリモートデータへのアクセスは提供されません。
http ハンドラーを 2 回登録できる場合 (これはできませんDefaultRPCPath
)、 HTTP ハンドラー セットアップの を で上書きした可能性がありますHandleHTTP
。しかし、今日ではそれは不可能です。
大騒ぎせずにできることは、独自のServeHTTP
方法でデフォルトの RPC サーバーに基づいて RPC サーバーを構築することです。
import (
"log"
"net"
"net/http"
"net/rpc"
)
type myRPCServer struct {
*rpc.Server
}
func (r *myRPCServer) ServeHTTP(w http.ResponseWriter, req *http.Request) {
log.Println(req.RemoteAddr)
r.Server.ServeHTTP(w, req)
}
func (r *myRPCServer) HandleHTTP(rpcPath, debugPath string) {
http.Handle(rpcPath, r)
}
func main() {
srv := &myRPCServer{rpc.NewServer()}
srv.HandleHTTP(rpc.DefaultRPCPath, rpc.DefaultDebugPath)
// ...http listen code...
}
もちろん、これの欠点は、もう使用できないことですrpc.Register
。あなたは書く必要がありますsrv.Register
。
編集:自分HandleHTTP
でも書く必要があることを忘れていました。この理由は、RPC サーバーを埋め込んで記述srv.HandleHTTP
した場合、組み込みインスタンスで呼び出され、組み込みインスタンスを に渡し、http.Handle()
独自の の定義を無視するためですServeHTTP
。これには、サーバーがアクセスできないプライベート デバッグ ハンドラ( ) をHandleHTTP
使用するため、デバッグ パスを使用して RPC サーバーをデバッグすることができないという欠点があります。rpc.debugHTTP