关于Go语言在服务端做Restful接口和socket通信

请到我的个人博客看golang rest相关文章   http://xiaorui.cc


关于Go语言在服务端做Restful接口和socket通信

已经转到: 

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/


下图即是REST的架构图:

164501711.png


当REST架构的约束条件作为一个整体应用时,将生成一个可以扩展到大量客户端的应用程序。它还降低了客户端和服务器之间的交互延迟。统一界面简化了整个系统架构,改进了子系统之间交互的可见性。REST简化了客户端和服务器的实现,而且对于使用REST开发的应用程序更加容易扩展。

其实说白了,就是根据不同的方法,来分类不同的任务~


165521917.png


1
<span style= "font-size:16px;" > package  main<br data-filtered= "filtered" > import  (<br data-filtered= "filtered" >     "fmt" <br data-filtered= "filtered" >     "github.com/drone/routes" <br data-filtered= "filtered" >     "net/http" <br data-filtered= "filtered" >)<br data-filtered= "filtered" >func getuser(w http.ResponseWriter, r *http.Request) {<br data-filtered= "filtered" >    params := r.URL.Query()<br data-filtered= "filtered" >    uid := params.Get( ":uid" )<br data-filtered= "filtered" >    fmt.Fprintf(w,  "you are get user %s" , uid)<br data-filtered= "filtered" >}<br data-filtered= "filtered" >func modifyuser(w http.ResponseWriter, r *http.Request) {<br data-filtered= "filtered" >    params := r.URL.Query()<br data-filtered= "filtered" >    uid := params.Get( ":uid" )<br data-filtered= "filtered" >    fmt.Fprintf(w,  "you are modify user %s" , uid)<br data-filtered= "filtered" >}<br data-filtered= "filtered" >func deleteuser(w http.ResponseWriter, r *http.Request) {<br data-filtered= "filtered" >    params := r.URL.Query()<br data-filtered= "filtered" >    uid := params.Get( ":uid" )<br data-filtered= "filtered" >    fmt.Fprintf(w,  "you are delete user %s" , uid)<br data-filtered= "filtered" >}<br data-filtered= "filtered" >func adduser(w http.ResponseWriter, r *http.Request) {<br data-filtered= "filtered" >    params := r.URL.Query()<br data-filtered= "filtered" >    uid := params.Get( ":uid" )<br data-filtered= "filtered" >    fmt.Fprint(w,  "you are add user %s" , uid)<br data-filtered= "filtered" >    fmt.Printf( "you are add user %s" , uid)<br data-filtered= "filtered" >}<br data-filtered= "filtered" > //xiaorui.cc<br data-filtered="filtered">func main() {<br data-filtered="filtered">    mux := routes.New()<br data-filtered="filtered">    mux.Get("/user/:uid", getuser)<br data-filtered="filtered">    mux.Post("/user/:uid", modifyuser)<br data-filtered="filtered">    mux.Del("/user/:uid", deleteuser)<br data-filtered="filtered">    mux.Put("/user/:uid", adduser)<br data-filtered="filtered">    http.Handle("/", mux)<br data-filtered="filtered">    http.ListenAndServe(":8088", nil)<br data-filtered="filtered">}<br data-filtered="filtered">//xiaorui.cc<br data-filtered="filtered"></span>


结果:

164646894.jpg


接着咱们再说下 go的socket 。

客户端的情况

164847759.jpg


服务端的情况:

164930482.jpg


server.go

1
<span style= "font-size:16px;" > package  main<br data-filtered= "filtered" > import  (<br data-filtered= "filtered" >     "fmt" <br data-filtered= "filtered" >     "net" <br data-filtered= "filtered" >     "os" <br data-filtered= "filtered" >)<br data-filtered= "filtered" >func main() {<br data-filtered= "filtered" >     var  (<br data-filtered= "filtered" >        host   =  "127.0.0.1" <br data-filtered= "filtered" >        port   =  "8080" <br data-filtered= "filtered" >        remote = host +  ":"  + port<br data-filtered= "filtered" >        data   = make([]byte,  1024 )<br data-filtered= "filtered" >    )<br data-filtered= "filtered" >    fmt.Println( "Initiating server... (Ctrl-C to stop)" )<br data-filtered= "filtered" >    lis, err := net.Listen( "tcp" , remote)<br data-filtered= "filtered" >    defer lis.Close()<br data-filtered= "filtered" >     if  err != nil {<br data-filtered= "filtered" >        fmt.Println( "Error when listen: " , remote)<br data-filtered= "filtered" >        os.Exit(- 1 )<br data-filtered= "filtered" >    }<br data-filtered= "filtered" >     for  {<br data-filtered= "filtered" >         var  res string<br data-filtered= "filtered" >        conn, err := lis.Accept()<br data-filtered= "filtered" >         if  err != nil {<br data-filtered= "filtered" >            fmt.Println( "Error accepting client: " , err.Error())<br data-filtered= "filtered" >            os.Exit( 0 )<br data-filtered= "filtered" >        }<br data-filtered= "filtered" >        go func(con net.Conn) {<br data-filtered= "filtered" >            fmt.Println( "New connection: " , con.RemoteAddr())<br data-filtered= "filtered" >             for  {<br data-filtered= "filtered" >                length, err := con.Read(data)<br data-filtered= "filtered" >                 if  err != nil {<br data-filtered= "filtered" >                    fmt.Printf( "Client %v quit.\n" , con.RemoteAddr())<br data-filtered= "filtered" >                    con.Close()<br data-filtered= "filtered" >                     return <br data-filtered= "filtered" >                }<br data-filtered= "filtered" >                res = string(data[ 0 :length])<br data-filtered= "filtered" >                fmt.Printf( "%s said: %s\n" , con.RemoteAddr(), res)<br data-filtered= "filtered" >                res =  "You said:"  + res<br data-filtered= "filtered" >                con.Write([]byte(res))<br data-filtered= "filtered" >            }<br data-filtered= "filtered" >        }(conn)<br data-filtered= "filtered" >    }<br data-filtered= "filtered" >}<br data-filtered= "filtered" ></span>


client.go


1
<span style= "font-size:16px;" > package  main<br data-filtered= "filtered" > import  (<br data-filtered= "filtered" >     "fmt" <br data-filtered= "filtered" >     "net" <br data-filtered= "filtered" >     "os" <br data-filtered= "filtered" >)<br data-filtered= "filtered" > var  str string<br data-filtered= "filtered" > var  msg = make([]byte,  1024 )<br data-filtered= "filtered" >func main() {<br data-filtered= "filtered" >     var  (<br data-filtered= "filtered" >        host   =  "127.0.0.1" <br data-filtered= "filtered" >        port   =  "8080" <br data-filtered= "filtered" >        remote = host +  ":"  + port<br data-filtered= "filtered" >    )<br data-filtered= "filtered" >    con, err := net.Dial( "tcp" , remote)<br data-filtered= "filtered" >    defer con.Close()<br data-filtered= "filtered" >     if  err != nil {<br data-filtered= "filtered" >        fmt.Println( "Server not found." )<br data-filtered= "filtered" >        os.Exit(- 1 )<br data-filtered= "filtered" >    }<br data-filtered= "filtered" >    fmt.Println( "Connection OK." )<br data-filtered= "filtered" >     for  {<br data-filtered= "filtered" >        fmt.Printf( "Enter a sentence:" )<br data-filtered= "filtered" >        fmt.Scanf( "%s\n" , &str)<br data-filtered= "filtered" >         if  str ==  "quit"  {<br data-filtered= "filtered" >            fmt.Println( "Communication terminated." )<br data-filtered= "filtered" >            os.Exit( 1 )<br data-filtered= "filtered" >        }<br data-filtered= "filtered" >         in , err := con.Write([]byte(str))<br data-filtered= "filtered" >         if  err != nil {<br data-filtered= "filtered" >            fmt.Printf( "Error when send to server: %d\n" in )<br data-filtered= "filtered" >            os.Exit( 0 )<br data-filtered= "filtered" >        }<br data-filtered= "filtered" >        length, err := con.Read(msg)<br data-filtered= "filtered" >         if  err != nil {<br data-filtered= "filtered" >            fmt.Printf( "Error when read from server.\n" )<br data-filtered= "filtered" >            os.Exit( 0 )<br data-filtered= "filtered" >        }<br data-filtered= "filtered" >        str = string(msg[ 0 :length])<br data-filtered= "filtered" >        fmt.Println(str)<br data-filtered= "filtered" >    }<br data-filtered= "filtered" >}<br data-filtered= "filtered" ></span>


Go的并发模式


1
<span style= "font-size:16px;" > package  main<br data-filtered= "filtered" > import  (<br data-filtered= "filtered" >         "fmt" <br data-filtered= "filtered" >         "runtime" <br data-filtered= "filtered" >)<br data-filtered= "filtered" >func say(s string) {<br data-filtered= "filtered" >         for  i :=  0 ; i <  5 ; i++ {<br data-filtered= "filtered" >                runtime.Gosched()<br data-filtered= "filtered" >                fmt.Println(s)<br data-filtered= "filtered" >        }<br data-filtered= "filtered" >}<br data-filtered= "filtered" >func main() {<br data-filtered= "filtered" >        go say( "world" )<br data-filtered= "filtered" >        say( "end" )<br data-filtered= "filtered" >}<br data-filtered= "filtered" ></span>


结果:

165326909.jpg






 本文转自 rfyiamcool 51CTO博客,原文链接:http://blog.51cto.com/rfyiamcool/1286372,如需转载请自行联系原作者



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值