go 聊天室简单版总结
/*
* 思路:在登录成功时将用户的id存进在线用户列表中的key value中链接的ws为空,并保存用户的信息.
* 当跳转到聊天室时,将用户和聊天室链接的ws存进在线用户列表中的
* 问题:如何在聊天室的页面时,获取到用户的id.可尝试在登录时存入cookie,当在聊天室页面时可以通过id来获取信息,并把当前的链接的ws存入key为用户id的ws中。若没有则代表改用户没有经过登录页面登录。
*
*/
package handler import(
"log"
"net/http"
"html/template"
_"github.com/Go-SQL-Driver/MySQL"
"database/sql"
"golang.org/x/net/websocket"
"time"
"encoding/json"
)
type Msg struct{ //声明一个信息类型的结构体
MsgType string
MsgContent string
Id string
To string
ClientList string
ToId string
}
type User struct{ //声明一个用户的结构体
Id string
Nickname string
Password string
Name string
Conn *websocket.Conn
}
/*
type OnlineUser struct{ //声明一个在线用户的结构体
Id int //这个表示key是id
Conn *websocket.Conn //这个表示类型是websocket
UserInfo User//这个表示类型是websocket
}
*/
var OnlineMap = make(map[string] *User) //声明定一个在在线用户列表的map
var ch = make(chan Msg) //这是一个channel type Cookie struct { //设置cookie
Name string
Value string Path string
Domain string
Expires time.Time
RawExpires string
MaxAge int
Secure bool
HttpOnly bool
Raw string
Unparsed []string // Raw text of unparsed attribute-value pairs
} func IndexHandle(w http.ResponseWriter, req * http.Request){
t,err := template.ParseFiles("./view/index.html")
if err != nil{
log.Printf("no find index page")
}else{
t.Execute(w, nil)
}
//w.Write([]byte("index"))
log.Println("index")
} func LoginHandle(w http.ResponseWriter, req * http.Request){
req.ParseForm()
name := req.PostFormValue("name")
pwd := req.PostFormValue("password")
if name==""&&pwd=="" {
t,_ := template.ParseFiles("./view/login.html")
t.Execute(w,nil)
return
}
var User = User{Name:name,Password:pwd}
res := login(&User)
if res {
cookie := http.Cookie{Name: "Id", Value: User.Id, Path: "/", MaxAge: } //将id 存入cookie
http.SetCookie(w, &cookie)
OnlineMap[User.Id] = &User urlStr := "/chat?id="+User.Id
http.Redirect(w,req,urlStr,) //301 重定向跳转
return
}else{
t,_ := template.ParseFiles("./view/login.html")
t.Execute(w,nil)
}
} func RegisterHandle(w http.ResponseWriter, req * http.Request){
err := req.ParseForm()
if err != nil {
log.Println(err)
return
}
name := req.PostFormValue("name")
password := req.PostFormValue("password")
nickname := req.PostFormValue("nickname")
res := false
if name!=""&&password!=""{
var Register = User{Name:name,Password:password,Nickname:nickname}
res = register(&Register)
}
if res {
urlStr := "/login"
http.Redirect(w,req,urlStr,) //301 重定向跳转
return
}else{
r,_ := template.ParseFiles("./view/register.html")
r.Execute(w, nil)
}
if err != nil{
log.Printf("no find register page")
}
}
type IdMsg struct{
Id string
}
func ChatHandle(w http.ResponseWriter, req * http.Request){
t, err := template.ParseFiles("./view/chat.html")
req.ParseForm()
Id := IdMsg{}
if len(req.Form["id"]) > {
id := req.Form["id"][]
Id.Id = id
_,isset := OnlineMap[id]
if !isset{
http.Redirect(w,req,"/login",) //301 重定向跳转
}
}else{
http.Redirect(w,req,"/login",) //301 重定向跳转
return;
}
if err != nil {
return;
}else{
t.Execute(w, Id)
} }
func Echo (ws *websocket.Conn) {
var err error
for {
var reply Msg
//user := new(OnlineUsers)
if err = websocket.JSON.Receive(ws,&reply); err != nil {
log.Println(err)
break
}
client_id := reply.Id
if reply.MsgType == "login"{
OnlineMap[client_id].Conn = ws
OnClinetJson,_ := json.Marshal(OnlineMap)
reply.ClientList = string(OnClinetJson)
reply.MsgContent = OnlineMap[client_id].Name+"上线了!"
ch <- reply
}
if reply.MsgType == "say"{
if reply.ToId == "all"{
sendMsg := OnlineMap[client_id].Nickname + " 说:" + reply.MsgContent
reply.MsgContent = sendMsg
ch <- reply
}else{
toClientId := reply.ToId
toClientWs := OnlineMap[toClientId].Conn
sendMsg := OnlineMap[client_id].Nickname + " 说:" + reply.MsgContent
reply.MsgContent = sendMsg
SendMsg,_ := json.Marshal(reply)
websocket.JSON.Send(toClientWs,string(SendMsg))
websocket.JSON.Send(ws,string(SendMsg))
}
}
}
}
//mian.go中 go run handler.SendTo()
func SendTO(){
for{
select{
case a := <-ch:
for _,reg := range OnlineMap{
SendMsg,_ := json.Marshal(a)
websocket.JSON.Send(reg.Conn,string(SendMsg))
}
}
}
}
func SuccessHandle(w http.ResponseWriter, req * http.Request){
w.Write([]byte("success"))
log.Println("success")
} func ErrorHandle(w http.ResponseWriter, req * http.Request){
t, err := template.ParseFiles("./view/error.html")
if err != nil {
log.Printf("no find page")
}else{
t.Execute(w, nil)
log.Printf("find page")
} }
func register(register *User) (register_res bool) {
db, err := sql.Open("mysql","go_test:jacky@/go_test?charset=utf8")
if err != nil {
return false;
}
name := register.Name
password := register.Password
nickname := register.Nickname
stmt, err := db.Prepare("INSERT user SET username = ?,pwd = ?,nickname = ?")
if err != nil{
return false;
}
_, err2 := stmt.Exec(name,password,nickname)
if err2 != nil {
register_res = false;
}else{
register_res = true;
}
return register_res
}
func login(user *User) (res bool){
db, err := sql.Open("mysql","go_test:jacky@/go_test?charset=utf8")
if err != nil{
log.Fatal(err)
}
name := user.Name
password := user.Password
stmtOut, err := db.Prepare("select id,nickname from user where username=? and pwd=?") //卧槽卧槽卧槽卧槽 【我这里写的是* 所以查出来的是一条所有的字段,】
err = stmtOut.QueryRow(name,password).Scan(&user.Id,&user.Nickname) //这里为查出来的数据赋给这个结构体,因为查出来的数据有三个字段,所以三个字段全都要在这里对应上。
if err != nil {
return false;
}
return true;
}
go 聊天室简单版总结的更多相关文章
- 基于TCP协议的聊天室控制台版
我之前写过一篇博客,主要是基于TCP协议实现的聊天室swing版,在此再写一个基于TCP协议实现的聊天室控制台版,便于学习和比较. package 聊天室console版.utils; import ...
- JavaSE项目之聊天室swing版
引子: 当前,互联网 体系结构的参考模型主要有两种,一种是OSI参考模型,另一种是TCP/IP参考模型. 一.OSI参考模型,即开放式通信系统互联参考模型(OSI/RM,Open Systems In ...
- 简单聊天室(java版)
这是本人从其他地方学习到的关于聊天室的一个模本,我从中截取了一部分关于客户端和服务端通信的Socket的内容.希望对大家对socket有个了解,我写的这些代码可以实现两人或多人在多台电脑上实现简单的对 ...
- 基于React,Redux以及wilddog的聊天室简单实现
本文主要是使用ReactJs和Redux来实现一个聊天功能的页面,页面极其简单.使用React时间不长,还是个noob,有不对之处欢迎大家吐槽指正. 还要指出这里没有使用到websocket等技术来实 ...
- Socket.IO聊天室~简单实用
小编心语:大家过完圣诞准备迎元旦吧~小编在这里预祝大家元旦快乐!!这一次要分享的东西小编也不是很懂啊,总之小编把它拿出来是觉地比较稀奇,而且程序也没有那么难,是一个比较简单的程序,大家可以多多试试~ ...
- nodejs 聊天室简单实现
前言 博客园的样式真心不会用啊,看着大大们的博客各种好看,心里无奈啊,只能慢慢摸索了. 最近的项目nodejs+wcf+app,app直接从wcf服务获取数据,nodejs作为单独的服务器为app提供 ...
- react-native聊天室|RN版聊天App仿微信实例|RN仿微信界面
一.前言 9月,又到开学的季节.为每个一直默默努力的自己点赞!最近都沉浸在react native原生app开发中,之前也有使用vue/react/angular等技术开发过聊天室项目,另外还使用RN ...
- websocket+node建立聊天室简单使用
1.建立新的文件夹dome 2.执行 npm init加载package.json文件 3.node不支持websocket所以npm install ws 下载 ws插件 4.建立index.ht ...
- SignalR 聊天室实例详解(服务器端推送版)
翻译自:http://www.codeproject.com/Articles/562023/Asp-Net-SignalR-Chat-Room (在这里可以下载到实例的源码) Asp.Net Si ...
随机推荐
- 浅谈HTML5单页面架构(三)—— 回归本真:自定义路由 + requirejs + zepto + underscore
本文转载自:http://www.cnblogs.com/kenkofox/p/4650310.html 不过,这一篇,我想进一步探讨一下这两个框架的优缺点,另外,再进一步,抛开这两个框架,回到本真, ...
- ABAP使用OLE2对象创建EXCEL文件
厌倦了总是下载一模一样的EXCEL文档?没有颜色,边框,有效性验证.... 让我们看看怎样用OLE2对象来创造可爱的EXCEL工作表吧!(效果如下) 首先你需要知道微软EXCEL中的不同部分的名称,每 ...
- Linux学习心得之 linux命令
作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 前言 本篇博客是对 每日一linux命令(http://www.cnblogs.com/pe ...
- Set up Github Pages with Hexo, migrating from Jekyll
Set up Github Pages with Hexo, migrating from Jekyll. 本文介绍用Hexo建立github pages, 其中包含了从Jekyll迁移过来的过程. ...
- 使用 Async 和 Await 的异步编程(C# 和 Visual Basic)[msdn.microsoft.com]
看到Microsoft官方一篇关于异步编程的文章,感觉挺好,不敢独享,分享给大家. 原文地址:https://msdn.microsoft.com/zh-cn/library/hh191443.asp ...
- 服务器重启后SQL Server Agent由于"The EventLog service has not been started" 启动失败
案例环境: 操作系统 : Microsoft Windows Server 2003 Standard Edtion SP2 数据库版本 : SQL Server 2005 Standard Ed ...
- 做的一个HTML表白页面
页面地址: http://myspace123.qiniudn.com/love/index.html 目录文件结构: index.html <html xmlns="http://w ...
- 在CentOS中安装NodeJS
1. 更改软件源 备份默认的软件源文件“CentOS-Base.repo” mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-B ...
- [解决]Mercurial HTTP Error 500: Access is denied on 00changelog.i
总之,用户对仓库目录要有写权限 00changelog, access is denied, hg, http error 500, mercurial, permissions, push Merc ...
- Nova 组件如何协同工作 - 每天5分钟玩转 OpenStack(24)
Nova 物理部署方案 前面大家已经看到 Nova 由很多子服务组成,同时我们也知道 OpenStack 是一个分布式系统,可以部署到若干节点上,那么接下来大家可能就会问: Nova 的这些服务在物理 ...