/*
* 思路:在登录成功时将用户的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. 3D banner(CSS3+HTML5)

    1.这是一篇 3Dbanner制作的简易流程,支持高版本的chrome和firefox浏览器,俩浏览器显示可能会有些差异 2.没有兼容性代码,因为仅仅只是熟悉流程,希望小伙伴们自己改善哈(>﹏& ...

  2. 数据结构->直接插入排序

    数据结构->直接插入排序 实现效果 从小到大排序 算法原理 有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序. 算法步骤 从第一个元素开始,该元 ...

  3. ThinkPHP3快速入门教程二:数据CURD

    CURD(创建[Create].更新[Updata].读取[Read].删除[Delete]),定义了用于处理数据的基本原子操作. CURD在具体的应用中并非一定使用create.updata.rea ...

  4. linux shell for循环使用命令中读取到的值实例

    #!/bin/bash file="states" for state in `cat $file` do echo "Visit beautiful $state&qu ...

  5. XCode6 开发本地化应用

    使用 XCode 6 开发本地化时,第一步,不能忘记,否则在添加本地化文件时,可能会找不到简体中文. 此外,如果使用 NSLocalizedString(@"xxx", nil) ...

  6. nginx 301 永久重定向

    nginx301跳转设置很简单,配置如下. (配置文件默认为nginx.conf,如果制定了新的配置文件,在新的文件配置即可.) server{ server_name xxx.com www.xxx ...

  7. 框架基础之Hibernate简介

    框架基础之Hibernate简介 1.什么是Hibernate? Hibernate是一个开发源代码的对象关系映射框架,它对JDBC进行非常轻量级的对象封装,使得程序员可以随心所欲地使用对象编程思维来 ...

  8. MVC PartialView

      参考 Updating an MVC Partial View with Ajax RenderPartial vs RenderAction vs Partial vs Action in MV ...

  9. Leetcode: sliding window maximum

    August 7, 2015 周日玩这个算法, 看到Javascript Array模拟Deque, 非常喜欢, 想用C#数组也模拟; 看有什么新的经历. 试了四五种方法, 花时间研究C# Sorte ...

  10. Java程序生成exe可执行文件详细教程(图文说明)

    ava程序打包成exe可执行文件,分为两大步骤. 第一步:将Java程序通过Eclipse或者Myeclipse导成Jar包 第二步:通过exe4j讲Jar包程序生成exe可执行文件 第一步详解: 将 ...