2013-12-04 3 views
1

Я пытаюсь получить минимальное приложение, работающее с использованием вызовов 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, прежде чем перейти к более серьезным упражнениям; всем остальным студентам удалось добиться этого шага, посмотрел на этот код и не мог видеть разницу с их.

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

+0

Первый шаг: не игнорировать ошибки, возвращаемые ReadLine. – Volker

+0

@Volker: оставлена ​​большая часть ошибок для краткости; в случае ReadLine (и всех других вызовов, за исключением client.Call), ошибка не возвращается (== nil). – Peniblec

ответ

3

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

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

Смежные вопросы