go tcp udp http 学习笔记

1,241 阅读2分钟
1. tcp 服务器端

TCP:传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议 。

步骤:

  1. 监听一个端口。
  2. 接受客户端的请求。
  3. 启动 goroutine 处理客户端的请求。

代码 demo

package main

import (
	"fmt"
	"net"
)

//读取客户端的信息,并打印到控制台
func getMessage(conn net.Conn) {
	//关闭连接
	defer conn.Close()
	//初始化字节切片
	b := make([]byte, 128)
	//读取信息
	for {
		_, err := conn.Read(b)
		if err != nil {
			fmt.Printf("read err:%v\n", err)
			return
		}
		fmt.Printf("client message:%s\n", string(b))
	}
}

func main() {
	//监听端口 net.Listen()
	listener, err := net.Listen("tcp", "127.0.0.1:8080")
	if err != nil {
		fmt.Printf("net Listen err:%v\n", err)
		//发生错误后面的代码就不执行了,直接 return
		return
	}
	//循环,接受来自客户端的请求
	//listener.Accept()
	for {
		conn, err := listener.Accept()
		if err != nil {
			fmt.Printf("accept err:%v\n", err)
			continue
		}
		//启动 goroutine 处理请求
		go getMessage(conn)
	}
}

2. tcp 客户端

步骤:

  1. 与服务器端建立连接。
  2. 给服务器端发送请求。

代码 demo

package main

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

func main() {
	//与服务器端建立连接
	conn, err := net.Dial("tcp", "127.0.0.1:8080")
	if err != nil {
		fmt.Printf("Dial err:%v\n", err)
		return
	}
	//关闭
	defer conn.Close()
	for {
		//使用bufio从键盘接受输入
		reader := bufio.NewReader(os.Stdin)
		//读取一行
		b, _, _ := reader.ReadLine()
		_, err := conn.Write(b)
		if err != nil {
			fmt.Printf("Write err :%v\n", err)
			return
		}
	}
}

3. udp 服务器端

UDP: 用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。

代码demo

package main

import (
	"fmt"
	"net"
)

func main() {
	//监听端口
	listen, err := net.ListenUDP("udp", &net.UDPAddr{
		IP:   net.IPv4(0, 0, 0, 0),
		Port: 9090,
	})
	if err != nil {
		fmt.Printf("listen err %v\n", err)
		return
	}

	for {
		//读取来自客户端的消息
		var b [1024]byte
		n, addr, err := listen.ReadFromUDP(b[:])
		if err != nil {
			fmt.Printf("read from udp err :%v\n", err)
			break
		}
		fmt.Printf("add :%v,client message:%s\n", addr, string(b[:n]))
		//给请求的客户端写消息
		_, err = listen.WriteToUDP([]byte("i'am service"), addr)
		if err != nil {
			fmt.Printf("WriteToUDP err :%v\n", err)
		}

	}
}

4. udp 客户端

代码 demo

package main

import (
	"fmt"
	"net"
)

func main() {
	//建立连接
	conn, err := net.DialUDP("udp", nil, &net.UDPAddr{
		IP:   net.IPv4(127, 0, 0, 1),
		Port: 9090,
	})

	if err != nil {
		fmt.Printf("conn err:%v\n", err)
	}
	//write
	_, err = conn.Write([]byte("hello world"))
	if err != nil {
		fmt.Printf("Write err:%v\n", err)
	}
	//read
	var b [1024]byte
	n, addr, err := conn.ReadFromUDP(b[:])
	if err != nil {
		fmt.Printf("read err:%v\n", err)
	} else {
		fmt.Printf("addr:%v ,service message:%s\n", addr, string(b[:n]))
	}

}

5. http 请求

HTTP: http是一个简单的请求-响应协议,它通常运行在TCP之上。

使用 http.Get 方法

代码 demo

package main

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

func main() {
	res, err := http.Get("https://www.baidu.com/")
	if err != nil {
		fmt.Printf("err:%v\n", err)
		return
	}
	defer res.Body.Close()
	b, _ := ioutil.ReadAll(res.Body)
	fmt.Println(string(b))

}

使用 http.Post 方法

代码 demo

package main

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

func main(){
//这是调用的自己的一个 post 接口	resp,err:=http.Post("http://127.0.0.1:8080/hello","application/json",strings.NewReader(""))
	if err!=nil{
		fmt.Println(err)
		return 
	}
	defer resp.Body.Close()
	b,err:=ioutil.ReadAll(resp.Body)
	if err!=nil{
		fmt.Println(err)
	}else{
		fmt.Println(string(b))
	}

}

使用 Client.Do 方法,使用这种方式可以自己设置请求头的参数,比较灵活。

代码 demo

package main

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

func main() {
	//返回 &Client{}
	c := http.DefaultClient
	//可以通过改 http.NewRequest 的第一个参数来 变成 post 请求
	request, err := http.NewRequest(http.MethodGet, "https://www.baidu.com/", nil)
	//可以通过 request.Header 设置请求头的信息
	//request.Header.Set()
	if err != nil {
		return
	}
	resp, _ := c.Do(request)
	defer resp.Body.Close()
	b, _ := ioutil.ReadAll(resp.Body)
	fmt.Println(string(b))

}