direktori cari
archive archive/tar archive/zip bufio bufio(缓存) builtin builtin(内置包) bytes bytes(包字节) compress compress/bzip2(压缩/bzip2) compress/flate(压缩/flate) compress/gzip(压缩/gzip) compress/lzw(压缩/lzw) compress/zlib(压缩/zlib) container container/heap(容器数据结构heap) container/list(容器数据结构list) container/ring(容器数据结构ring) context context(上下文) crypto crypto(加密) crypto/aes(加密/aes) crypto/cipher(加密/cipher) crypto/des(加密/des) crypto/dsa(加密/dsa) crypto/ecdsa(加密/ecdsa) crypto/elliptic(加密/elliptic) crypto/hmac(加密/hmac) crypto/md5(加密/md5) crypto/rand(加密/rand) crypto/rc4(加密/rc4) crypto/rsa(加密/rsa) crypto/sha1(加密/sha1) crypto/sha256(加密/sha256) crypto/sha512(加密/sha512) crypto/subtle(加密/subtle) crypto/tls(加密/tls) crypto/x509(加密/x509) crypto/x509/pkix(加密/x509/pkix) database database/sql(数据库/sql) database/sql/driver(数据库/sql/driver) debug debug/dwarf(调试/dwarf) debug/elf(调试/elf) debug/gosym(调试/gosym) debug/macho(调试/macho) debug/pe(调试/pe) debug/plan9obj(调试/plan9obj) encoding encoding(编码) encoding/ascii85(编码/ascii85) encoding/asn1(编码/asn1) encoding/base32(编码/base32) encoding/base64(编码/base64) encoding/binary(编码/binary) encoding/csv(编码/csv) encoding/gob(编码/gob) encoding/hex(编码/hex) encoding/json(编码/json) encoding/pem(编码/pem) encoding/xml(编码/xml) errors errors(错误) expvar expvar flag flag(命令行参数解析flag包) fmt fmt go go/ast(抽象语法树) go/build go/constant(常量) go/doc(文档) go/format(格式) go/importer go/parser go/printer go/scanner(扫描仪) go/token(令牌) go/types(类型) hash hash(散列) hash/adler32 hash/crc32 hash/crc64 hash/fnv html html html/template(模板) image image(图像) image/color(颜色) image/color/palette(调色板) image/draw(绘图) image/gif image/jpeg image/png index index/suffixarray io io io/ioutil log log log/syslog(日志系统) math math math/big math/big math/bits math/bits math/cmplx math/cmplx math/rand math/rand mime mime mime/multipart(多部分) mime/quotedprintable net net net/http net/http net/http/cgi net/http/cookiejar net/http/fcgi net/http/httptest net/http/httptrace net/http/httputil net/http/internal net/http/pprof net/mail net/mail net/rpc net/rpc net/rpc/jsonrpc net/smtp net/smtp net/textproto net/textproto net/url net/url os os os/exec os/signal os/user path path path/filepath(文件路径) plugin plugin(插件) reflect reflect(反射) regexp regexp(正则表达式) regexp/syntax runtime runtime(运行时) runtime/debug(调试) runtime/internal/sys runtime/pprof runtime/race(竞争) runtime/trace(执行追踪器) sort sort(排序算法) strconv strconv(转换) strings strings(字符串) sync sync(同步) sync/atomic(原子操作) syscall syscall(系统调用) testing testing(测试) testing/iotest testing/quick text text/scanner(扫描文本) text/tabwriter text/template(定义模板) text/template/parse time time(时间戳) unicode unicode unicode/utf16 unicode/utf8 unsafe unsafe
watak

  • import "net/rpc"

  • 概况

  • 索引

  • 子目录

概况

软件包 rpc 通过网络或其他 I/O 连接提供对对象的导出方法的访问。服务器注册一个对象,使其作为一个服务显示为对象类型的名称。注册后,对象的导出方法将可以远程访问。服务器可以注册多个不同类型的对象(服务),但注册多个相同类型的对象是错误的。

只有符合这些标准的方法才能用于远程访问; 其他方法将被忽略:

- the method's type is exported.- the method is exported.- the method has two arguments, both exported (or builtin) types.- the method's second argument is a pointer.- the method has return type error.

实际上,该方法必须看起来像

func (t *T) MethodName(argType T1, replyType *T2) error

T1 和 T2 可以通过 encoding/gob 进行编组。即使使用不同的编解码器,这些要求也适用。(将来,这些要求可能会因为自定义编解码器而变差。)

该方法的第一个参数表示由调用者提供的参数; 第二个参数表示要返回给调用者的结果参数。如果非零,方法的返回值作为客户端看到的字符串传回,就像由 errors.New 创建的那样。如果返回错误,答复参数将不会被发送回客户端。

服务器可以通过调用 ServeConn 来处理单个连接上的请求。更典型的是,它将创建一个网络监听器并调用 Accept,或者对于 HTTP 监听器 HandleHTTP 和 http.Serve 。

客户希望使用该服务建立连接,然后在连接上调用 NewClient 。便捷功能 Dial(DialHTTP)执行原始网络连接(HTTP 连接)的两个步骤。生成的 Client 对象具有 Call 和 Go 两个方法,它们指定要调用的服务和方法,包含参数的指针以及用于接收结果参数的指针。

Call 方法等待远程调用完成,而 Go 方法异步启动调用,并使用 Call 结构的完成通道发送完成信号。

除非设置了明确的编解码器,否则使用包 encoding / gob 传输数据。

这是一个简单的例子。服务器希望导出 Arith 类型的对象:

package serverimport "errors"type Args struct {
	A, B int}type Quotient struct {
	Quo, Rem int}type Arith intfunc (t *Arith) Multiply(args *Args, reply *int) error {*reply = args.A * args.Breturn nil}func (t *Arith) Divide(args *Args, quo *Quotient) error {if args.B == 0 {return errors.New("divide by zero")}
	quo.Quo = args.A / args.B
	quo.Rem = args.A % args.Breturn nil}

服务器调用(对于 HTTP 服务):

arith := new(Arith)rpc.Register(arith)rpc.HandleHTTP()l, e := net.Listen("tcp", ":1234")if e != nil {
	log.Fatal("listen error:", e)}go http.Serve(l, nil)

此时,客户可以使用“Arith.Multiply”和“Arith.Divide”方法查看“Arith”服务。要调用它,客户端首先拨打服务器:

client, err := rpc.DialHTTP("tcp", serverAddress + ":1234")if err != nil {
	log.Fatal("dialing:", err)}

然后它可以进行远程调用:

// Synchronous callargs := &server.Args{7,8}var reply int
err = client.Call("Arith.Multiply", args, &reply)if err != nil {
	log.Fatal("arith error:", err)}fmt.Printf("Arith: %d*%d=%d", args.A, args.B, reply)

// Asynchronous callquotient := new(Quotient)divCall := client.Go("Arith.Divide", args, quotient, nil)replyCall := <-divCall.Done// will be equal to divCall// check errors, print, etc.

服务器实现通常会为客户端提供一个简单的,类型安全的包装器。

net / rpc 软件包被冻结,不接受新的功能。

索引

  • 常量

  • 变量

  • func Accept(lis net.Listener)

  • func HandleHTTP()

  • func Register(rcvr interface{}) error

  • func RegisterName(name string, rcvr interface{}) error

  • func ServeCodec(codec ServerCodec)

  • func ServeConn(conn io.ReadWriteCloser)

  • func ServeRequest(codec ServerCodec) error

  • type Call

  • type Client

  • func Dial(network, address string) (*Client, error)

  • func DialHTTP(network, address string) (*Client, error)

  • func DialHTTPPath(network, address, path string) (*Client, error)

  • func NewClient(conn io.ReadWriteCloser) *Client

  • func NewClientWithCodec(codec ClientCodec) *Client

  • func (client *Client) Call(serviceMethod string, args interface{}, reply interface{}) error

  • func (client *Client) Close() error

  • func (client *Client) Go(serviceMethod string, args interface{}, reply interface{}, done chan *Call) *Call

  • type ClientCodec

  • type Request

  • type Response

  • type Server

  • func NewServer() *Server

  • func (server *Server) Accept(lis net.Listener)

  • func (server *Server) HandleHTTP(rpcPath, debugPath string)

  • func (server *Server) Register(rcvr interface{}) error

  • func (server *Server) RegisterName(name string, rcvr interface{}) error

  • func (server *Server) ServeCodec(codec ServerCodec)

  • func (server *Server) ServeConn(conn io.ReadWriteCloser)

  • func (server *Server) ServeHTTP(w http.ResponseWriter, req *http.Request)

  • func (server *Server) ServeRequest(codec ServerCodec) error

  • type ServerCodec

  • type ServerError

  • func (e ServerError) Error() string

包文件

client.go debug.go server.go

常量

const (        // Defaults used by HandleHTTP
        DefaultRPCPath   = "/_goRPC_"
        DefaultDebugPath = "/debug/rpc")

变量

DefaultServer 是 * Server 的默认实例。

var DefaultServer = NewServer()
var ErrShutdown = errors.New("connection is shut down")

func Accept

func Accept(lis net.Listener)

Accept 接受监听器上的连接,并为每个传入连接向 DefaultServer 提供请求。接受块; 调用者通常在 go 语句中调用它。

func HandleHTTP

func HandleHTTP()

HandleHTTP 在 DefaultRPCPath 上向 DefaultServer 注册 RPC 消息的 HTTP 处理程序,并在 DefaultDebugPath 上注册一个调试处理程序。仍然需要调用 http.Serve(),通常在 go 语句中。

func Register

func Register(rcvr interface{}) error

Register 在 DefaultServer 中发布接收者的方法。

func RegisterName

func RegisterName(name string, rcvr interface{}) error

RegisterName 与 Register 类似,但使用提供的名称来代替接收者的具体类型。

func ServeCodec

func ServeCodec(codec ServerCodec)

ServeCodec 就像 ServeConn,但使用指定的编解码器来解码请求并对响应进行编码。

func ServeConn

func ServeConn(conn io.ReadWriteCloser)

ServeConn 在一个连接上运行 DefaultServer。ServeConn 块,服务于连接,直到客户端挂断。调用者通常在 go 语句中调用 ServeConn 。ServeConn 在连接上使用 gob wire 格式(请参阅软件包 gob)。要使用备用编解码器,请使用 ServeCodec 。

func ServeRequest

func ServeRequest(codec ServerCodec) error

ServeRequest 与 ServeCodec 类似,但同步提供单个请求。完成后它不会关闭编解码器。

type Call

Call 表示一个活动的 RPC 。

type Call struct {
        ServiceMethod string      // The name of the service and method to call.
        Args          interface{} // The argument to the function (*struct).
        Reply         interface{} // The reply from the function (*struct).
        Error         error       // After completion, the error status.
        Done          chan *Call  // Strobes when call is complete.}

type Client

Client 代表一个 RPC 客户端。可能有多个与一个客户端相关的未决呼叫,并且一个客户端可能会被多个 goroutine 同时使用。

type Client struct {        // contains filtered or unexported fields}

func Dial

func Dial(network, address string) (*Client, error)

Dial 连接到指定网络地址的 RPC 服务器。

func DialHTTP

func DialHTTP(network, address string) (*Client, error)

DialHTTP 连接到指定网络地址的 HTTP RPC 服务器,该地址监听默认的 HTTP RPC 路径。

func DialHTTPPath

func DialHTTPPath(network, address, path string) (*Client, error)

DialHTTPPath 通过指定的网络地址和路径连接到 HTTP RPC 服务器。

func NewClient

func NewClient(conn io.ReadWriteCloser) *Client

NewClient 返回一个新的客户端来处理对连接另一端的一组服务的请求。它向连接的写入端添加一个缓冲区,以便将 header 和 payload 作为一个单元发送。

func NewClientWithCodec

func NewClientWithCodec(codec ClientCodec) *Client

NewClientWithCodec 与 NewClient 类似,但使用指定的编解码器对请求进行编码和解码响应。

func (*Client) Call

func (client *Client) Call(serviceMethod string, args interface{}, reply interface{}) error

Call 调用指定的函数,等待它完成,并返回其错误状态。

func (*Client) Close

func (client *Client) Close() error

Close 调用底层编解码器的 Close 方法。如果连接已关闭,则返回 ErrShutdown 。

func (*Client) Go

func (client *Client) Go(serviceMethod string, args interface{}, reply interface{}, done chan *Call) *Call

Go 异步调用该函数。它返回表示调用的 Call 结构。完成通道将通过返回相同的呼叫对象在呼叫完成时发出信号。如果完成,则 Go 将分配一个新频道。如果非零,则必须进行缓冲或 Go 会故意崩溃。

type ClientCodec

ClientCodec 实现 RPC 请求的写入和读取 RPC 会话客户端的 RPC 响应。客户端调用 WriteRequest 向连接写入请求,并成对调用 ReadResponseHeader 和 ReadResponseBody 以读取响应。客户在完成连接后调用 Close 。可以使用零参数调用 ReadResponseBody,以强制读取响应主体并丢弃。

type ClientCodec interface {        // WriteRequest must be safe for concurrent use by multiple goroutines.        WriteRequest(*Request, interface{}) error        ReadResponseHeader(*Response) error        ReadResponseBody(interface{}) error        Close() error}

type Request

Request 是每个 RPC 调用之前写入的头文件。它在内部使用,但在此处记录为对调试的帮助,例如分析网络流量时。

type Request struct {
        ServiceMethod string // format: "Service.Method"
        Seq           uint64 // sequence number chosen by client        // contains filtered or unexported fields}

type Response

Response 是每个 RPC 返回之前写入的头文件。它在内部使用,但在此处记录为对调试的帮助,例如分析网络流量时。

type Response struct {
        ServiceMethod string // echoes that of the Request
        Seq           uint64 // echoes that of the request
        Error         string // error, if any.        // contains filtered or unexported fields}

type Server

Server 代表一个 RPC 服务器。

type Server struct {        // contains filtered or unexported fields}

func NewServer

func NewServer() *Server

NewServer 返回一个新的服务器。

func (*Server) Accept

func (server *Server) Accept(lis net.Listener)

Accept 接受侦听器上的连接并为每个传入连接提供请求。接受阻塞,直到侦听器返回非零错误。调用者通常在 go 语句中调用 Accept 。

func (*Server) HandleHTTP

func (server *Server) HandleHTTP(rpcPath, debugPath string)

HandleHTTP 为 rpcPath 上的 RPC 消息注册一个 HTTP 处理程序,并在 debugPath 上注册一个调试处理程序。仍然需要调用 http.Serve(),通常在 go 语句中。

func (*Server) Register

func (server *Server) Register(rcvr interface{}) error

Register 在服务器中发布满足以下条件的接收器值的方法集合:

- exported method of exported type- two arguments, both of exported type- the second argument is a pointer- one return value, of type error

如果接收方不是导出类型或没有合适的方法,它将返回一个错误。它还使用包日志记录错误。客户端使用“Type.Method”形式的字符串访问每个方法,其中 Type 是接收者的具体类型。

func (*Server) RegisterName

func (server *Server) RegisterName(name string, rcvr interface{}) error

RegisterName 与 Register 类似,但使用提供的名称来代替接收者的具体类型。

func (*Server) ServeCodec

func (server *Server) ServeCodec(codec ServerCodec)

ServeCodec 就像 ServeConn,但使用指定的编解码器来解码请求并对响应进行编码。

func (*Server) ServeConn

func (server *Server) ServeConn(conn io.ReadWriteCloser)

ServeConn 在单个连接上运行服务器。ServeConn 块,服务于连接,直到客户端挂断。调用者通常在 go 语句中调用 ServeConn 。ServeConn 在连接上使用 gob wire 格式(请参阅软件包 gob)。要使用备用编解码器,请使用 ServeCodec 。

func (*Server) ServeHTTP

func (server *Server) ServeHTTP(w http.ResponseWriter, req *http.Request)

ServeHTTP 实现了一个应答 RPC 请求的 http.Handler 。

func (*Server) ServeRequest

func (server *Server) ServeRequest(codec ServerCodec) error

ServeRequest 与 ServeCodec 类似,但同步提供单个请求。完成后它不会关闭编解码器。

type ServerCodec

ServerCodec 实现读取 RPC 请求并为 RPC 会话的服务器端写入 RPC 响应。服务器成对调用 ReadRequestHeader 和 ReadRequestBody 来读取来自连接的请求,并且它调用 WriteResponse 来写回响应。服务器在连接完成后调用 Close 。可以使用零参数调用 ReadRequestBody 来强制请求的主体被读取和丢弃。

type ServerCodec interface {        ReadRequestHeader(*Request) error        ReadRequestBody(interface{}) error        // WriteResponse must be safe for concurrent use by multiple goroutines.        WriteResponse(*Response, interface{}) error        Close() error}

type ServerError

ServerError 表示从 RPC 连接的远程端返回的错误。

type ServerError string

func (ServerError) Error

func (e ServerError) Error() string

子目录

Name

Synopsis

jsonrpc

包 jsonrpc 为 rpc 包实现了一个 JSON-RPC 1.0 ClientCodec 和 ServerCodec

Artikel sebelumnya: Artikel seterusnya: