16网络编程

16.1tcp

client

  1. 建立与服务端的链接
  2. 进行数据收发
  3. 关闭链接
func main(){
	//与服务端建立连接
	conn, err := net.Dial("tcp", "127.0.0.1:20000")
	if err != nil{
		fmt.Printf("dial failed:%v\n", err)
		return
	}
	input := bufio.NewReader(os.Stdin)
	for{
		s, err := input.ReadString('\n')
		if err != nil{
			continue
		}
		//去掉空格
		s = strings.TrimSpace(s)
		if strings.ToUpper(s) == "Q"{
			return
		}
		//发消息
		_, err2 := conn.Write([]byte(s))
		if err != nil{
			fmt.Printf("send failed:%v", err2)
			return
		}
		//从服务端接受回复的消息
		var buf [1024]byte
		n , err3 := conn.Read(buf[:])
		if err3 !=nil{
			fmt.Printf("read failed, %v\n", err3)
		}
		fmt.Println("received msg:", string(buf[:n]))

	}
}

server

  1. 监听端口
  2. 接收客户端请求建立链接
  3. 创建goroutine处理链接。
func process(conn net.Conn){
	defer conn.Close()
	//针对当前的链接做数据的发送和接受工作
	for{
		reader := bufio.NewReader(conn)
		var buf [128]byte
		n, err := reader.Read(buf[:])
		if err != nil{
			fmt.Printf("err occured :%v\n", err)
			break
		}
		recv := string(buf[:n])
		fmt.Println("receive data:", recv)
		conn.Write([]byte("ok"))

	}

}

func main(){
	//开启服务
	listen, err := net.Listen("tcp", "127.0.0.1:20000")
	if err!=nil{
		fmt.Printf("err occured:%v\n", err)
		return
	}
	for{
		//等待客户端来建立链接
		conn, err := listen.Accept()
		if err != nil{
			fmt.Printf("err occured:%v\n", err)
		}
		//启动一个单独的goroutine来处理链接
		go process(conn)
	}
}

16.2udp

client

func main(){
	udp, err := net.DialUDP("udp", nil, &net.UDPAddr{
		IP:   net.IPv4(127, 0, 0, 1),
		Port: 30000,
	})
	if err != nil{
		fmt.Println("err occured---", err)
		return
	}
	defer udp.Close()
	for{
		input := bufio.NewReader(os.Stdin)

		//fmt.Println("input string:",input)
		s, _ := input.ReadString('\n')
		_, err2 := udp.Write([]byte(s))
		if err2 != nil{
			fmt.Println("-err-------")
			return
		}
		//接受数据
		var buf [1024]byte
		n, addr, err3 := udp.ReadFromUDP(buf[:])
		if err3 != nil{
			fmt.Println("error---:", err3)
		}
		fmt.Printf("read from%v, data :%v", addr, string(buf[:n]))
	}

}

server

func main(){
	listen, err := net.ListenUDP("udp", &net.UDPAddr{
		IP:   net.IPv4(127, 0, 0, 1),
		Port: 30000,
	})
	if err != nil{
		fmt.Printf("err occured when listen udp:%v", err)
	}
	defer listen.Close()
	for{
		var buf [1024]byte
		n, addr, err := listen.ReadFromUDP(buf[:])
		if err != nil{
			fmt.Println("err occured when read from udp:", err)
			return
		}
		//接受到的数据
		fmt.Println("接受到的数据为:", string(buf[:n]))
		//返回数据
		fmt.Println(addr)
		_, err2 := listen.WriteToUDP(buf[:n], addr)
		if err2 != nil{
			fmt.Printf("err occured:%v", err2)
			continue
		}


	}

}