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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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也需要进行下改动了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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)
}

1
第二个例子中的
1
newServer.HandleHTTP("/foo", "/bar")
1
可以任意设置,第一个例子其实是设置了默认的两个
1
  
1
这里也顺便将reply作为[]slice的例子给演示了下
1
  

golang rpc的两种调用方法相关推荐

  1. golang python rpc_golang rpc的两种调用方法

    golang的rpc有两种方法进行调用,一种是rpc例子中给的:package main import ( "net/rpc" "net/http" " ...

  2. golang java rpc_golang两种调用rpc的方法

    本文实例讲述了golang两种调用rpc的方法.分享给大家供大家参考,具体如下: golang的rpc有两种方法进行调用,一种是rpc例子中给的: package main import ( &quo ...

  3. Avro RPC的两种实现方法:静态实现和动态实现

    使用Avro可实现如下几种方式的轻量级RPC, 每种方式都可用动态编码和静态编码来实现: HTTP: HttpServer HttpTransceiver UDP DatagramServer Dat ...

  4. 【ASP.NET】——aspx与aspx.cs两种调用方法

    [第一种] 在.aspx.cs中写 public partial class UserInfoList : System.Web.UI.Page{public string StrHtml { get ...

  5. 使用定制的NSDictionary的方法,对NSArray进行排序(附:数组排序两种常见方法)

    NSArray中存放的是NSDictionary,可以使用策略的方法对NSDictionary进行定制,增加比较的方法.然后调用NSArray的sortUsingSelector方法对数组进行排序,这 ...

  6. python ioc di_Spring介绍,IOC(控制反转),DI(依赖注入)介绍及两种注入方法

    Spring介绍,IOC(控制反转),DI(依赖注入)介绍及两种注入方法 第一中方法:在xml文件中注入: (1)开源的轻量级的应用开发框架 特点:a.简化开发:b.解耦:c.集成: 原理对象与对象之 ...

  7. Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理

    Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理 代理模式 JDK动态代理 CGLIB动态代理 代理模式 代理模式是23种设计模式的一种,指一个对象A通过持有另一个对象B,可以具有B ...

  8. Java中关于Arrays.sort的两种重载方法的理解

    前言 在java中重载排序方法的方法目前有两种,一种是实现Comparable接口的compareTo方法,还有一种是用比较器(comparator) 作为参数,其中比较器是实现了Comparator ...

  9. 在.NET中执行Async/Await的两种错误方法

    微信公众号:架构师高级俱乐部 关注可了解更多的编程,架构知识.问题或建议,请公众号留言; 如果你觉得此文对你有帮助,欢迎转发 在.NET中执行异步/等待的两种错误方法 在应用开发中,我们为了提高应用程 ...

最新文章

  1. AI一分钟|特斯拉前员工爆料:部分汽车使用电池缺陷;小鹏汽车计划2019年底前融资300亿元...
  2. Flutter 基础布局Widgets之Baseline、AspectRatio详解
  3. java栈的应用_Java堆栈应用程序
  4. 帧起始定界符_帧详解 - web黄金矿工 - 博客园
  5. 微贷网 Java_关于Java集合的小抄
  6. android小应用帮美女更衣系列二(附源码)
  7. Bat 一键清理Chrome谷歌浏览器所有缓存 个人档案
  8. TM1640 数码管驱动代码(简化版)
  9. 图解机器学习算法(10) | XGBoost模型最全解析(机器学习通关指南·完结)
  10. 【跨境电商】WhatsApp营销保姆级教程!
  11. 曲线数学NURBS之B样条曲线
  12. java 如何测试_java – 如何测试一个变量是否设置?
  13. 小何讲进程: 编写Linux守护进程方法详解
  14. Padstack Editor 17.4 - document
  15. 准备注册网易企业邮箱,安全功能怎么样?
  16. mendix费用价格
  17. Maven 中跳过单元测试方法
  18. ubuntu 安装 navicat
  19. 小象学院之python实例
  20. Android 源码在线阅读

热门文章

  1. java对象--内部类
  2. 将 Microsoft Excel 导入至 MySQL
  3. idea_pyspark 环境配置
  4. java.lang.NoSuchMethodError: org.apache.log4j.Logger.isTraceEnabled()Z
  5. Javascript中的函数是第一类对象(first-class object)
  6. GHOST WIN8 64位软件自选安装专业优化版 201307 V1.0
  7. EBS服务重启脚本(应用和数据库)
  8. .net framework 4中SpinLock和lock的区别
  9. 【跃迁之路】【707天】程序员高效学习方法论探索系列(实验阶段464-2019.1.28)...
  10. zephir开发的扩展“wudimei框架”之数据库使用方法