关于Go语言在服务端做Restful接口和socket通信
时间:2022-05-05
本文章向大家介绍关于Go语言在服务端做Restful接口和socket通信,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
关于REST的定义,我就不扯了~ 大家可以看我以前的博文。
下图即是REST的架构图:
当REST架构的约束条件作为一个整体应用时,将生成一个可以扩展到大量客户端的应用程序。它还降低了客户端和服务器之间的交互延迟。统一界面简化了整个系统架构,改进了子系统之间交互的可见性。REST简化了客户端和服务器的实现,而且对于使用REST开发的应用程序更加容易扩展。
其实说白了,就是根据不同的方法,来分类不同的任务~
package mainimport (
"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.ccfunc 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
结果:
接着咱们再说下 go的socket 。
客户端的情况
服务端的情况:
server.go
package mainimport (
"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: %sn", con.RemoteAddr(), res)
res = "You said:" + res
con.Write([]byte(res))
}
}(conn)
}}
Client的go代码
package mainimport (
"fmt"
"net"
"os")var str stringvar 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("%sn", &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: %dn", 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 mainimport (
"fmt"
"runtime")func say(s string) {
for i := 0; i < 5; i++ {
runtime.Gosched()
fmt.Println(s)
}}func main() {
go say("world")
say("end")}
这里就简单的讲讲,深入的话,大家自己找官方的资料。
- 【干货】基于TensorFlow卷积神经网络的短期股票预测
- [编程经验] 基于bs4的拉勾网AI相关工作爬虫实现
- [编程经验] 链家23个全国主要城市的现房数据分析
- [编程经验] Python中的modlue和packages的区别
- Day5上午解题报告
- [编程经验] Pandas中比较好用的几个方法
- [编程经验] Elasticsearch 初识
- 2017.10.26水题大作战部分题解
- 2017.10.27涩会题大乱斗部分题解
- 【 关关的刷题日记50】 Leetcode 345. Reverse Vowels of a String
- Day1上午解题报告
- 【 关关的刷题日记51】 Leetcode 67. Add Binary
- 【 关关的刷题日记53】 Leetcode 100. Same Tree
- Day1下午解题报告
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux下的I/O复用与epoll详解
- 时间序列&日期学习笔记大全(上)
- LeetCode 题解:一顿操作猛如虎,一看击败百分五
- 这是什么沙雕题目?测试用例居然有人身高为 0 ??
- 深入解读flink sql cdc的使用以及源码分析
- markdown mermaid 画图
- 面试汇总(五):操作系统常见面试总结(一):进程与线程的相关知识点
- 面试汇总(六):操作系统常见面试总结(二):系统相关的问题
- Android 利用V4L2 调用camera
- Android基础--利用ANativeWindow显示视频
- Python如何爬取b站热门视频并导入Excel
- 代码详解——改变控制器的参考速度
- Python爬虫之JS的解析
- Python爬虫之chrome在爬虫中的使用
- Python爬虫之打码平台的使用