實作練習-點對點聊天
尚硅谷Golang課
實作練習-點對點聊天
server.go
func main() {
fmt.Println("伺服器開始監聽")
listen, err := net.Listen("tcp", "0.0.0.0:8888") //0.0.0.0 寫4位ip v4 v6都能用
if err != nil {
fmt.Println("監聽失敗", err)
return
}
defer listen.Close() //主程式退出後就關閉監聽
// fmt.Printf("listen succes=%v\n", listen)
for {
//開啟監聽端口8888
time.Sleep(time.Microsecond)
fmt.Println("等待連接中...")
conn, err := listen.Accept()
if err != nil {
fmt.Println("Accept()err=", err)
} else {
fmt.Printf("conn suc con=%v 客戶端ip=%v\n", conn, conn.RemoteAddr().String())
}
//準備啟動一個協程
go process(conn)
}
}
func process(conn net.Conn) {
//循環接收客戶端送來的數據
defer conn.Close()
fmt.Printf("伺服器等待%s客戶端輸入...\n", conn.RemoteAddr().String())
for {
//創建一個新的切片
buf := make([]byte, 1024)
n, err := conn.Read(buf) //從conn讀取
//等待客戶端通過conn發送信息
//如果客戶端沒有write,那協程就阻塞在這
if err != nil {
fmt.Println("客戶端Read err", err)
return
}
fmt.Print(string(buf[:n])) //不用換行因為接收來的就包含\n
//來的是一個byte切片 讀到[:n]剛好,後面還有玩意不是要的
}
}
client.go
func main() {
conn, err := net.Dial("tcp", "127.0.0.1:8888")
if err != nil {
fmt.Println("client dial err=", err)
return
}
fmt.Printf("conn suc con=%v 主機端ip=%v\n", conn, conn.RemoteAddr().String())
//客戶端讀取輸入行
for {
reader := bufio.NewReader(os.Stdin) //代表標準輸入(終端)
fmt.Println("等待輸入... (exit=離開)")
data, err := reader.ReadString('\n') //代表接受到\n為止
if err != nil {
fmt.Println("ReadString", err)
}
//如果輸入exit就退出
line := strings.Trim(data, "\n\r")
if line == "exit" {
fmt.Println("客戶端已退出")
break
}
//從客戶端發送數據
n, err := conn.Write([]byte(data))
if err != nil {
fmt.Println("conn.Write", err)
}
fmt.Printf("客戶端發送了%d字節的數據\n", n)
}
}
上次修改於 2021-08-01
此篇文章的評論功能已經停用。