<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                TCP RPC 上面我們實現了基于HTTP協議的RPC,接下來我們要實現基于TCP協議的RPC,服務端的實現代碼如下所示: ~~~ package main import ( "errors" "fmt" "net" "net/rpc" "os" ) type Args struct { A, B int } type Quotient struct { Quo, Rem int } type Arith int func (t *Arith) Multiply(args *Args, reply *int) error { *reply = args.A * args.B return nil } func (t *Arith) Divide(args *Args, quo *Quotient) error { if args.B == 0 { return errors.New("divide by zero") } quo.Quo = args.A / args.B quo.Rem = args.A % args.B return nil } func main() { arith := new(Arith) /* Register在server注冊并公布rcvr的方法集中滿足如下要求的方法: - 方法是導出的 - 方法有兩個參數,都是導出類型或內建類型 - 方法的第二個參數是指針 - 方法只有一個error接口類型的返回值 如果rcvr不是一個導出類型的值,或者該類型沒有滿足要求的方法,Register會返回錯誤。Register也會使用log包將錯誤寫入日志。客戶端可以使用格式為"Type.Method"的字符串訪問這些方法,其中Type是rcvr的具體類型。 */ rpc.Register(arith) /* ResolveTCPAddr將addr作為TCP地址解析并返回。參數addr格式為"host:port"或"[ipv6-host%zone]:port",解析得到網絡名和端口名;net必須是"tcp"、"tcp4"或"tcp6"。 IPv6地址字面值/名稱必須用方括號包起來,如"[::1]:80"、"[ipv6-host]:http"或"[ipv6-host%zone]:80"。 */ tcpAddr, err := net.ResolveTCPAddr("tcp", ":1234") checkError(err) /* ListenTCP在本地TCP地址laddr上聲明并返回一個*TCPListener,net參數必須是"tcp"、"tcp4"、"tcp6",如果laddr的端口字段為0,函數將選擇一個當前可用的端口,可以用Listener的Addr方法獲得該端口。 */ listener, err := net.ListenTCP("tcp", tcpAddr) checkError(err) for { // AcceptTCP接收下一個呼叫,并返回一個新的*TCPConn。 conn, err := listener.Accept() if err != nil { continue } /* ServeConn在單個連接上執行DefaultServer。ServeConn會阻塞,服務該連接直到客戶端掛起。調用者一般應另開線程調用本函數:"go ServeConn(conn)"。ServeConn在該連接使用gob(參見encoding/gob包)有線格式。要使用其他的編解碼器,可調用ServeCodec方法。 */ rpc.ServeConn(conn) } } func checkError(err error) { if err != nil { fmt.Println("Fatal error ", err.Error()) os.Exit(1) } } ~~~ 上面這個代碼和http的服務器相比,不同在于:在此處我們采用了TCP協議,然后需要自己控制連接,當有客戶端連接上來后,我們需要把這個連接交給rpc來處理。 如果你留心了,你會發現這它是一個阻塞型的單用戶的程序,如果想要實現多并發,那么可以使用goroutine來實現,我們前面在socket小節的時候已經介紹過如何處理goroutine。 下面展現了TCP實現的RPC客戶端: ~~~ package main import ( "fmt" "log" "net/rpc" ) type Args struct { A, B int } type Quotient struct { Quo, Rem int } func main() { // if len(os.Args) != 2 { // fmt.Println("Usage: ", os.Args[0], "server:port") // os.Exit(1) // } // service := os.Args[1] // client, err := rpc.Dial("tcp", service) client, err := rpc.Dial("tcp", "127.0.0.1:1234") if err != nil { log.Fatal("dialing:", err) } // Synchronous call args := Args{17, 8} var reply int err = client.Call("Arith.Multiply", args, &reply) if err != nil { log.Fatal("arith error:", err) } fmt.Printf("Arith: %d*%d=%d\n", args.A, args.B, reply) var quot Quotient err = client.Call("Arith.Divide", args, &quot) if err != nil { log.Fatal("arith error:", err) } fmt.Printf("Arith: %d/%d=%d remainder %d\n", args.A, args.B, quot.Quo, quot.Rem) } ~~~ 這個客戶端代碼和http的客戶端代碼對比,唯一的區別一個是DialHTTP,一個是Dial(tcp),其他處理一模一樣。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看