TCP和UDP
package main
import (
"bufio"
"bytes"
"encoding/binary"
"fmt"
"io"
"net"
"strconv"
"strings"
"time"
)
func tcpServer() {
listener, err := net.Listen("tcp", "127.0.0.1:20001")
if err != nil {
fmt.Println("启动TCP服务器失败, 原因是:", err)
return
}
for {
conn, err := listener.Accept()
if err != nil {
fmt.Println("Accept 失败, 原因是:", err)
return
}
go handleRequest(conn)
}
}
func handleRequest(conn net.Conn) {
defer conn.Close()
var tmp = [128]byte{}
n, err := conn.Read(tmp[:])
if err != nil {
fmt.Println("读取数据失败, 原因是:", err)
return
}
fmt.Println(string(tmp[:n]))
}
func tcpClient(i int) {
conn, err := net.Dial("tcp", "127.0.0.1:20001")
defer conn.Close()
if err != nil {
fmt.Println("连接失败, 原因是:", err)
return
}
conn.Write([]byte("Hello world from " + strconv.Itoa(i)))
}
func tcpConnectTest() {
go tcpServer()
time.Sleep(time.Second)
for i := 0; i < 10; i++ {
tcpClient(i)
}
time.Sleep(time.Second * 5)
}
func pkgSplicing() {
server := func() {
listener, _ := net.Listen("tcp", "127.0.0.1:20002")
for {
conn, _ := listener.Accept()
go func(conn net.Conn) {
defer conn.Close()
reader := bufio.NewReader(conn)
var buf = make([]byte, 64)
for {
lengthByte := [4]byte{}
n, err := reader.Read(lengthByte[:])
if err == io.EOF {
break
}
var length int32 = 0
binary.Read(bytes.NewBuffer(lengthByte[:]), binary.LittleEndian, &length)
n, _ = reader.Read(buf[:length])
fmt.Println("服务器收到数据", string(buf[:n]))
}
}(conn)
}
}
client := func() {
conn, _ := net.Dial("tcp", "127.0.0.1:20002")
defer conn.Close()
for i := 0; i < 20; i++ {
bytesToSend := []byte("Hello World!")
binary.Write(conn, binary.LittleEndian, int32(len(bytesToSend)))
_, _ = conn.Write(bytesToSend)
}
}
go server()
time.Sleep(time.Second)
go client()
time.Sleep(time.Second * 5)
}
func UDPServer() {
conn, err := net.ListenUDP("udp", &net.UDPAddr{
IP: net.IPv4(127, 0, 0, 1),
Port: 20003,
})
if err != nil {
fmt.Println("listen UDP failed,", err)
return
}
defer conn.Close()
var data = [1024]byte{}
for {
n, addr, err := conn.ReadFromUDP(data[:])
if err != nil {
fmt.Println("ReadFromUDP failed,", err)
return
}
fmt.Println(string(data[:n]))
n, err = conn.WriteToUDP([]byte(strings.ToUpper(string(data[:n]))), addr)
}
}
func UDPClient() {
socket, err := net.DialUDP("udp", nil, &net.UDPAddr{
IP: net.IPv4(0, 0, 0, 0),
Port: 20003,
})
if err != nil {
fmt.Println("连接服务器失败,", err)
return
}
defer socket.Close()
_, err = socket.Write([]byte("I love you"))
reply := make([]byte, 1024)
n, _, err := socket.ReadFromUDP(reply[:])
fmt.Println(string(reply[:n]))
}
func udpConnectTest() {
go UDPServer()
time.Sleep(time.Second)
UDPClient()
time.Sleep(time.Second)
}
HTTP
package main
import (
"fmt"
"io/ioutil"
"net/http"
"net/url"
"time"
)
func httpServer() {
http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) {
str := "<h1>Hello World!</h1>"
writer.Write([]byte(str))
bytes, _ := ioutil.ReadFile("go-learn/bin/new.txt")
writer.Write(bytes)
})
http.HandleFunc("/query", getParamsOfRequest())
http.ListenAndServe("127.0.0.1:20001", nil)
}
func httpServerTest() {
httpServer()
}
func httpClient() {
response, err := http.Get("http://127.0.0.1:20001/query?name=wbq")
if err != nil {
fmt.Println("get url failed,", err)
return
}
bytes, err := ioutil.ReadAll(response.Body)
if err != nil {
fmt.Println("read response.Body failed,", err)
return
}
fmt.Println(string(bytes))
}
func getParamsOfRequest() func(writer http.ResponseWriter, request *http.Request) {
return func(writer http.ResponseWriter, request *http.Request) {
query := request.URL.Query()
name := query.Get("name")
fmt.Println(name)
fmt.Println(request.URL)
fmt.Println(request.Method)
fmt.Println(ioutil.ReadAll(request.Body))
writer.Write([]byte("ok"))
}
}
func httpClientTest() {
go httpServer()
time.Sleep(time.Second)
httpClient()
}
func httpClientWithChinese() {
data := url.Values{}
data.Set("name", "张飞")
queryStr := data.Encode()
urlObj, _ := url.Parse("http://127.0.0.1:20001/query")
urlObj.RawQuery = queryStr
request, _ := http.NewRequest("GET", urlObj.String(), nil)
tr := &http.Transport{DisableKeepAlives: true}
client := http.Client{Transport: tr}
response, _ := client.Do(request)
defer response.Body.Close()
fmt.Println(ioutil.ReadAll(response.Body))
}
func httpClientWithChineseTest() {
go httpServer()
time.Sleep(time.Second)
httpClientWithChinese()
}