Я не могу найти ошибку в этом коде. Когда я запускаю его, я получаю 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)
}
Ясно, когда я запускаю код, я сначала запустите брокера и после этого потребителя.
Может кто-нибудь мне помочь?