/*
* 思路:在登录成功时将用户的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. eclipse — Failed to load the JNI shared library”……\jvm.dll问题原因以及解决方案

    首先上一张出现问题的图片: 出现这个问题一般是你的jdk和eclipse不是同一位的,比如你的jdk是32位的但是eclipse下载的是64位的就会导致这种问题. 解决方案:把两者都换为32或者64位 ...

  2. Android Studio关于SVN的相关配置及从SVN检出项目

    一.安装配置: 如图,安装时必须自定义选择 command line 否则不会安装的 安装完成后,打开 IDE 的 setting 配置面板: 如上图路径 Version Control 下的 Sub ...

  3. zDiaLog弹出层

    zDiaLog弹出层  立即下载 插件描述:zDiaLog弹出层 弹出框: 代替window.open.window.alert.window.confirm:提供良好的用户体验: 水晶质感,设计细腻 ...

  4. Thinking in Java 笔记

    大二就买了这本书,如今再看这本书,看到了一些以前没看的细节,也有了不同的体会.本文使用第4版,整理每章的笔记心得.老外的书有个特点,他会花费大量的文字去阐述一个概念,这比堆代码强多了. 第 1 章 对 ...

  5. 解决问题:The context cannot be used while the model is being created

    使用Entity Framework (v6.1.3)突然遇到这个问题了,之前一直好好的,怎么破? 此处省略了多次在“好”与“坏"的项目中试验的过程(苦啊),直接给出答案.答案是:没有按Db ...

  6. JDBC Driver Types

    JDBC Driver Types Type1: JDBC-ODBC Bridge Driver Type2: JDBC-Native API Type3: JDBC-Net Pure Java Ty ...

  7. jQuery标签选择器

    $(function() { //alert("hello jquery"); //选择器 //id选择器 $("#bt1").click( function( ...

  8. Useful commmands in Gentoo

    Safe way to upgrade: emerge --sync & eix-sync emerge -avuDN --with-bdeps y --keep-going world et ...

  9. Makefile 编写 tips

    1.变量赋值 VARIABLE = value #在执行时扩展,允许递归扩展 VARIABLE := value #在定义时扩展 VARIABLE ?= value #只有在该变量为空时才设置该值 V ...

  10. 洛谷P3406 海底高铁[差分 贪心]

    题目背景 大东亚海底隧道连接着厦门.新北.博艾.那霸.鹿儿岛等城市,横穿东海,耗资1000亿博艾元,历时15年,于公元2058年建成.凭借该隧道,从厦门可以乘坐火车直达台湾.博艾和日本,全程只需要4个 ...