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("你好"))
}