1. tcp 服务器端
TCP:传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议 。
步骤:
- 监听一个端口。
- 接受客户端的请求。
- 启动 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 客户端
步骤:
- 与服务器端建立连接。
- 给服务器端发送请求。
代码 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))
}