基于 gin + websocket 即时通讯项目 (一、项目初始化)

基于 gin + websocket 即时通讯项目

1、安装环境与初始化

  • 搜索各种包官网

https://pkg.go.dev/

image-20231118154355946

1.1 安装 grom


go get -u gorm.io/grom

image-20231118150809109

1.2 安装 MySQL 驱动


go get -u gorm.io/driver/sqlite

go get -u gorm.io/driver/mysql

image-20231118154812322

1.3 安装 gin


go get -u github.com/gin-gonic/gin

image-20231118151601161

1.4 安装 viper


go get github.com/spf13/viper

image-20231118154236141

1.5 安装 gin


go get github.com/googollee/go-socket.io

image-20231117151053131

1.6 安装 swaggo


  • 安装

go get -u github.com/swaggo/swag/cmd/swag

go install github.com/swaggo/swag/cmd/swag@latest

go get -u github.com/swaggo/gin-swagger

go get -u github.com/swaggo/files

image-20231118170958972

  • 初始化

swag init

image-20231118171305741

  • 配置

  • app

    • router
      • router.go
package router

import (
	"app/docs"
	"app/service"
	"github.com/gin-gonic/gin"
	swaggerfiles "github.com/swaggo/files"
	ginSwagger "github.com/swaggo/gin-swagger"
)

func Router() *gin.Engine {
	r := gin.Default()
	r.GET("swagger/*any", ginSwagger.WrapHandler(swaggerfiles.Handler))
	docs.SwaggerInfo.BasePath = ""

	r.GET("/index", service.GetIndex)

	userGroup := r.Group("api/user")
	userGroup.GET("/getUserList", service.GetUserList)
	return r
}

  • app
    • service
      • user.go
package service

import (
	"app/dto"
	"github.com/gin-gonic/gin"
)

// @title 查询所有用户
// @version 1.0
// @Tags 用户
// @contact.name 通过用户手机号获取购物车信息
// @Success 200 {string} data
// @Router /api/user/getUserList [get]
// @host 127.0.0.1:9999
func GetUserList(ctx *gin.Context) {
	data := dto.GetUserList()
	ctx.JSON(200, gin.H{"data": data})
}

注意: 注解之后需要重新初始化 然后重启项目

swag init

在这在这里插入图片描述
里插入图片描述

  • 访问

http://127.0.0.1:8888/swagger/index.html

image-20231118172734822

1.7 数据库初始化


  • app
    • config
      • application.yml

数据库配置文件:

server:
  port: 8888

mysql:
  diverName: mysql
  host: 127.0.0.1
  port: 3306
  database: chatapp
  username: root
  password: 123456
  charset: utf8mb4

  • app
    • utils
      • system_init.go

数据库 MySQL 初始化文件:

package utils

import (
	"fmt"
	"github.com/spf13/viper"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"log"
	"os"
	"time"
)

var DB *gorm.DB

func InitDB() *gorm.DB {
	viper.SetConfigName("application")	// 你的数据库配置 yml 文件名
	viper.AddConfigPath("config")		// yml 的文件路径
	err := viper.ReadInConfig()
	if err != nil {
		fmt.Println(err)
	}
	host := viper.GetString("mysql.host")
	port := viper.GetString("mysql.port")
	database := viper.GetString("mysql.database")
	username := viper.GetString("mysql.username")
	password := viper.GetString("mysql.password")
	charset := viper.GetString("mysql.charset")
    // 自定义 log 日志
	newLogger := logger.New(
		log.New(os.Stdout, "\r\n", log.LstdFlags),
		logger.Config{
			SlowThreshold: time.Second,
			LogLevel:      logger.Info,
			Colorful:      true,
		})
	db, err := gorm.Open(mysql.Open(username+`:`+password+`@tcp(`+host+`:`+port+`)/`+database+`?charset=`+charset+`&parseTime=true&loc=Local`),
		&gorm.Config{Logger: newLogger})
	if err != nil {
		panic("failed to connect database, err: " + err.Error())
	}
	//db.AutoMigrate(&models.UserBasic{})		// 迁移数据
	DB = db
	return db
}

func GetDB() *gorm.DB {
	return DB
}

  • app
    • models
      • userBasic.go
package models

import (
	"gorm.io/gorm"
	"time"
)

type UserBasic struct {
	gorm.Model
	Name          string
	Password      string
	Phone         string
	Email         string
	Identity      uint64    // 唯一标识
	ClientIp      string    // 设备
	ClientPort    string    // 端口
	LoginTime     time.Time // 登录时间
	HeartBeatTime time.Time // 心跳
	LoginOutTime  time.Time // 登出时间
	IsLoginOut    bool      // 是否下线
	DeviceInfo    string    //设备信息
}

func (table *UserBasic) TableName() string {
	return "user_basic"
}

  • app
    • main.go
package main

import (
	"app/utils"
)

func main() {
	utils.InitDB()
	err := r.Run(":8888")
	if err != nil {
		return
	}
}

1.8 测试


  • app
    • router
      • router.go
package router

import (
	"app/service"
	"github.com/gin-gonic/gin"
)

func Router() *gin.Engine {
	r := gin.Default()
	r.GET("/index", service.GetIndex)

	userGroup := r.Group("api/user") 	// 路由组
	userGroup.GET("/getUserList", service.GetUserList)
	return r
}

  • app
    • dto
      • user.go
package dto

import (
	"app/models"
	"app/utils"
)

func GetUserList() []*models.UserBasic {
	data := make([]*models.UserBasic, 10)
	utils.GetDB().Debug().Find(&data)		// 查询所有用户
	return data
}

  • app
    • service
      • user.go
package service

import (
	"app/dto"
	"github.com/gin-gonic/gin"
)

func GetUserList(ctx *gin.Context) {
	data := dto.GetUserList()				// 调用 dto 层方法获取数据
	ctx.JSON(200, gin.H{"data": data})		// 返回数据
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Golang中的Gin框架提供了一种简单而强大的方法来构建Web应用程序。与此同时,Golang标准库中的"net/http"包提供了构建WebSocket服务器和客户端的功能。 首先,我们来看一下如何使用GinWebSocket构建WebSocket服务器。首先,需要导入相关的包: ```go import ( "github.com/gin-gonic/gin" "github.com/gorilla/websocket" ) ``` 接下来,在Gin中创建一个WebSocket处理函数: ```go func WebSocketHandler(c *gin.Context) { upgrader := websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, } conn, err := upgrader.Upgrade(c.Writer, c.Request, nil) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } for { messageType, message, err := conn.ReadMessage() if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } err = conn.WriteMessage(messageType, message) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } } } ``` 上面的代码创建了一个基本的WebSocket处理函数。它使用WebSocket标准库中的Upgrader结构来处理升级连接并创建一个WebSocket连接。 然后,我们需要在Gin中设置路由来处理WebSocket请求: ```go router := gin.Default() router.GET("/ws", WebSocketHandler) ``` 以上代码将在根路径下创建一个WebSocket处理函数。 接下来,我们来看一下如何使用Golang和Gin构建WebSocket客户端。首先,我们需要导入所需的包: ```go import ( "github.com/gorilla/websocket" "net/http" ) ``` 然后,我们可以使用以下代码来创建一个WebSocket客户端: ```go func main() { c, _, err := websocket.DefaultDialer.Dial("ws://localhost:8080/ws", nil) if err != nil { log.Fatal("dial:", err) } defer c.Close() done := make(chan struct{}) go func() { defer close(done) for { _, message, err := c.ReadMessage() if err != nil { log.Println("read:", err) return } log.Printf("recv: %s", message) } }() ticker := time.NewTicker(time.Second) defer ticker.Stop() for { select { case <-done: return case <-ticker.C: err := c.WriteMessage(websocket.TextMessage, []byte("Hello, Server!")) if err != nil { log.Println("write:", err) return } } } } ``` 上面的代码创建了一个WebSocket客户端,它使用WebSocket标准库中的`DefaultDialer`结构来建立WebSocket连接。 以上就是使用Golang GinWebSocket构建WebSocket客户端和服务器的简单示例。这些代码可以帮助我们使用Gin和Golang的标准库来构建强大的Web应用程序,并处理WebSocket通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

她似晚风般温柔789

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值