【问题标题】:golang rpc can't find servicegolang rpc找不到服务
【发布时间】:2020-01-21 15:13:08
【问题描述】:

我在这段代码中找不到错误。 当我运行它时,我得到Error in Broker.Connect: rpc: can't find service Broker.Connect。 我知道这条消息意味着当客户端尝试调用远程过程 Connect 时,他没有找到它。但我不明白为什么。我确定我发布的过程连接正确。

我给你看我的代码。 我认为缺少一些简单的东西,但我就是不明白是什么。

这是我要发布的服务器界面:

package Broker

import (
    "MyRand/Rand"
    "fmt"
    "math/rand"
    "strconv"
)

type ConsumerId struct {
    Name string
    Address string
}

type Broker int

func (b *Broker)Connect(s string, r *ConsumerId) error{
    r.Name = Rand.String(10)
    CL.lock.Lock()
    exists := true
    for exists {
        e := CL.list.Front()
        for i := 0; i < CL.list.Len(); i++ {
            var v ConsumerId = e.Value.(ConsumerId)
            if s == v.Address {
                if v.Name != r.Name {
                    portNumber := rand.Intn(1000) + rand.Intn(9000)
                    s = strconv.Itoa(portNumber)
                    break
                } else {
                    continue
                }
            }
            if i == CL.list.Len() -1 {
                exists = false
            }
            e = e.Next()
        }
    }
    r.Address = s
    CL.list.PushBack(r)
    CL.lock.Unlock()

    fmt.Println("Host connected: " + s)
    return nil
}

这是发布方法的代码:

package Broker

import (
    "container/list"
    "fmt"
    "log"
    "net"
    "net/rpc"
    "sync"
)

type ConsumerList struct {
    lock sync.RWMutex
    list list.List
}

const ServerAddr = ":1234"

var CL *ConsumerList
var b *Broker
var l net.Listener
var e error

func initialization(){
    CL = new(ConsumerList)
    b = new(Broker)
    server := rpc.NewServer()
    e = server.RegisterName("Broker", b)
    if e != nil {
        log.Fatal("Format of service Broker is not correct: ", e)
    }
    // Listen for incoming tcp packets on specified port.
    l, e = net.Listen("tcp", ServerAddr)
    if e != nil {
        log.Fatal("Listen error:", e)
    }
}

func FuncBroker() {
    initialization()
    for {
        fmt.Println("Broker.go42")
        rpc.Accept(l)
    }
}

最后,这是调用过程并触发错误的代码:

package Consumer

import (
    "MyProject/Broker"
    "container/list"
    "fmt"
    "log"
    "math/rand"
    "net"
    "net/rpc"
    "os"
    "strconv"
)

var subscriptions *list.List
var id Broker.ConsumerId
var client *rpc.Client
var e error

func connect(){
    client, e := rpc.Dial("tcp", "localhost" + Broker.ServerAddr)
    if e != nil {
        log.Fatal("Error in dialing: ", e)
    }
    portN := 1000+rand.Intn(8999)
    portNString := strconv.Itoa(portN)
    e = client.Call("Broker.Connect", portNString, &id)
    if e != nil {
        log.Fatal("Error in Broker.Connect: ", e)
    }
}


func FuncConsumer(){
    connect()
    defer client.Close()
//  go exposeInterface()

    subscriptions = new(list.List)
//  userCommands()
    os.Exit(0)
}

很明显,当我运行代码时,我首先运行代理,然后运行消费者。

有人可以帮我吗?

【问题讨论】:

  • 您注册了“Server”作为服务的名称,而不是“Broker”。
  • @BurakSerdar,我编辑是因为那是一个测试。即使与“经纪人”也不起作用。

标签: go rpc


【解决方案1】:

错误是使用rpc.Accept(l) 调用accept,我更正了server.Accept(l),其中server 是此处取值server := rpc.NewServer()。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多