/*
* 思路:在登录成功时将用户的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. React-Native性能优化点

    shouldComponentUpdate 确保组件在渲染之后不需要再更新的,即静态组件,尽量在其中增加shouldComponentUpdate方法,防止二次消耗所产生的性能消耗 shouldCom ...

  2. iOS UIMenuController菜单

    //1:普通 ////  ViewController.m//  DemoTest#import "ViewController.h"@interface ViewControll ...

  3. 如何保证Service在后台不被kill

    如何保证Service在后台不被kill 相信很多Android开发者在面试过程中会经常被问到“如何保证Service在后台不被kill”这个问题,总结了下一些大神给的答案. 引用知乎Android ...

  4. ios textfield / textview长按复制粘贴中文显示

    当我们在写应用时要复制粘贴文本框内容时,默认显示的文字为英文字体,可按如下步骤设置,显示中文:

  5. 【iOS】在Swift中使用JSONModel

    前言 首先所有的Model还是使用oc来写——看到这一句是不是想关网页了- - #,在swift里面直接写一直报错所以就将就用oc来写了,这里主要是分享一下搭配Alamofire使用的经验. 声明 欢 ...

  6. iOS 学习 - 21 系统自带解析 XML

    准备工作: new -> file -> other -> Empty ,在 Save As: 中随便起个名字后缀为 .xml 拷贝下面 <person> <stu ...

  7. 关于OC中的小数精确计算---NSDecimalNumber

    NSDecimalNumber 翻译补充自:http://rypress.com/tutorials/objective-c/data-types/nsdecimalnumber 感谢乐于分享的大神 ...

  8. [css]我要用css画幅画(八) - Hello Kitty

    接着之前的[css]我要用css画幅画(七) - 哆啦A梦,这次画的是Hello Kitty. /* 开始前先说点废话, 一转眼就2016年了,过完年后一直没更新博客,无他,就是懒得动. 这一转眼,一 ...

  9. ORA-39242 错误

    转载: Oracle 11g Release 1 (11.1) Data Pump 技术 http://docs.oracle.com/cd/B28359_01/server.111/b28319/d ...

  10. CocoaPod升级(以及ERROR: While executing gem ... (Errno::EPERM)解决办法)

    最近pods  0.39.0 升级1.1.1  ,发现一个坑,好纠结,好歹最后解决了 过程如下: 本来我想直接执行: $ sudo gem install cocoapods  // 安装cocoap ...