关于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


package main
import (
   "fmt"
   "github.com/drone/routes"
   "net/http"
)
func getuser(w http.ResponseWriter, r *http.Request) {
   params := r.URL.Query()
   uid := params.Get(":uid")
   fmt.Fprintf(w, "you are get user %s", uid)
}
func modifyuser(w http.ResponseWriter, r *http.Request) {
   params := r.URL.Query()
   uid := params.Get(":uid")
   fmt.Fprintf(w, "you are modify user %s", uid)
}
func deleteuser(w http.ResponseWriter, r *http.Request) {
   params := r.URL.Query()
   uid := params.Get(":uid")
   fmt.Fprintf(w, "you are delete user %s", uid)
}
func adduser(w http.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)
}
//xiaorui.cc
func main() {
   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


结果:

164646894.jpg


接着咱们再说下 go的socket 。

客户端的情况

164847759.jpg


服务端的情况:

164930482.jpg


server.go

package main
import (
   "fmt"
   "net"
   "os"
)
func main() {
   var (
       host   = "127.0.0.1"
       port   = "8080"
       remote = host + ":" + port
       data   = 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 string
       conn, 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:" + res
               con.Write([]byte(res))
           }
       }(conn)
   }
}


client.go


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)
   }
}


Go的并发模式


package main
import (
       "fmt"
       "runtime"
)
func say(s string) {
       for i := 0; i < 5; i++ {
               runtime.Gosched()
               fmt.Println(s)
       }
}
func main() {
       go say("world")
       say("end")
}


结果:

165326909.jpg


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402370.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UVa 11136 - Hoax or what

题目大意&#xff1a;超市进行促销活动&#xff0c;顾客可以把账单放到一个箱子里&#xff0c;每天超市会从箱子中抽出最高消费者和最低消费者&#xff0c;最高消费者可以得到&#xff08;最高消费-最低消费&#xff09;的金钱。询问超市在n天的促销活动结束后应支付多少钱。 找…

Winfrom实现圆角设计

主要代码 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Paint(object sender, PaintEventArgs e) { Type(this, 25, 0.1); } private void…

Linux 系统应用编程——进程基础

一、Linux下多任务机制的介绍 Linux有一特性是多任务&#xff0c;多任务处理是指用户可以在同一时间内运行多个应用程序&#xff0c;每个正在执行的应用程序被称为一个任务。 多任务操作系统使用某种调度(shedule)策略&#xff08;由内核来执行&#xff09;支持多个任务并发执行…

【Python文件处理】递归批处理文件夹子目录内所有txt数据

因为有个需求&#xff0c;需要处理文件夹内所有txt文件&#xff0c;将txt里面的数据筛选&#xff0c;重新存储。 虽然手工可以做&#xff0c;但想到了python一直主张的是自动化测试&#xff0c;就想试着写一个自动化处理数据的程序。 一.分析数据格式 需要处理的数据是txt格式存…

Windows Azure 之服务总线中继服务

Windows Azure的服务总线允许在Web服务内部与外部之间做成一个公共的连接点&#xff0c;在无需更改企业防火墙或者其他安全配置的情况下连接内部和外部的服务 而使用Azure云服务的时候由于缩放的原因通过IP来制定连接也是不科学的&#xff0c;而中继服务则可以充当很好的公共连…

【qt】QT 的信号与槽机制

QT 是一个跨平台的 C GUI 应用构架&#xff0c;它提供了丰富的窗口部件集&#xff0c;具有面向对象、易于扩展、真正的组件编程等特点&#xff0c;更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT 库的基础之上。 QT 支持下列平台&#xff1a;MS/WINDOWS-9…

Linux 系统应用编程——进程间通信(上)

现在再Linux应用较多的进程间通信方式主要有以下几种&#xff1a; 1&#xff09;无名管道&#xff08;pipe&#xff09;及有名管道&#xff08;fifo&#xff09;&#xff1a;无名管道可用于具有亲缘关系进程间的通信&#xff1b;有名管道除具有管道相似的功能外&#xff0c;它还…

通过JDBK操作数据库

一、配置程序——让我们程序能找到数据库的驱动jar包1.把.jar文件复制到项目中去,整合的时候方便。2.在eclipse项目右击“构建路径”--“配置构建路径”--“库”--“添加外部jar”--找到数据库的驱动jar包--点击确定。会在左侧包资源管理器中出现“引用的库”&#xff0c;在里面…

Linux 系统应用编程——网络编程(常用命令解析)

1、telnet Telnet协议是TCP/IP协议族中的一员&#xff0c;是Internet远程登陆服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序&#xff0c;用它连接到服务器。终端使用者可以在telnet程序中输入命令&#…

灾难 BZOJ 2815

灾难 【样例输入】 5 0 1 0 1 0 2 3 0 2 0 【样例输出】 4 1 0 0 0 题解&#xff1a; 先跑出拓扑序 我们按拓扑序建立一棵“灭绝树” 灭绝树含义是当一个点灭绝时&#xff0c;它的子树将会全部灭绝 所以答案就是点在灭绝树中的子树大小 一个点如果灭绝&#xff0c;那么需要所有…

centos关于”running yum-complete-transaction first...

2019独角兽企业重金招聘Python工程师标准>>> 今天在用yum安装软件出错几次户&#xff0c;总是有提示信息&#xff1a; There are unfinished transactions remaining. You might consider running yum-complete-transaction first to finish them. The program yum…

js身份证号、电话脱敏处理(用*替换中间数据)

数字类型 certificatecodecopy certificatecode.replace(/^(.{6})(?:\d)(.{4})$/, "\$1****\$2"); 所有类型 enginenocopy engineno.replace(/^(.{2})(?:\w)(.{1})$/, "\$1****\$2"); enginenocopy engineno.replace(/^(.{4})(?:\w)(.{4})$/, &…

Linux 系统应用编程——网络编程(I/O模型)

Unix下可用的5种I/O模型&#xff1a;阻塞I/O非阻塞I/OI/O复用(select和poll)信号驱动I/O(SIGIO)异步I/O(POSIX的aio_系列函数)一个输入操作通常包括两个不同的阶段&#xff1a;1&#xff09;等待数据准备好&#xff1b;2&#xff09;从内核向进程复制数据&#xff1b;对于一个套…

Linux 系统应用编程——网络编程(TCP/IP 数据包格式解析)

图中括号中的数字代表的是当前域所占的空间大小&#xff0c;单位是bit位。 黄色的是数据链路层的头部&#xff0c;一共14字节 绿色的部分是IP头部&#xff0c;一般是20字节 紫色部分是TCP头部&#xff0c;一般是20字节 最内部的是数据包内容 黄色部分&#xff1a;链路层 目的MA…

Linux 系统应用编程——网络编程(TCP 协议三次握手过程)

TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对主机层的传输控制协议&#xff0c;提供可靠的连接服务&#xff0c;采用三次握手确认建立一个连接: 位码即tcp标志位,有6种标示: SYN ( synchronous 建立联机 ) ACK ( acknowledgement 确认 ) PSH ( push 传送…

基于ELK的简单数据分析

原文链接&#xff1a; http://www.open-open.com/lib/view/open1455673846058.html 环境 CentOS 6.5 64位JDK 1.8.0_20Elasticsearch 1.7.3LogStash 1.5.6Kibana 4.1.4介绍 ElasticSearch是有名的开源搜索引擎&#xff0c;现在很多公司使用ELK技术栈做日志分析&#xff0c;比如…

[win10] 在桌面上显示计算机、控制面板、网络

1. 右击桌面&#xff0c;选择个性化 2. 选择”主题", 点击“桌面图标设置” 3. 把想要放桌面的图标给钩上

linux下共享文件夹(windows可访问,linux也可访问)

2019独角兽企业重金招聘Python工程师标准>>> 本文是转字网上的两段&#xff0c;如果是菜鸟&#xff0c;想懂有点难度&#xff0c;我这里给点注释 在linux上共享文件夹windows下看 ******************************************* 首先给linux设一个ip&#xff0c;要和…

Linux---进程调度相关命令解析

进程相关命令 1、ps 查看系统中的进程 使用方式&#xff1a;ps [options] [--help] 说明&#xff1a;显示瞬间进程 (process) 的动态 参数&#xff1a;ps的参数非常多, 在此仅列出几个常用的参数并大略介绍含义 ps命令常用用法&#xff08;方便查看系统进程&#xff09; 1&a…

Linux 系统应用编程——多线程经典问题(生产者-消费者)

“生产者——消费者”问题是Linux多线程编程中的经典问题&#xff0c;主要是利用信号量处理线程间的同步和互斥问题。 “生产者——消费者”问题描述如下&#xff1a; 有一个有限缓冲区&#xff08;这里用有名管道实现 FIFO 式缓冲区&#xff09;和两个线程&#xff1a;生产者和…