首页 > 代码库 > GO简易聊天系统后台源码分享
GO简易聊天系统后台源码分享
本人是搞移动客户端开发的,业余时间接触到golang这么个可爱的囊地鼠,于是就写了这么个测试项目:简易版的聊天系统,功能包括注册,登陆,群聊和单聊,无需使用mysql,数据都存在了文本里。本人纯粹兴趣,前后就几天搞出来的产物,想到哪里写到哪里,边查手册边写出来的,所以某些地方会有不合理的地方,但测试过没有bug,就当为新手同学们提供个参考吧,也给手贱点进来的老手们提供个笑料吧 >_<,最起码可以知道go里怎么做字符串拆分的,go方法返回多个参数是怎么写的,go里json数据时如何解析的,go是怎么接受客户端发来的http请求的,go是怎么获取本地时间的,go是如何读写本地文本的等等:
项目文件结构为:
src/GoStudy/main.go
src/GoStudy/user (此为文本,注册用户表)
src/GoStudy/chat (此为文本,群聊消息表)
src/GoStudy/singleChat (此为文本,单聊消息表)
src/login/login.go
src/register/register.go
src/chat/chat.go
src/constData/constData.go
src/tool/databaseTool.go
src/tool/jsonMaker.go
以下是代码:
main.go:
1 package main 2 3 import ( 4 "fmt" 5 "log" 6 "net/http" 7 8 "constData" 9 "login"10 "chat"11 "register"12 )13 14 func main(){15 16 openHttpListen()17 }18 19 func openHttpListen(){20 http.HandleFunc("/",receiveClientRequest)21 fmt.Println("go server start running...")22 23 err := http.ListenAndServe(":9090",nil)24 if err != nil {25 log.Fatal("ListenAndServe: ",err)26 }27 }28 29 func receiveClientRequest(w http.ResponseWriter,r *http.Request){30 31 r.ParseForm()32 fmt.Println("收到客户端请求: ",r.Form)33 /*34 fmt.Println("path",r.URL.Path)35 fmt.Println("scheme",r.URL.Scheme)36 fmt.Println(r.Form["url_long"])37 38 for k,v := range r.Form {39 fmt.Printf("----------\n")40 fmt.Println("key:",k)41 fmt.Println("value:",strings.Join(v,", "))42 }43 */44 var tag string = r.FormValue("tag")45 switch tag{46 case constData.REQ_TAG_LOGIN:47 48 login.ReceiveLogin(w ,r)49 50 case constData.REQ_TAG_REGISTER:51 52 register.ReceiveRegister(w,r)53 54 case constData.REG_TAG_CHAT:55 56 chat.ReceiveChat(w,r)57 58 case constData.REQ_TAG_LASTEST_MESSAGE:59 60 chat.ReceiveMsgReq(w,r)61 62 default:63 break64 }65 66 }
login.go:
package loginimport ( "fmt" "net/http" "strings" "encoding/json" "io" "log" "tool" "constData")var totalNickStr stringfunc ReceiveLogin(w http.ResponseWriter,r *http.Request) { var nick string = r.FormValue("nick") var password string = r.FormValue("password") var tempData string = "" var userID string = checkUserDataExist(nick,password) if userID != "" { //登陆成功返回用户id,和当前数据库内所有用户信息 tempData = "http://www.mamicode.com/{" + tool.MakeJsonValue("code","success") + "," + tool.MakeJsonValue("tag",constData.REQ_TAG_LOGIN) + "," + tool.MakeJsonValue("result","1") + "," + tool.MakeJsonValue("id",userID) + "," + tool.MakeJsonValue1("userlist",totalNickStr) + "}" } else { //返回client登录失败,用户不存在 0 tempData = "http://www.mamicode.com/{" + tool.MakeJsonValue("code","success") + "," + tool.MakeJsonValue("tag",constData.REQ_TAG_LOGIN) + "," + tool.MakeJsonValue("result","0") + "," + tool.MakeJsonValue("info","账号不存在,请重新输入或者注册一个新账号") + "}" } fmt.Fprintf(w,tempData)}func checkUserDataExist(nick string,password string) string { var currentLocalChat string = tool.ReadLocalFile(constData.DatabaseFile_User) var currentLocalChatList []string = strings.Split(currentLocalChat,"\n") var currentLocalChatLength int = len(currentLocalChatList) var count = 0; totalNickStr = "[" for _,str := range currentLocalChatList { totalNickStr += str; count++; if count < (currentLocalChatLength-1) { totalNickStr += ","; } if count == currentLocalChatLength { break } } totalNickStr += "]" type Message struct { ID, Nick, Password string } var existUserID string = ""; dec := json.NewDecoder(strings.NewReader(currentLocalChat)) for { var m Message if err := dec.Decode(&m); err == io.EOF { break } else if err != nil { log.Fatal(err) } var u string = m.Nick var p string = m.Password if u == nick && p == password { existUserID = m.ID } } return existUserID}func Substr(str string, start, length int) string { rs := []rune(str) rl := len(rs) end := 0 if start < 0 { start = rl - 1 + start } end = start + length if start > end { start, end = end, start } if start < 0 { start = 0 } if start > rl { start = rl } if end < 0 { end = 0 } if end > rl { end = rl } return string(rs[start:end])}
register.go:
package registerimport ( "net/http" "fmt" "strings" "io" "log" "strconv" "tool" "constData" "encoding/json")var localUserData stringfunc ReceiveRegister(w http.ResponseWriter,r *http.Request){ var nick string = r.FormValue("nick") var password string = r.FormValue("password") var tempData string = "" if checknickExist(nick) { //注册失败 tempData = "http://www.mamicode.com/{" + tool.MakeJsonValue("code","success") + "," + tool.MakeJsonValue("tag",constData.REQ_TAG_REGISTER) + "," + tool.MakeJsonValue("result","0") + "," + tool.MakeJsonValue("info","用户id:"+nick+"已被使用") + "}" } else { //注册成功 var tempList []string = strings.Split(localUserData,"\n") var localUserCount int = len(tempList) var currentUserID string if localUserCount == 0 { currentUserID = "10000" }else { currentUserID = strconv.Itoa(10000 + localUserCount - 1); } tempData = "http://www.mamicode.com/{" + tool.MakeJsonValue("code","success") + "," + tool.MakeJsonValue("tag",constData.REQ_TAG_REGISTER) + "," + tool.MakeJsonValue("result","1") + "," + tool.MakeJsonValue("id",currentUserID) + "}" //把新账号入库 {"id:",10000"nick":"kate","password":"123abc"} var newUserData string = "{" + tool.MakeJsonValue("id",currentUserID) + "," + tool.MakeJsonValue("nick",nick) + "," + tool.MakeJsonValue("password",password) + "}\n" tool.WriteLocalFile(localUserData + newUserData,constData.DatabaseFile_User); } fmt.Fprintf(w,tempData)}func checknickExist(nick string) bool { localUserData =http://www.mamicode.com/ tool.ReadLocalFile(constData.DatabaseFile_User) type Message struct { Nick, Password string } dec := json.NewDecoder(strings.NewReader(localUserData)) for { var m Message if err := dec.Decode(&m); err == io.EOF { break } else if err != nil { log.Fatal(err) } var u string = m.Nick if u == nick { return true } } return false}
chat.go:
package chatimport ( "net/http" "fmt" "strings" "time" "strconv" "encoding/json" "tool" "constData")//收到客户度发送的一条聊天信息func ReceiveChat(w http.ResponseWriter,r *http.Request){ //对方的userid var chatToUserID string = r.FormValue("chatToUserID") var userid string = r.FormValue("userid") var nick string = r.FormValue("nick") var content string = r.FormValue("content") //读取本地时间 currentTime := time.Now() var timeStr string = currentTime.Format(constData.DateFormat) //获取当前本地聊天内容 if chatToUserID == "100" { var currentLocalChat string = tool.ReadLocalFile(constData.DatabaseFile_Chat) var currentLocalChatList []string = strings.Split(currentLocalChat,"\n") var currentLocalChatLength int = len(currentLocalChatList) //组合json形式字符串存入本地 var currentChatData string = "{" + tool.MakeJsonValue("id",strconv.Itoa(currentLocalChatLength - 1)) + "," + tool.MakeJsonValue("time",timeStr) + "," + tool.MakeJsonValue("userid",userid) + "," + tool.MakeJsonValue("nick",nick) + "," + tool.MakeJsonValue("content",content) + "}\n" fmt.Println("新聊天数据:" + currentChatData) var writeSuccess bool = tool.WriteLocalFile(currentChatData + currentLocalChat,constData.DatabaseFile_Chat); var tempData string = "" if writeSuccess { tempData = "http://www.mamicode.com/{" + tool.MakeJsonValue("code","success") + "," + tool.MakeJsonValue("tag",constData.DatabaseFile_Chat) + "," + tool.MakeJsonValue("result","1") + "}" } else { tempData = "http://www.mamicode.com/{" + tool.MakeJsonValue("code","success") + "," + tool.MakeJsonValue("tag",constData.DatabaseFile_Chat) + "," + tool.MakeJsonValue("result","0") + "," + tool.MakeJsonValue("info","聊天信息入库出错") + "}" } fmt.Fprintf(w, tempData) } else { var currentLocalChat string = tool.ReadLocalFile(constData.DatabaseFile_SINGLE_CHAT) var currentLocalChatList []string = strings.Split(currentLocalChat,"\n") var currentLocalChatLength int = len(currentLocalChatList) //组合json形式字符串存入本地 var currentChatData string = "{" + tool.MakeJsonValue("id",strconv.Itoa(currentLocalChatLength - 1)) + "," + tool.MakeJsonValue("time",timeStr) + "," + tool.MakeJsonValue("senderid",userid) + "," + tool.MakeJsonValue("receiverid",chatToUserID) + "," + tool.MakeJsonValue("content",content) + "}\n" fmt.Println("新聊天数据:" + currentChatData) var writeSuccess bool = tool.WriteLocalFile(currentChatData + currentLocalChat,constData.DatabaseFile_SINGLE_CHAT); var tempData string = "" if writeSuccess { tempData = "http://www.mamicode.com/{" + tool.MakeJsonValue("code","success") + "," + tool.MakeJsonValue("tag",constData.DatabaseFile_Chat) + "," + tool.MakeJsonValue("result","1") + "}" } else { tempData = "http://www.mamicode.com/{" + tool.MakeJsonValue("code","success") + "," + tool.MakeJsonValue("tag",constData.DatabaseFile_Chat) + "," + tool.MakeJsonValue("result","0") + "," + tool.MakeJsonValue("info","聊天信息入库出错") + "}" } fmt.Fprintf(w, tempData) }}//收到客户端发送的请求最新几条聊天内容协议func ReceiveMsgReq(w http.ResponseWriter,r *http.Request){ maxCount,_ := strconv.Atoi(r.FormValue("count")) var chatUserID string = r.FormValue("chatuserid") var selfid string = r.FormValue("selfid") if chatUserID == "100"{ //获取当前本地聊天内容 var currentLocalChat string = tool.ReadLocalFile(constData.DatabaseFile_Chat) var tempData string if currentLocalChat == "noExist" { tempData = "http://www.mamicode.com/{" + tool.MakeJsonValue("code","success") + "," + tool.MakeJsonValue("tag",constData.REQ_TAG_LASTEST_MESSAGE) + "," + tool.MakeJsonValue("result","0") + "," + tool.MakeJsonValue("chatuserid",chatUserID) + "," + tool.MakeJsonValue("info","聊天信息不存在") + "}" } else { var currentLocalChatList []string = strings.Split(currentLocalChat,"\n") // var currentLocalChatLength int = len(currentLocalChatList) var count = 0; var tempStr = "[" for _,str := range currentLocalChatList { // fmt.Println(index,str) tempStr += str; count++; if count < (maxCount - 1) { tempStr += ","; } if count == maxCount { break } } tempStr += "]" tempData = "http://www.mamicode.com/{" + tool.MakeJsonValue("code","success") + "," + tool.MakeJsonValue("tag",constData.REQ_TAG_LASTEST_MESSAGE) + "," + tool.MakeJsonValue("result","1") + "," + tool.MakeJsonValue("chatuserid",chatUserID) + "," + tool.MakeJsonValue1("info",tempStr) + "}" } fmt.Fprintf(w, tempData) } else { //获取当前本地聊天内容 var currentLocalChat string = tool.ReadLocalFile(constData.DatabaseFile_SINGLE_CHAT) var tempData string if currentLocalChat == "noExist" { tempData = "http://www.mamicode.com/{" + tool.MakeJsonValue("code","success") + "," + tool.MakeJsonValue("tag",constData.REQ_TAG_LASTEST_MESSAGE) + "," + tool.MakeJsonValue("result","0") + "," + tool.MakeJsonValue("chatuserid",chatUserID) + "," + tool.MakeJsonValue("info","聊天信息不存在") + "}" } else { var currentLocalChatList []string = strings.Split(currentLocalChat,"\n") // var currentLocalChatLength int = len(currentLocalChatList) var count = 0; var tempStr = "[" for _,str := range currentLocalChatList { // fmt.Println(index,str) type Message struct { ID, Time, Senderid,Receiverid,Content string } dec := json.NewDecoder(strings.NewReader(str)) var m Message dec.Decode(&m) var senderid string = m.Senderid var receiverid string = m.Receiverid if (senderid == selfid && receiverid == chatUserID) || (senderid == chatUserID && receiverid == selfid) { tempStr += str; count++; if count < (maxCount - 1) { tempStr += ","; } if count == maxCount { break } } else { continue } } tempStr += "]" tempData = "http://www.mamicode.com/{" + tool.MakeJsonValue("code","success") + "," + tool.MakeJsonValue("tag",constData.REQ_TAG_LASTEST_MESSAGE) + "," + tool.MakeJsonValue("result","1") + "," + tool.MakeJsonValue("chatuserid",chatUserID) + "," + tool.MakeJsonValue1("info",tempStr) + "}" } fmt.Fprintf(w, tempData) }}
databaseTool.go:
package toolimport ( "fmt" "io/ioutil")func ReadLocalFile(filePath string) string { f,err := ioutil.ReadFile(filePath) if err != nil{ fmt.Printf("读表错误: %s\n",err)// panic(err) return "notExist" } return string(f)}func WriteLocalFile(val string,filePath string) bool { var content = []byte(val); err := ioutil.WriteFile(filePath,content,0644) if err != nil{ fmt.Printf("%s\n",err) panic(err) return false } fmt.Println("==写文件成功: " + filePath + "==") return true}
jsonMaker.go:
package toolfunc MakeJsonValue(key string,val string) string { var str string = "\"" + key + "\":" + "\"" + val + "\"" return str}//value不带双引号func MakeJsonValue1(key string,val string) string { var str string = "\"" + key + "\":" + "" + val + "" return str}
三个文本内容格式:
user:
{"id":"10000","nick":"jd","password":"111111"}{"id":"10001","nick":"zoe","password":"123456"}{"id":"10002","nick":"frank","password":"qqqqqq"}
chat:
{"id":"3","time":"2015-01-22 15:14:22","userid":"10001","nick":"zoe","content":"就我两么"}{"id":"2","time":"2015-01-22 15:11:22","userid":"10001","nick":"zoe","content":"我来了"}{"id":"1","time":"2015-01-22 15:08:22","userid":"10000","nick":"jd","content":"我好无聊 谁和我聊聊天呀?"}{"id":"0","time":"2015-01-22 15:06:22","userid":"10000","nick":"jd","content":"有人在么"}
singlechat:
{"id":"3","time":"2015-01-22 15:27:22","senderid":"10002","receiverid":"10000","content":"yes ,how do u know that?"}{"id":"2","time":"2015-01-22 15:25:22","senderid":"10000","receiverid":"10002","content":"are you from usa?"}{"id":"1","time":"2015-01-22 15:16:22","senderid":"10001","receiverid":"10000","content":"是的 怎么了"}{"id":"0","time":"2015-01-22 15:15:22","senderid":"10000","receiverid":"10001","content":"你是女孩?"}
另外:
客户端代码就不放上来了,如果需有可以向我要,是unity3d的客户端,我邮箱:jia_ding@qq.com
GO简易聊天系统后台源码分享
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。