关于Go语言在服务端做Restful接口和socket通信
生活随笔
收集整理的這篇文章主要介紹了
关于Go语言在服务端做Restful接口和socket通信
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
轉(zhuǎn)載自: http://xiaorui.cc/2014/10/25/%e5%85%b3%e4%ba%8ego%e8%af%ad%e8%a8%80%e5%9c%a8%e6%9c%8d%e5%8a%a1%e7%ab%af%e5%81%9arestful%e6%8e%a5%e5%8f%a3%e5%92%8csocket%e9%80%9a%e4%bf%a1/
關(guān)于Go語言在服務(wù)端做Restful接口和socket通信
2014-10-25Golang rfyiamcool下圖是關(guān)于rest的使用介紹,有些老生常談了。
當(dāng)REST架構(gòu)的約束條件作為一個(gè)整體應(yīng)用時(shí),將生成一個(gè)可以擴(kuò)展到大量客戶端的應(yīng)用程序。它還降低了客戶端和服務(wù)器之間的交互延遲。統(tǒng)一界面簡(jiǎn)化了整個(gè)系統(tǒng)架構(gòu),改進(jìn)了子系統(tǒng)之間交互的可見性。REST簡(jiǎn)化了客戶端和服務(wù)器的實(shí)現(xiàn),而且對(duì)于使用REST開發(fā)的應(yīng)用程序更加容易擴(kuò)展。
其實(shí)說白了,就是根據(jù)不同的方法,來分類不同的任務(wù)~
我這邊使用golang的drone/routes庫實(shí)現(xiàn)restful服務(wù)。 ?下面是實(shí)現(xiàn)rest的具體事例代碼。
packagemain import ("fmt""github.com/drone/routes""net/http" ) funcgetuser(whttp.ResponseWriter,r *http.Request){params:=r.URL.Query()uid:=params.Get(":uid")fmt.Fprintf(w,"you are get user %s",uid) } func modifyuser(whttp.ResponseWriter,r *http.Request){params:=r.URL.Query()uid:=params.Get(":uid")fmt.Fprintf(w,"you are modify user %s",uid) } funcdeleteuser(whttp.ResponseWriter,r *http.Request){params:=r.URL.Query()uid:=params.Get(":uid")fmt.Fprintf(w,"you are delete user %s",uid) } func adduser(whttp.ResponseWriter,r *http.Request){params:=r.URL.Query()uid:=params.Get(":uid")fmt.Fprint(w,"you are add user %s",uid)fmt.Printf("you are add user %s",uid) } funcmain(){mux:=routes.New()mux.Get("/user/:uid",getuser)mux.Post("/user/:uid",modifyuser)mux.Del("/user/:uid",deleteuser)mux.Put("/user/:uid",adduser)http.Handle("/",mux)http.ListenAndServe(":8088",nil) } //xiaorui.cc
下面說下golang socket的實(shí)例代碼, 這邊針對(duì)每個(gè)請(qǐng)求都使用協(xié)程處理請(qǐng)求。?
server.go
packagemain import ("fmt""net""os" ) funcmain(){var(host = "127.0.0.1"port = "8080"remote= host+ ":"+ portdata = make([]byte,1024))fmt.Println("Initiating server... (Ctrl-C to stop)")lis,err :=net.Listen("tcp",remote)defer lis.Close()iferr !=nil {fmt.Println("Error when listen: ",remote)os.Exit(-1)}for{var resstringconn,err :=lis.Accept()iferr !=nil {fmt.Println("Error accepting client: ",err.Error())os.Exit(0)}go func(connet.Conn){fmt.Println("New connection: ", con.RemoteAddr())for{length,err :=con.Read(data)iferr !=nil {fmt.Printf("Client %v quit.\n", con.RemoteAddr())con.Close()return}res= string(data[0:length])fmt.Printf("%s said: %s\n",con.RemoteAddr(),res)res= "You said:"+ rescon.Write([]byte(res))}}(conn)} } import ("fmt""net""os" ) func main() {var (host = "127.0.0.1"port = "8080"remote = host + ":" + portdata = make([]byte, 1024))fmt.Println("Initiating server... (Ctrl-C to stop)")lis, err := net.Listen("tcp", remote)defer lis.Close()if err != nil {fmt.Println("Error when listen: ", remote)os.Exit(-1)}for {var res stringconn, err := lis.Accept()if err != nil {fmt.Println("Error accepting client: ", err.Error())os.Exit(0)}go func(con net.Conn) {fmt.Println("New connection: ", con.RemoteAddr())for {length, err := con.Read(data)if err != nil {fmt.Printf("Client %v quit.\n", con.RemoteAddr())con.Close()return}res = string(data[0:length])fmt.Printf("%s said: %s\n", con.RemoteAddr(), res)res = "You said:" + rescon.Write([]byte(res))}}(conn)} } socket client的go實(shí)現(xiàn)代碼packagemain import ("fmt""net""os" ) varstr string var msg= make([]byte,1024) funcmain(){var(host = "127.0.0.1"port = "8080"remote= host+ ":"+ port)con,err :=net.Dial("tcp",remote)defer con.Close()iferr !=nil {fmt.Println("Server not found.")os.Exit(-1)}fmt.Println("Connection OK.")for{fmt.Printf("Enter a sentence:")fmt.Scanf("%s\n",&str)ifstr =="quit" {fmt.Println("Communication terminated.")os.Exit(1)}in,err :=con.Write([]byte(str))iferr !=nil {fmt.Printf("Error when send to server: %d\n",in)os.Exit(0)}length,err :=con.Read(msg)iferr !=nil {fmt.Printf("Error when read from server.\n")os.Exit(0)}str= string(msg[0:length])fmt.Println(str)} }
package main import ("fmt""net""os" ) var str string var msg = make([]byte, 1024) func main() {var (host = "127.0.0.1"port = "8080"remote = host + ":" + port)con, err := net.Dial("tcp", remote)defer con.Close()if err != nil {fmt.Println("Server not found.")os.Exit(-1)}fmt.Println("Connection OK.")for {fmt.Printf("Enter a sentence:")fmt.Scanf("%s\n", &str)if str == "quit" {fmt.Println("Communication terminated.")os.Exit(1)}in, err := con.Write([]byte(str))if err != nil {fmt.Printf("Error when send to server: %d\n", in)os.Exit(0)}length, err := con.Read(msg)if err != nil {fmt.Printf("Error when read from server.\n")os.Exit(0)}str = string(msg[0:length])fmt.Println(str)} }
總結(jié)
以上是生活随笔為你收集整理的关于Go语言在服务端做Restful接口和socket通信的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WebService与使用风格RPC/S
- 下一篇: RPC框架性能基本比较测试