Go語言學習筆記21.socket編程

socket編程分爲TCP和UDP的,和C的套接字編程原理一樣。
可以參考:https://blog.csdn.net/happy_teemo/article/details/78441982

TCP

服務端:

package main

import (
	"fmt"
	"net"
)

func main() {
	//監聽
	listener, err := net.Listen("tcp", "127.0.0.1:8000")
	if err != nil {
		fmt.Println("err = ", err)
		return
	}

	//關閉監聽
	defer listener.Close()

	//阻塞等待用戶鏈接
	conn, err := listener.Accept()
	if err != nil {
		fmt.Println("err = ", err)
		return
	}

	//接收用戶的請求
	buf := make([]byte, 1024) //1024大小的緩衝區
	n, err1 := conn.Read(buf)
	if err1 != nil {
		fmt.Println("err1 = ", err1)
		return
	}

	fmt.Println("buf = ", string(buf[:n]))

	defer conn.Close() //關閉當前用戶鏈接
}

客戶端:

package main

import (
	"fmt"
	"net"
)

func main() {
	//主動連接服務器
	conn, err := net.Dial("tcp", "127.0.0.1:8000")
	if err != nil {
		fmt.Println("err = ", err)
		return
	}

	//延時關閉
	defer conn.Close()

	//發送數據
	conn.Write([]byte("你好"))

}

UDP

服務端不用和客戶端握手連接了

package main

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

func main() {

	addr, err := net.ResolveUDPAddr("udp", "127.0.0.1:8000")
	if err != nil {
		fmt.Println("Can't resolve address: ", err)
		os.Exit(1)
	}

	//監聽
	listener, err := net.ListenUDP("udp", addr)
	if err != nil {
		fmt.Println("err = ", err)
		return
	}

	//關閉監聽
	defer listener.Close()

	//接收用戶的請求
	for {
		data := make([]byte, 1024)
		n, remoteAddr, err := listener.ReadFromUDP(data)
		if err != nil {
			fmt.Println("failed to read UDP msg because of ", err.Error())
			return
		}
		fmt.Println(n, remoteAddr)//長度和IP
		fmt.Println("buf = ", string(data[:n])) //打印內容
	}
}

客戶端:

package main

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

func main() {
	//主動連接服務器
	addr, err := net.ResolveUDPAddr("udp", "127.0.0.1:8000")
	if err != nil {
		fmt.Println("Can't resolve address: ", err)
		os.Exit(1)
	}
	conn, err := net.DialUDP("udp", nil, addr)
	if err != nil {
		fmt.Println("Can't dial: ", err)
		os.Exit(1)
	}

	//延時關閉
	defer conn.Close()

	//發送數據
	conn.Write([]byte("你好"))

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章