Простой вызов RPC в Go

Я пытаюсь заставить минимальное приложение работать с вызовами RPC в Go. Я много заимствую из онлайн-примера, как видно из моего кода. :

сервер.го:

package main

import (
    [...]
)

type InfoDumper int

func (s *InfoDumper) Dump(request string, reply *string) error {

    fmt.Println("Woooh imma deliverin stuff\n")

    current_time := time.Now()

    h:= sha1.New()
    var barray []byte
    copy(barray, request)
    hash_rq := h.Sum(barray)

    *reply = request + "\n" + current_time.Format(time.ANSIC) + "\n"  + string(hash_rq) + "\n"
    return nil
}


func main() {

    server := new(InfoDumper)

    rpc.Register(server)
    rpc.HandleHTTP()

    l, e := net.Listen("tcp", "127.0.0.1:40000")
    if e != nil {
        fmt.Println(e)
    }

    http.Serve(l, nil)

}

client.go:

package main

import (
    [...]
)

func main() {

    client, e := rpc.Dial("tcp", "127.0.0.1:40000")

    if e!=nil {
        fmt.Println(e)
    }   else {
        fmt.Println("wooh server is ok")
    }

    in:= bufio.NewReader(os.Stdin)

    for {

        line, _, _ := in.ReadLine()
        request := string(line)
        var reply string

        e = client.Call("InfoDumper.Dump", request, &reply)

        if (e!=nil) {
            fmt.Println("omg error!", e)
        }

        fmt.Println(reply)
    }

}

Единственное отличие, которое я вижу, это то, что я написал http.Serve(l, nil) вместо go http.Serve(l, nil); это потому, что запись с go заставляет мой сервер сразу же завершить работу. Предполагается, что InfoDump ответит копией того, что было отправлено, временем и хэшем запроса.

Вот что происходит прямо сейчас:

  • Я запускаю server.go в терминале
  • Я запускаю client.go в другом терминале, примерно через секунду печатается "wooh server is ok"
  • Я что-то набираю и нажимаю Enter на стороне клиента
  • либо ничего не происходит, либо на стороне клиента печатается "rpc: ошибка протокола клиента: неожиданный EOF"
  • если ничего не произошло, завершение работы сервера (т. е. нажатие Control-C) заставит клиента распечатать указанную выше ошибку.

В любом случае, "Woooh imma deliveryin stuff" никогда не отображается на стороне сервера...

Это было сделано во время занятий в качестве предварительного шага для знакомства с RPC в Go перед переходом к более серьезным упражнениям; всем остальным студентам удалось заставить этот шаг работать, они посмотрели на этот код и не увидели разницы со своим.

Кто-нибудь видит что-то не так с этим кодом?


person Peniblec    schedule 04.12.2013    source источник
comment
Первый шаг: не игнорируйте ошибки, возвращаемые ReadLine.   -  person Volker    schedule 04.12.2013
comment
@Volker: оставил большую часть ошибок для краткости; в случае ReadLine (и всех других вызовов, кроме client.Call), ошибка не возвращается (== nil).   -  person Peniblec    schedule 04.12.2013


Ответы (1)


Как я отметил в своем ответе списка рассылки, вам нужно будет используйте DialHTTP, если вы хотите подключиться к серверу RPC, который вы обслуживали, используя Обработка HTTP.

Я сделал некоторые другие заметки о вашем коде (включая стиль: используйте gofmt и MixedCaps, согласно Effective Go, и обязательно выручайте об ошибках) в рассылке.

person Kyle Lemons    schedule 04.12.2013