/*
* 思路:在登录成功时将用户的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 聊天室简单版总结的更多相关文章

  1. 基于TCP协议的聊天室控制台版

    我之前写过一篇博客,主要是基于TCP协议实现的聊天室swing版,在此再写一个基于TCP协议实现的聊天室控制台版,便于学习和比较. package 聊天室console版.utils; import ...

  2. JavaSE项目之聊天室swing版

    引子: 当前,互联网 体系结构的参考模型主要有两种,一种是OSI参考模型,另一种是TCP/IP参考模型. 一.OSI参考模型,即开放式通信系统互联参考模型(OSI/RM,Open Systems In ...

  3. 简单聊天室(java版)

    这是本人从其他地方学习到的关于聊天室的一个模本,我从中截取了一部分关于客户端和服务端通信的Socket的内容.希望对大家对socket有个了解,我写的这些代码可以实现两人或多人在多台电脑上实现简单的对 ...

  4. 基于React,Redux以及wilddog的聊天室简单实现

    本文主要是使用ReactJs和Redux来实现一个聊天功能的页面,页面极其简单.使用React时间不长,还是个noob,有不对之处欢迎大家吐槽指正. 还要指出这里没有使用到websocket等技术来实 ...

  5. Socket.IO聊天室~简单实用

    小编心语:大家过完圣诞准备迎元旦吧~小编在这里预祝大家元旦快乐!!这一次要分享的东西小编也不是很懂啊,总之小编把它拿出来是觉地比较稀奇,而且程序也没有那么难,是一个比较简单的程序,大家可以多多试试~ ...

  6. nodejs 聊天室简单实现

    前言 博客园的样式真心不会用啊,看着大大们的博客各种好看,心里无奈啊,只能慢慢摸索了. 最近的项目nodejs+wcf+app,app直接从wcf服务获取数据,nodejs作为单独的服务器为app提供 ...

  7. react-native聊天室|RN版聊天App仿微信实例|RN仿微信界面

    一.前言 9月,又到开学的季节.为每个一直默默努力的自己点赞!最近都沉浸在react native原生app开发中,之前也有使用vue/react/angular等技术开发过聊天室项目,另外还使用RN ...

  8. websocket+node建立聊天室简单使用

    1.建立新的文件夹dome 2.执行 npm init加载package.json文件 3.node不支持websocket所以npm install  ws 下载 ws插件 4.建立index.ht ...

  9. SignalR 聊天室实例详解(服务器端推送版)

    翻译自:http://www.codeproject.com/Articles/562023/Asp-Net-SignalR-Chat-Room  (在这里可以下载到实例的源码) Asp.Net Si ...

随机推荐

  1. jquery点击切换背景色

    刚在自己的前端技术群里有个小伙伴儿问到这个问题,点击的时候进行红色背景和白色背景的切换,然后我就临时想到了一个解决方法,在这里记录一下吧,希望还有别的刚学习前端的小伙伴儿能用到,大神就请绕道咯!另外提 ...

  2. 使用原生JS封装一个ajax

    function ajax(data){ //第一步,创建XHR对象 var xhr = null; if(window.XMLHttpRequest){ xhr = new XMLHttpReque ...

  3. CSS3 Gradient 渐变

    转载自:http://www.w3cplus.com/content/css3-gradient CSS3发布很久了,现在在国外的一些页面上常能看到他的身影,这让我羡慕已久,只可惜在国内为了兼容IE, ...

  4. JavaScript区分click事件和mousedown(mouseup、mousemove)方法

    在前端开发工作中,会遇到这样问题:针对同一个dom元素,即希望为它绑定click事件,又想该元素可以允许拖拽的效果.而使用拖拽的效果,我们一般就会用到mousedown,mousemove和mouse ...

  5. UITextFeild的用法

    一. 修改占位字符串的 颜色: =======方法一 ====================================== #import "ViewController.h&quo ...

  6. SQL SERVER 临时表导致存储过程重编译(recompile)的一些探讨

    SQLSERVER为了确保返回正确的值,或者处于性能上的顾虑,有意不重用缓存在内存里的执行计划,而重新编译执行计划的这种行为,被称为重编译(recompile).那么引发存储过程重编译的条件有哪一些呢 ...

  7. 【转】最牛B的编码套路

    最近,我大量阅读了Steve Yegge的文章.其中有一篇叫“Practicing Programming”(练习编程),写成于2005年,读后令我惊讶不已: 与你所相信的恰恰相反,单纯地每天埋头于工 ...

  8. $.parseJson 在 firefox 下返回 null 的问题

    最近调查一个浏览器兼容性问题,在 IE, chrome下都运行正常,但是在 firefox 下运行时: $.parseJson(xxx) 返回 null,所以导致了 无法正常运行,调查的结果是因为 返 ...

  9. 7 COMPELLING REASONS YOU NEED TO START THE BUSINESS YOU’VE ALWAYS WANTED

    原文链接:http://lesseesadvocate.com/7-compelling-reasons-need-start-business-youve-always-wanted/ Don’t ...

  10. 解决虚拟机VMware安装CentOS7.0识别不到网卡

    由于Vmware虚拟网卡和linux兼容问题导致驱动无法正常安装,默认的网卡类型不兼容. 解决方法 找到我们的Vmware虚拟机文件夹,将VMware 虚拟机配置 (.vmx),追加一条设置我们网卡类 ...