Я пытаюсь получить минимальное приложение, работающее с использованием вызовов RPC в Go. Я сильно заимствования из online example, как вы можете видеть из моего кода:Простой RPC-вызов в Go
server.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 сервер нормально» печатается
- я что-то типа и нажмите Enter на стороне клиента
- либо ничего не происходит, или «RPC: ошибка протокола клиента: неожиданный EOF» печатается на стороне клиента
- , если ничего не произошло, завершение сервера (Т.е. ударяя Control-C), делает клиент печать ошибки выше
В любом случае, «Woooh МАЗМЫ deliverin материала» никогда не отображается на стороне сервера ...
Это было сделан во время класса, как предварительный шаг, чтобы познакомиться с RPC в Go, прежде чем перейти к более серьезным упражнениям; всем остальным студентам удалось добиться этого шага, посмотрел на этот код и не мог видеть разницу с их.
Кто-нибудь видит что-то не так с этим кодом?
Первый шаг: не игнорировать ошибки, возвращаемые ReadLine. – Volker
@Volker: оставлена большая часть ошибок для краткости; в случае ReadLine (и всех других вызовов, за исключением client.Call), ошибка не возвращается (== nil). – Peniblec