go socket、http網路程式設計demo

wcu1117發表於2022-04-11

1、socket通訊

  服務端接收資料

  

package main

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

func main() {
	//建立監聽
	ip := "127.0.0.1"
	port := 8848
	address := fmt.Sprintf("%s:%d",ip,port)
	listen, err := net.Listen("tcp", address)
	if err != nil {
		fmt.Println(err)
		return
	}
	//一直輪詢監聽
	for {
		fmt.Println("監聽中...")
		//接收資料
		conn, err := listen.Accept()
		if err != nil {
			fmt.Println("accept",err)
			return
		}
		fmt.Println("連線成功")
		//啟動多個處理回撥
		go handle(conn)
	}
}

func handle(conn net.Conn)  {
	for{
		//建立一個容器,用於接受讀取到的資料
		buf := make([]byte,1024)
		//cnt真正讀取客戶端發來的資料長度
		fmt.Println("準備讀取傳送過來的資料")
		cnt, err := conn.Read(buf)
		if err != nil {
			fmt.Println("cnt err",err)
			return
		}
		//只輸出收到的長度
		fmt.Println("長度:",cnt,"---資料:",string(buf[:cnt]))
		//將資料轉成大寫
		upperData := strings.ToUpper(string(buf[:cnt]))
		write, err := conn.Write([]byte(upperData))
		if err != nil {
			fmt.Println("write err",err)
			return
		}
		fmt.Println("長度:",write,"---資料:",upperData)
	}
	//關閉
	conn.Close()
}

  socket客戶端請求

  

func main() {
	dial, err := net.Dial("tcp", ":8848")
	if err != nil {
		panic(err)
	}
	fmt.Println("connect success")
	//不斷重複傳送多次
	for {
		//傳送資料
		sendData := []byte("hello world")
		write, err := dial.Write(sendData)
		if err != nil {
			panic(err)
		}
		fmt.Println("send :",write,"--sendData:",string(sendData))

		//接收伺服器返回
		buf := make([]byte,1024)
		read, err := dial.Read(buf)
		if err != nil {
			panic(err)
		}
		time.Sleep(time.Second)
		fmt.Println("client receive,",read,"--receive data:",string(buf[:read]))
	}
	defer dial.Close()
}

 

 

2、http服務請求

  服務端

func main() {
	//註冊路由
	http.HandleFunc("/user", func(writer http.ResponseWriter, request *http.Request) {
		//write 將資料返回給客戶端
		//request 請求資料
		fmt.Println("method:",request.Method,request)
		io.WriteString(writer,"這是返回的資料")
	})
	if err := http.ListenAndServe("127.0.0.1:8080",nil); err != nil {
		panic(err)
	}
}

  客戶端請求

func main() {
	//http包
	client := http.Client{}
	rsp, err := client.Get("http://127.0.0.1:8080")
	if err != nil {
		panic(err)
	}
	fmt.Println(rsp,rsp.Body,rsp.Header.Get("Content-Type"))
}

  

  

相關文章