golang两种调用rpc的方法

 更新时间:2016年07月26日 16:19:42   作者:轩脉刃  
这篇文章主要介绍了golang两种调用rpc的方法,结合实例形式分析了Go语言调用rpc的原理与实现方法,需要的朋友可以参考下

本文实例讲述了golang两种调用rpc的方法。分享给大家供大家参考,具体如下:

golang的rpc有两种方法进行调用,一种是rpc例子中给的:

复制代码 代码如下:
package main
import (
        "net/rpc"
        "net/http"
        "log"
        "net"
        "time"
)
type Args struct {
        A, B int
}
type Arith int
func (t *Arith) Multiply(args *Args, reply *([]string)) error {
        *reply = append(*reply, "test")
        return nil
}
func main() {
        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)
        time.Sleep(5 * time.Second)
        client, err := rpc.DialHTTP("tcp", "127.0.0.1" + ":1234")
        if err != nil {
                log.Fatal("dialing:", err)
        }
        args := &Args{7,8}
        reply := make([]string, 10)
        err = client.Call("Arith.Multiply", args, &reply)
        if err != nil {
                log.Fatal("arith error:", err)
        }
        log.Println(reply)
}

另一种是使用NewServer

这种是当rpc已经注册的时候就要使用了另外一种了。即一个server只能在DefaultRPC中注册一种类型。

当Server使用rpc.NewServer的时候,client也需要进行下改动了

复制代码 代码如下:
package main
import (
        "net/rpc"
        //"net/http"
        "log"
        "net"
        "time"
)
type Args struct {
        A, B int
}
type Arith int
func (t *Arith) Multiply(args *Args, reply *([]string)) error {
        *reply = append(*reply, "test")
        return nil
}
func main() {
        newServer := rpc.NewServer()
        newServer.Register(new(Arith))
        l, e := net.Listen("tcp", "127.0.0.1:1234") // any available address
        if e != nil {
                log.Fatalf("net.Listen tcp :0: %v", e)
        }
        go newServer.Accept(l)
        newServer.HandleHTTP("/foo", "/bar")
        time.Sleep(2 * time.Second)
        address, err := net.ResolveTCPAddr("tcp", "127.0.0.1:1234")
        if err != nil {
                panic(err)
        }
        conn, _ := net.DialTCP("tcp", nil, address)
        defer conn.Close()
        client := rpc.NewClient(conn)
        defer client.Close()
        args := &Args{7,8}
        reply := make([]string, 10)
        err = client.Call("Arith.Multiply", args, &reply)
        if err != nil {
                log.Fatal("arith error:", err)
        }
        log.Println(reply)
}

第二个例子中的

复制代码 代码如下:
newServer.HandleHTTP("/foo", "/bar")

可以任意设置,第一个例子其实是设置了默认的两个

这里也顺便将reply作为[]slice的例子给演示了下

希望本文所述对大家Go语言程序设计有所帮助。

您可能感兴趣的文章:

相关文章

  • 详解Go语言中的逃逸分析

    详解Go语言中的逃逸分析

    逃逸分析是编译器用于决定将变量分配到栈上还是堆上的一种行为,下面小编就来为大家详细讲讲go语言中是如何进行逃逸分析的,需要的小伙伴可以参考下
    2023-09-09
  • 详解Golang语言中的interface

    详解Golang语言中的interface

    这篇文章主要介绍了Golang语言中的interface的相关资料,帮助大家更好的理解和使用golang,感兴趣的朋友可以了解下
    2021-01-01
  • Go语言单例模式详解

    Go语言单例模式详解

    本文主要介绍了Go语言单例模式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Golang跨平台GUI框架Fyne的使用教程详解

    Golang跨平台GUI框架Fyne的使用教程详解

    Go 官方没有提供标准的 GUI 框架,在 Go 实现的几个 GUI 库中,Fyne 算是最出色的,它有着简洁的API、支持跨平台能力,且高度可扩展,下面我们就来看看它的具体使用吧
    2024-03-03
  • go grpc高级用法

    go grpc高级用法

    RPC是远程过程调用,可以像调用本地服务一样取调用远程服务,本文主要介绍了go grpc高级用法,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • 浅谈go中切片比数组好用在哪

    浅谈go中切片比数组好用在哪

    数组和切片都是常见的数据结构,本文将介绍Go语言中数组和切片的基本概念,同时详细探讨切片的优势,感兴趣的可以了解下
    2023-06-06
  • Go语言for-range函数使用技巧实例探究

    Go语言for-range函数使用技巧实例探究

    这篇文章主要为大家介绍了Go语言for-range函数使用技巧实例探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Go语言编程入门超级指南

    Go语言编程入门超级指南

    这篇文章主要介绍了Go语言编程的入门指南,包括对Go的变量及函数的基本介绍,需要的朋友可以参考下
    2016-01-01
  • Go语言读取文本文件的三种方式总结

    Go语言读取文本文件的三种方式总结

    工作中时不时需要读取文本,文本文件是最常见的文件类型。本文将利用Go语言从逐行、逐个单词和逐个字符三个方法读取文件,感兴趣的可以了解一下
    2023-01-01
  • golang http使用踩过的坑与应对方式

    golang http使用踩过的坑与应对方式

    这篇文章主要介绍了golang http使用踩过的坑与应对方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01

最新评论