go langTCP開啟示例
阿新 • • 發佈:2020-12-29
傳送給伺服器要用 utf8 編碼方式
package main
import (
"fmt"
"net"
)
var serverChan chan bool = make(chan bool, 1)
func OpenTcpSever(ipAndPort string) {
var err error
var tcpListener net.Listener
tcpListener, err = net.Listen("tcp", ipAndPort)
if err != nil {
serverChan <- false
return
}
defer tcpListener.Close()
serverChan <- true
for {
con, err := tcpListener.Accept()
if err != nil {
continue
}
fmt.Println(con.RemoteAddr(), "客戶端連線成功.")
go AccessClient(con)
}
}
func AccessClient(con net.Conn) {
buffer := make([]byte, 1024*2)
var (
recNu int
err error
resSplice []byte
)
defer con.Close()
for {
recNu, err = con.Read(buffer)
if err != nil {
break
}
fmt.Printf("服務端收到客戶端[%v]命令:%v\n", con.RemoteAddr(), string(buffer[:recNu]))
resSplice = responStr(buffer[:recNu])
_, err = con.Write(resSplice)
if err != nil {
break
} else {
fmt.Printf("服務端回覆客戶端[%v]命令:%v\n", con.RemoteAddr(), string(resSplice))
}
}
fmt.Println(con.RemoteAddr(), "異常退出!")
}
func main() {
//1. 開啟一個監聽服務端
serverIP := "127.0.0.1:5200"
go OpenTcpSever(serverIP)
//2. 檢驗服務是否開啟成功
serBl := <-serverChan
if serBl {
fmt.Println("監聽本地埠", serverIP, "成功,等待客戶端連線。")
fmt.Println("輸入quite退出服務端...")
var uIn string
for {
fmt.Scanln(&uIn)
if uIn == "quite" {
break
}
fmt.Println("輸入退出命令錯誤!!!請輸入quite退出服務端")
}
} else {
fmt.Println("監聽本地埠", serverIP, "失敗!")
}
close(serverChan)
}
//根據伺服器接收到的命令去返回命令
func responStr(data []byte) []byte {
recStr := string(data)
resStr := "你說啥..."
switch recStr {
case "who are you?":
resStr = "我是小兵張嘎"
case "你的性別?":
resStr = "你猜猜看啦"
case "你會什麼":
resStr = "我會講故事"
case "你講個吧":
recStr = "從前有座bai山,山上有座廟,du廟裡有個老和尚,老zhi和尚的dao身邊有三個和尚——頑皮zhuan的小和尚、貪吃的shu胖和尚和匆忙的瘦和尚,老和尚在給三個和尚講故事,故事是這樣的:一個和尚挑水吃,兩個和尚抬水吃,三個和尚沒水吃。"
default:
}
return []byte(resStr)
}