关于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,如需转载请自行联系原作者



相关文章
|
网络协议 Unix Linux
# 2个类轻松构建高效Socket通信库
本文介绍了一种通过两个类`EpollEventHandler`和`IEpollEvent`构建高效Socket通信库的方法。该库支持TCP、UDP和Unix域套接字,采用I/O多路复用技术(如epoll),提升并发处理能力。通过抽象基类和具体事件类的设计,简化了API使用,便于开发者快速上手。文章还提供了服务端与客户端的实例代码,展示其在实际项目中的应用效果。此Socket库适应嵌入式环境,功能定制性强,有助于减少外部依赖并提升维护效率。
404 100
# 2个类轻松构建高效Socket通信库
|
JSON 编解码 API
Go语言网络编程:使用 net/http 构建 RESTful API
本章介绍如何使用 Go 语言的 `net/http` 标准库构建 RESTful API。内容涵盖 RESTful API 的基本概念及规范,包括 GET、POST、PUT 和 DELETE 方法的实现。通过定义用户数据结构和模拟数据库,逐步实现获取用户列表、创建用户、更新用户、删除用户的 HTTP 路由处理函数。同时提供辅助函数用于路径参数解析,并展示如何设置路由器启动服务。最后通过 curl 或 Postman 测试接口功能。章节总结了路由分发、JSON 编解码、方法区分、并发安全管理和路径参数解析等关键点,为更复杂需求推荐第三方框架如 Gin、Echo 和 Chi。
|
Python
python socket 简单通信
python socket 简单通信
263 1
|
网络协议 安全 网络安全
网络编程:基于socket的TCP/IP通信。
网络编程:基于socket的TCP/IP通信。
|
网络协议 开发者 Python
Socket如何实现客户端和服务器间的通信
通过上述示例,展示了如何使用Python的Socket模块实现基本的客户端和服务器间的通信。Socket提供了一种简单且强大的方式来建立和管理网络连接,适用于各种网络编程应用。理解和掌握Socket编程,可以帮助开发者构建高效、稳定的网络应用程序。
723 10
|
网络协议 Linux 应用服务中间件
Socket通信之网络协议基本原理
【10月更文挑战第10天】网络协议定义了机器间通信的标准格式,确保信息准确无损地传输。主要分为两种模型:OSI七层模型与TCP/IP模型。
|
Go API 开发者
深入探讨:使用Go语言构建高性能RESTful API服务
在本文中,我们将探索Go语言在构建高效、可靠的RESTful API服务中的独特优势。通过实际案例分析,我们将展示Go如何通过其并发模型、简洁的语法和内置的http包,成为现代后端服务开发的有力工具。
|
中间件 Go API
使用Go语言构建高性能RESTful API
在现代软件开发中,RESTful API因其简洁和高效而成为构建网络服务的首选。Go语言以其并发处理能力和高性能著称,是开发RESTful API的理想选择。本文将介绍如何使用Go语言构建RESTful API,包括基础的路由设置、中间件的使用、数据验证、错误处理以及性能优化。通过实际代码示例,我们将展示Go语言在API开发中的强大功能和灵活性。
|
JSON Go API
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
|
安全 API 开发者
Web 开发新风尚!Python RESTful API 设计与实现,让你的接口更懂开发者心!
在当前的Web开发中,Python因能构建高效简洁的RESTful API而备受青睐,大大提升了开发效率和用户体验。本文将介绍RESTful API的基本原则及其在Python中的实现方法。以Flask为例,演示了如何通过不同的HTTP方法(如GET、POST、PUT、DELETE)来创建、读取、更新和删除用户信息。此示例还包括了基本的路由设置及操作,为开发者提供了清晰的API交互指南。
343 6