說完tcp和udp的區(qū)別,就要開始講講如何用go進(jìn)行連接了。
話不多說斗这,上代碼斤寇。
package main
import (
"net"
"fmt"
"io"
)
func main() {
// 創(chuàng)建 監(jiān)聽器 參1 為 tcp或udp 必須小寫 參2則是地址+端口號
list,err := net.Listen("tcp","127.0.0.1:8888")
if err != nil {
fmt.Println("Listen err:",err)
}
defer list.Close() // 創(chuàng)建后記住關(guān)閉
for {
//與客戶端建立socket連接
// 死循環(huán)是為了于多個(gè)用戶進(jìn)行連接通信
conn,err := list.Accept()
if err != nil {
fmt.Println("Accept err:", err)
continue
}
go con(conn) //連接后進(jìn)入子go程 負(fù)責(zé)與用戶進(jìn)行交互 不阻塞其他用戶
}
}
func con(conn net.Conn){
defer conn.Close()
for{
bytes := make([]byte,4096)
n,err := conn.Read(bytes) //讀數(shù)據(jù)
if n == 0 {
fmt.Println(conn.RemoteAddr().String())
return
}
if err != nil && err != io.EOF {
fmt.Println("read err:",err)
return
}
str := Str(string(bytes[:n]))
conn.Write([]byte(str)) //寫數(shù)據(jù)
}
}
func Str(str string) string { //字母大小寫轉(zhuǎn)換
fmt.Println(str)
str1 := []rune(str)
for i := 0; i < len(str1); i++ {
if str1[i] >= 65 && str1[i] <= 91 {
str1[i] += 32
} else if str1[i] >= 97 && str1[i] <= 123 {
str1[i] -= 32
}
}
return string(str1)
}