Go语言网络编程(TCP、HTTP、Beego框架)

Go语言网络编程(TCPHTTPBeego框架)

(一)TCP编程

涉及的包:net

1.服务端

  1. net.Listen()监听某个端口
  2. 循环获取连接,为每个连接开启一个Goroutine
  3. 在单独的Goroutine中读取每个连接的数据
  4. 关闭连接
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package main

import (
"fmt"
"net"
"strings"
)

func main() {
fmt.Println("TCP服务端启动……")

//监听50000端口
listen, err := net.Listen("tcp", "0.0.0.0:50000")

//错误处理
if err != nil {
fmt.Println("监听50000端口错误:", err)
return
}

//开启循环,获取连接
for {
conn, err := listen.Accept()
if err != nil {
fmt.Println("获取连接错误:", err)
return
}
//为每个连接开启一个Goroutine
go process(conn)
}
}

//连接处理函数
func process(conn net.Conn) {
//执行完关闭连接
defer conn.Close()

//开启循环,处理连接
for {
buf := make([]byte, 512)
n, err := conn.Read(buf)
if err != nil {
fmt.Println("读取数据失败:", err)
return
}
//打印接收到的数据
fmt.Printf(strings.TrimSpace(string(buf[0:n])))
}
}

2.客户端

  1. net.Dail()连接服务端的某个端口
  2. 收发数据
  3. 关闭连接
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package main

import (
"bufio"
"fmt"
"net"
"os"
"strings"
)

func main() {
//拨号,连接50000端口
conn, err := net.Dial("tcp", "localhost:50000")
if err != nil {
fmt.Println("连接服务端失败:", err)
return
}

//读取键盘输入
inputReader := bufio.NewReader(os.Stdin)
for {
input, _ := inputReader.ReadString('\n')
trimedInput := strings.Trim(input, "\r\n")
//输入Q退出
if trimedInput == "Q" {
return
}

//将数据写入连接,发送给服务端
_, err = conn.Write([]byte(trimedInput))
if err != nil {
return
}
}

//执行结束后关闭连接
defer conn.Close()
}

(二)HTTP编程

涉及的包:net/http

1.服务端

  1. http.HandleFunc()指定某个函数处理对应路径下的请求

    对应的处理函数接收w http.ResponseWriter, r *http.Request两个参数。

  2. http.ListenAndServe()监听某个端口的请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package main

import (
"fmt"
"net/http"
)

func main() {
http.HandleFunc("/", Hello)
if err := http.ListenAndServe("0.0.0.0:8080", nil); err != nil {
fmt.Println("HTTP开启失败!")
}
}

func Hello(w http.ResponseWriter, r *http.Request) {
fmt.Println("处理“localhost:8080/”路径下的请求")
fmt.Fprintf(w, "Hello World")
}

2.客户端

  1. http.Get(url string) (resp *Response, err error)
  2. http.Post(url, contentType string, body io.Reader) (resp *Response, err error)
  3. http.Head(url string) (resp *Response, err error)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package main

import (
"fmt"
"io/ioutil"
"net/http"
)

func main() {
response, err := http.Get("http://www.dragonbaby308.com/")
if err != nil {
fmt.Println("http.Get()错误:", err)
return
}

data, err := ioutil.ReadAll(response.Body)
if err != nil {
fmt.Println("读取响应数据错误:", err)
return
}

fmt.Println(string(data))
}

(三)Beego MVC框架

参考Beego开发文档》

  1. go get github.com/astaxie/beego下载Beego框架
  2. 创建如下目录结构:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
beego
├─controller :控制器层
├─IndexController :【/index控制器】
├─index.go
├─conf :配置
├─app.conf :【默认配置文件】
├─main :入口
├─main.go :【入口程序】
├─model :模型层
├─router :路由
├─router.go :【路由规则】
└─view :视图层
├─index
├─index.html :【/index模板】
  1. main/main.go中导入Beego框架,通过beego.Run()运行:
1
2
3
4
5
6
7
8
9
10
11
package main

import (
"github.com/astaxie/beego"
_ "router" //调用router的init()
)

func main() {
//运行Beego框架
beego.Run()
}
  1. router/router.go中创建路由规则:
1
2
3
4
5
6
7
8
9
10
11
package router

import "github.com/astaxie/beego"

func init() {
//路由规则:
//1.URL路径
//2.对应的控制器
//3.对应处理函数
beego.Router("/index", &IndexController.IndexController{}, "*:Index")
}
  1. controller/IndexController/index.go中继承Beego的控制器,配置模板:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package IndexController

import (
"github.com/astaxie/beego"
"github.com/astaxie/beego/logs"
)

//继承Beego的控制器
type IndexController struct {
beego.Controller
}

//处理函数
func (p *IndexController) Index() {
//打日志
logs.Debug("进入IndexController")

//1.【页面形式】
//配置模板
p.TplName = "index/index.html"

//2.【API形式】
//autorender=false,不再渲染页面,可以返回JSON类型的结果
// m := make(map[string]interface{})
// m["code"] = 200
// m["msg"] = "success"
// p.Data["json"] = m
// p.ServeJSON(true)
}
  1. view/index/index.html模板:
1
2
3
4
5
<html>
<body>
<p>Hello World!</p>
</body>
</html>
  1. Beego默认会解析conf/app.conf配置文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# IP地址
httpaddr = "127.0.0.1"

# 应用名
appname = beego_demo

# 是否自动渲染模板,默认true,返回渲染后的页面;
# 如果想要返回API类型的JSON数据,将其改为false
autorender = true

# 运行时环境
runmode = "dev"

# 开发环境
[dev]
# 端口,默认9090
httpport = 9090

# 生产环境
[prod]
# 端口
httpport = 9091

bee工具

参考bee 工具简介》

-------------本文结束感谢您的阅读-------------

本文标题:Go语言网络编程(TCP、HTTP、Beego框架)

文章作者:DragonBaby308

发布时间:2019年12月04日 - 23:37

最后更新:2019年12月05日 - 22:16

原始链接:http://www.dragonbaby308.com/go-web/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

急事可以使用右下角的DaoVoice,我绑定了微信会立即回复,否则还是推荐Valine留言喔( ఠൠఠ )ノ
0%