package service
import (
"encoding/json"
"log"
"main/IMChat/model"
"main/IMChat/pkg/e"
"main/IMChat/pkg/util"
"regexp"
"time"
"github.com/gorilla/websocket"
)
func (manager *ClientManager) Start() {
for {
log.Println("xxxxx监听管道通信xxxxx")
select {
case conn := <-Manager.Register: // 建立连接
log.Printf("有新连接: %v", conn.ID)
Manager.Clients[conn.ID] = conn //将连接放到用户管理上
replyMsg := &ReplyMsg{
Code: e.WebsocketSuccess,
Content: "已连接至服务器",
}
msg, _ := json.Marshal(replyMsg)
_ = conn.Socket.WriteMessage(websocket.TextMessage, msg)
case conn := <-Manager.Unregister: // 断开连接
log.Printf("断开连接:%v", conn.ID)
if _, ok := Manager.Clients[conn.ID]; ok {
replyMsg := &ReplyMsg{
Code: e.WebsocketEnd,
Content: "断开连接",
}
msg, _ := json.Marshal(replyMsg)
_ = conn.Socket.WriteMessage(websocket.TextMessage, msg)
close(conn.Send)
delete(Manager.Clients, conn.ID)
}
case broadcast := <-Manager.Broadcast: //1->2
message := broadcast.Message
toId := broadcast.Client.ToID //2->1
flag := false // 判断在线状态,默认不在线
for id, conn := range Manager.Clients { //将内容发送到目标用户的管道中进行读取
if id != toId {
continue
}
select {
case conn.Send <- message:
flag = true
default:
close(conn.Send)
delete(Manager.Clients, conn.ID)
}
}
id := broadcast.Client.ID //1->2
if flag {
log.Println("对方在线")
replyMsg := &ReplyMsg{
From: id,
Code: e.WebsocketOnlineReply,
Content: "对方在线应答",
}
msg, _ := json.Marshal(replyMsg)
_ = broadcast.Client.Socket.WriteMessage(websocket.TextMessage, msg)
err := model.CreateNews(id, string(message), 1, time.Now().Unix())
if err != nil {
log.Println("CreateMsg Err", err)
}
} else {
log.Println("对方不在线")
replyMsg := ReplyMsg{
From: id,
Code: e.WebsocketOfflineReply,
Content: "对方不在线应答",
}
msg, _ := json.Marshal(replyMsg)
_ = broadcast.Client.Socket.WriteMessage(websocket.TextMessage, msg)
err := model.CreateNews(id, string(message), 0, time.Now().Unix())
if err != nil {
log.Println("CreateMsg Err", err)
}
}
case gbroadcast := <-Manager.GBroadcast:
message := gbroadcast.GBroadcast.Message
Id := gbroadcast.GBroadcast.Client.ID
toId := gbroadcast.GBroadcast.Client.ToID //群号
gidRe, err := regexp.Compile(toId)
if err != nil {
log.Println("正则表达式解析失败", err)
}
for id, conn := range Manager.Clients { //将内容发送到目标用户的管道中进行读取
s1 := gidRe.FindString(id)
if id == Id || s1 != toId {
continue
}
select {
case conn.Send <- message:
time.Sleep(1 * time.Millisecond)
default:
close(conn.Send)
delete(Manager.Clients, conn.ID)
}
}
replyMsg := &ReplyMsg{
From: Id,
Code: e.WebsocketGroupReply,
Content: "发送群聊消息",
}
msg, _ := json.Marshal(replyMsg)
_ = gbroadcast.GBroadcast.Client.Socket.WriteMessage(websocket.TextMessage, msg)
_, rmsg, _ := model.MsgSplit(string(message))
err = model.CreateNews(Id, rmsg, 1, time.Now().Unix())
if err != nil {
log.Println("CreateMsg Err", err)
}
case fbroadcast := <-Manager.FBroadcast:
message := fbroadcast.FBroadcast.Message
Id := fbroadcast.FBroadcast.Client.ID //1->2
toId := fbroadcast.FBroadcast.Client.ToID //2->1
umsg := util.FriendHash(message)
if string(message) == "好友请求" {
for id, conn := range Manager.Clients { //将内容发送到目标用户的管道中进行读取
if id != toId {
continue
}
select {
case conn.Send <- message:
time.Sleep(1 * time.Millisecond)
default:
close(conn.Send)
delete(Manager.Clients, conn.ID)
}
}
replyMsg := &ReplyMsg{
From: Id,
Code: e.WebsocketFriendReply,
Content: "发送好友申请",
}
msg, _ := json.Marshal(replyMsg)
_ = fbroadcast.FBroadcast.Client.Socket.WriteMessage(websocket.TextMessage, msg)
err := model.CreateNews(Id, umsg, 1, time.Now().Unix())
if err != nil {
log.Println("CreateMsg Err", err)
}
} else if string(message) == "Y" {
for id, conn := range Manager.Clients { //将内容发送到目标用户的管道中进行读取
if id != toId {
continue
}
select {
case conn.Send <- message:
time.Sleep(1 * time.Millisecond)
default:
close(conn.Send)
delete(Manager.Clients, conn.ID)
}
}
replyMsg := &ReplyMsg{
From: Id,
Code: e.WebsocketFriendReply,
Content: "好友申请通过",
}
msg, _ := json.Marshal(replyMsg)
_ = fbroadcast.FBroadcast.Client.Socket.WriteMessage(websocket.TextMessage, msg)
err := model.AddFriends(Id)
if err != nil {
log.Println("CreateMsg Err", err)
}
err = model.CreateNews(Id, umsg, 1, time.Now().Unix())
if err != nil {
log.Println("CreateMsg Err", err)
}
} else if string(message) == "N" {
for id, conn := range Manager.Clients { //将内容发送到目标用户的管道中进行读取
if id != toId {
continue
}
select {
case conn.Send <- message:
time.Sleep(1 * time.Millisecond)
default:
close(conn.Send)
delete(Manager.Clients, conn.ID)
}
}
replyMsg := &ReplyMsg{
From: Id,
Code: e.WebsocketFriendReply,
Content: "好友申请拒绝",
}
msg, _ := json.Marshal(replyMsg)
_ = fbroadcast.FBroadcast.Client.Socket.WriteMessage(websocket.TextMessage, msg)
var news model.News
model.DB.Model(&model.News{}).Preload("News").Where("send_id=?", toId).
Where("msg=?", util.FriendHash([]byte("好友请求"))).Delete(&news)
err := model.CreateNews(Id, umsg, 1, time.Now().Unix())
if err != nil {
log.Println("CreateMsg Err", err)
}
model.DB.Model(&model.News{}).Preload("News").Where("send_id=?", Id).
Where("msg=?", util.FriendHash(message)).Delete(&news)
}
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
基于go语言开发的即时通讯项目源码(支持好友、单聊、群聊).zip 【资源介绍】 即时通讯项目,支持好友、单聊、群聊 api文档:https://www.apifox.cn/apidoc/shared-b851ba04-a8e5-481c-acda-858e9070396c 项目构成 api:用于定义接口函数 cache:redis操作 conf:初始化配置以及存放配置信息 middlware:应用中间件 model:数据库模型与初始化 pkg--e:错误处理类 --util:工具类 router:路由组 serializer:序列化函数包 service:服务模块 演示流程 注册登录 单聊 群聊(即时) 添加好友 查看历史记录 【备注】 主要针对计算机相关专业的正在做毕设和大作业的学生与需要项目实战练习的go语言学习者。 包含:项目源码,该项目附带全部源码也可作为毕业设计使用。 项目都经过严格调试,确保可以运行!
资源推荐
资源详情
资源评论
收起资源包目录
基于go语言开发的即时通讯项目源码(支持好友、单聊、群聊).zip (29个子文件)
serializer
common.go 723B
user.go 575B
go.mod 3KB
go.sum 50KB
api
ws.go 526B
user.go 1KB
cache
common.go 1KB
middleware
jwt.go 743B
service
ws.go 6KB
find.go 1KB
start.go 6KB
group.go 3KB
user.go 3KB
说明文档.md 730B
pkg
e
code.go 1KB
msg.go 1KB
util
utils.go 1KB
model
database.go 1009B
news.go 2KB
friend.go 1KB
group.go 463B
migrate.go 234B
setup.go 993B
user.go 843B
router
ws.go 604B
user.go 587B
conf
conf.go 514B
conf.ini 288B
main.go 385B
共 29 条
- 1
资源评论
Make程序设计
- 粉丝: 5621
- 资源: 3567
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功