golang RP c не могу найти сервис - PullRequest
0 голосов
/ 21 января 2020

Я не могу найти ошибку в этом коде. Когда я запускаю его, я получаю Error in Broker.Connect: rpc: can't find service Broker.Connect. Я знаю, что это сообщение означает, что когда клиент пытается вызвать удаленную процедуру Connect, он не находит его. Но я не понимаю почему. Я уверен, что я публикую процедуру Connect правильно.

Я покажу вам свой код. Я думаю, что что-то простое отсутствует, но я просто не могу понять, что.

Это интерфейс сервера, который я пытаюсь опубликовать sh:

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
}

Это код что публикует sh метод:

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)
}

Ясно, когда я запускаю код, я сначала запустите брокера и после этого потребителя.

Может кто-нибудь мне помочь?

1 Ответ

0 голосов
/ 21 января 2020

Ошибка в вызове accept с использованием rpc.Accept(l), я исправляю это написание server.Accept(l), где server - это значение, принятое здесь server := rpc.NewServer().

...