网络编程--UDP通信并发版C/S

server端:

   由于udp不需要建立连接,因此在读客户端数据的时候,使用for循环即可。相当于多个客户端的请求被排列在通道中,服务器循环读取通道中的数据。但是在回发数据给客户端的时候,可以开启goroutine,并发的把数据回发的多个客户端。

package main

import (
	"fmt"
	"net"
	"time"
)

func main()  {

	//1.指定服务器的IP+port,返回一个ListenUDP()函数需要的服务器地址结构serUdpAddr
	serUdpAddr,err := net.ResolveUDPAddr("udp","127.0.0.1:8001")
	if err != nil{
		fmt.Println("net.ResolveUDPAddr err",err)
		return
	}
	fmt.Println("UDP服务器地址结构创建完成")

	//2.由上面得到的地址结构serUdpAddr,创建用于通信的socket--udpConn
	udpConn,err := net.ListenUDP("udp",serUdpAddr)
	if err != nil{
		fmt.Println("net.ListenUDP err",err)
		return
	}
    defer udpConn.Close()
	fmt.Println("UDP服务器通信socket创建完成")

	for  {//主goroutine中循环读取每一个客户端发来的数据(串行)

		//3.读取客户端发送的数据
		buf := make([]byte,4096)
		//返回3个值,分别是读到字节数n,客户端的地址结构cliUdpAddr,错误error
		n,cliUdpAddr,err := udpConn.ReadFromUDP(buf)
		if err != nil{
			fmt.Println("udpConn.ReadFromUDP err",err)
			return
		}

		//4.打印读取到客户端的数据
		fmt.Printf("服务器读到%v的数据%s\n:",cliUdpAddr,string(buf[:n]))

		go func() {//每有一个客户端连接服务器,启动一个goroutine回发数据给客户端(并发)

			//5.回发数据(当前时间)给客户端,传入两个参数分别是要回发给客户端的数据、客户端的地址结构
			daytime := time.Now().String()+"\n"
			_,err = udpConn.WriteToUDP([]byte(daytime),cliUdpAddr)
			if err != nil{
				fmt.Println("udpConn.WriteToUDP err",err)
				return
			}

		}()


	}


}

客户端:

package main

import (
	"fmt"
	"net"
	"os"
)

func main()  {

	//指定服务器IP+port,创建通信socket--conn
	conn,err := net.Dial("udp","127.0.0.1:8001")
	if err != nil{
		fmt.Println("net.Dial err:",err)
		return
	}
	defer conn.Close()

	//获取用户键盘输入,将数据发送给服务器
	go func() {
		buf := make([]byte,4096)//将键盘输入存入buf缓冲区
		for {
			n ,err := os.Stdin.Read(buf)//读取键盘输入
			if err != nil{
				fmt.Println("os.Stdin.Read err:",err)
				continue
			}
			//将键盘读取的数据发送给服务器
			conn.Write(buf[:n])
		}

	}()

	//读服务器回发的时间数据
	buffer :=make([]byte,4096)
	for  {
		n,err := conn.Read(buffer)//从conn连接中读取数据,将读取出来的数据存入buffer中
		if err != nil{
			fmt.Println("conn.Read err:",err)
			return
		}
		fmt.Println("读到服务器回发的数据:",string(buffer[:n]))

	}


}

演示:

 开启了两个终端运行客户端程序,相当于模拟了两个客户端,客户端效果如下;

网络编程--UDP通信并发版C/S_第1张图片

服务端接收到了两个客户端发来的数据:

网络编程--UDP通信并发版C/S_第2张图片 

你可能感兴趣的:(网络编程,UDP通信,并发C/S)