跟踪调试

有时候我们在调试过程中,可能会需要查看输入输出数据。用抓包工具抓取数据当然是一个办法,但是使用过滤器可以更方便更直接的显示出输入输出数据。

log_filter.go

  1. package main
  2.  
  3. import (
  4. "fmt"
  5.  
  6. "github.com/hprose/hprose-golang/rpc"
  7. )
  8.  
  9. type LogFilter struct {
  10. Prompt string
  11. }
  12.  
  13. func (lf LogFilter) InputFilter(data []byte, context rpc.Context) []byte {
  14. fmt.Printf("%v: %s\r\n", lf.Prompt, data)
  15. return data
  16. }
  17.  
  18. func (lf LogFilter) OutputFilter(data []byte, context rpc.Context) []byte {
  19. fmt.Printf("%v: %s\r\n", lf.Prompt, data)
  20. return data
  21. }

main.go

  1. package main
  2.  
  3. import "github.com/hprose/hprose-golang/rpc"
  4.  
  5. func hello(name string) string {
  6. return "Hello " + name + "!"
  7. }
  8.  
  9. // HelloService is ...
  10. type HelloService struct {
  11. Hello func(string) (string, error)
  12. }
  13.  
  14. func main() {
  15. server := rpc.NewTCPServer("")
  16. server.AddFunction("hello", hello).AddFilter(LogFilter{"Server"})
  17. server.Handle()
  18. client := rpc.NewClient(server.URI())
  19. client.AddFilter(LogFilter{"Client"})
  20. var helloService *HelloService
  21. client.UseService(&helloService)
  22. helloService.Hello("World")
  23. client.Close()
  24. server.Close()
  25. }

然后在命令行中运行:

  1. go run main.go log_filter.go

当然你也可以编译之后再执行。

之后,你会看到运行结果:


  1. Client: Cs5"Hello"a1{s5"World"}z
  2. Server: Cs5"Hello"a1{s5"World"}z
  3. Server: Rs12"Hello World!"z
  4. Client: Rs12"Hello World!"z

通过上面的输出,我们就可以清楚的看到 hprose 服务器和客户端之间是如何通讯的了。