【GO语言】实现UDP—C/S设计模式的服务器server端与客户client端通信

GO语言实现UDP—C/S设计模式的服务器server端与客户client端通信

  • 项目总览:
  • 一、项目开发日志
  • 二、前情知识补充
        • 1.TCP和UDP的差别
        • 2.UDP的C/S架构
        • 3.UDP服务器端通信过程
  • 三、服务器端代码展示
  • 四、客户端代码展示
  • 五、效果展示:

项目总览:

1.开发语言:GO语言
2.IDE:Goland
3.开发用时:一个小时
4.源码已上传到我的GitHub,链接:https://github.com/2394799692/UDP 或点此跳转


以下是本篇文章正文内容,欢迎朋友们进行指正,一起探讨,共同进步。——来自考研路上的lwj。QQ:2394799692

一、项目开发日志

UDP服务器:
1.创建server端地址结构(ip+port)net.ResolveUDPAddr()
2.创建用于通信的socket,绑定地址结构 udpConn=netListenUDP()
3.defer udpConn.Close(4.读取客户端发送数据  ReadFromUDP(buf) 返回3个值。分别是读取到的字节数,客户端的地址,error
5.写数据给客户端  WriteToUDP(“待写数据”, cltAddr)

UDP客户端:
1.大概与TCP客户端一样

二、前情知识补充

1.TCP和UDP的差别

1)TCP通信:
面向连接的,可靠的数据包传输
2)UDP通信:
无连接的,不可靠的报文传递

2.UDP的C/S架构

【GO语言】实现UDP—C/S设计模式的服务器server端与客户client端通信_第1张图片

3.UDP服务器端通信过程

1.创建用于通信的socket
2.阻塞读socket
3.处理读到的数据
4.写数据给客户端

三、服务器端代码展示

package main

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

func main() {
	//组织一个udp地址结构,指定服务器的IP+port
	//srvAddr是地址结构
	srvAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:8006")
	//访问命令:nc -u 127.0.0.1 8006
	if err != nil {
		fmt.Println("ResolveUDPAddr err:", err)
		return
	}
	fmt.Println("udp 服务器地址结构,创建完成!!!")
	//创建用户通信的socket:udpConn
	udpConn, err := net.ListenUDP("udp", srvAddr)
	if err != nil {
		fmt.Println("ListenUD err:", err)
		return
	}
	defer udpConn.Close()
	fmt.Println("udp 服务器socket,创建完成!!!")
	//读取客户端发送的数据
	buf := make([]byte, 4096)
	//返回3个值。分别是读取到的字节数,客户端的地址,error
	n, cltAddr, err := udpConn.ReadFromUDP(buf)
	if err != nil {
		fmt.Println("ReadFromUDP err:", err)
		return
	}
	//模拟处理数据
	fmt.Printf("服务器读到%vd的数据:%s\n", cltAddr, string(buf[:n]))
	//提取系统当前时间
	daytime := time.Now().String()
	//回写数据给客户端
	_, err = udpConn.WriteToUDP([]byte(daytime), cltAddr)
	if err != nil {
		fmt.Println("WriteToUDP err:", err)
		return
	}
}


四、客户端代码展示

package main

import (
	"fmt"
	"net"
)

func main() {
	//指定服务器 ip+port创建通信套接字
	conn, err := net.Dial("udp", "127.0.0.1:8006")
	if err != nil {
		fmt.Println("net.dial err:", err)
		return
	}
	defer conn.Close()
	//主动写数据给服务器
	conn.Write([]byte("are you ready?"))
	buf := make([]byte, 4096)
	//接收服务器回发的数据
	n, err := conn.Read(buf)
	if err != nil {
		fmt.Println("conn.Read err:", err)
		return
	}
	//处理数据,打印
	fmt.Println("服务器回发:", string(buf[:n])) //读了多少显示多少
}



五、效果展示:

1)启动服务器端,进入阻塞状态:
【GO语言】实现UDP—C/S设计模式的服务器server端与客户client端通信_第2张图片

2)打开客户端源文件所在位置的cmd,输入go run 02-UDP客户端.go后,实现客户端与服务器的通信
【GO语言】实现UDP—C/S设计模式的服务器server端与客户client端通信_第3张图片

3)或者通过系统cmd的nc命令nc -u 127.0.0.1 8006访问服务器端实现与UDP服务器的通信
【GO语言】实现UDP—C/S设计模式的服务器server端与客户client端通信_第4张图片

你可能感兴趣的:(练习项目,udp,golang,c语言,后端,go语言)