實作練習-點對點聊天
尚硅谷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

此篇文章的評論功能已經停用。