环境:VSCode 语言:Go
总起:
当时在和Java服务器对接时,因为注册登录等操作不要求实时性,所以使用了http的方式(当然除了实时性以外,http无法做到全双工,当时Web大神跟我说他们以前做的时候使用websocket解决服务器向客户端发消息的问题)。
然后学了Photon的服务器,研究了一段时间,实现了登录和注册的功能。后来想用Golang,一直想着Java对应JavaWeb、C#对应Photon(或.net),那Golang对应的是什么?
今天上面的问题有了一定的解答,Golang它里面自身带的类库net、json、log就能完成服务器的功能,甚至提供了JavaWeb上类似js的模版功能,开发起来感觉非常轻量,环境分分钟就能弄好。
这篇文章首先介绍一下VSCode下Golang的搭建,然后介绍一个简单的登录注册服务器。
VSCode下Golang环境搭建:
学到现在Golang环境换了3个,现在用上了VSCode,不过用下来个人还是比较推荐VSCode的,闲话不多说,我们来看看怎么搭建Golang环境。
如果基本的Golang语言基础环境还没有搭建的同学,请看这边。
首先VSCode在下载插件时需要git命令,请到该地址下载安装:http://gitforwindows.org/。
然后是VSCode的下载:https://code.visualstudio.com/download。
都安装完之后打开VSCode,点击右侧的扩展按钮,然后搜索Go:
我这边已经安装完了,没有安装的情况下应该是有个绿色的安装按钮。点击安装完成之后,ide自动提醒安装插件,点安装就行。
不过我有好几个插件没安装成功,照样还是能成功运行,所以应该少一些插件也无所谓吧。
这样就搭建完了,很方便吧。
然后想要运行某个go文件,其实就类似于在cmd中运行了。首先将文件拖入编辑器内,右键右侧的文件,点击在终端中打开就OK:
退出终端使用exit:
然后运行就和cmd中一样:
Golang的一个简单游戏服务器:
让我们来看看我写的简单服务器:
package main
import(
"net/http"
"log"
"encoding/json"
)
// 用户
type Account struct{
Name string
Password string
}
// 结果,注意首字母大写,不然json不能解析
type Result struct{
OK bool
}
func main(){
// 当前注册的所有用户
accounts := make([]*Account, 0, 6)
// register下的处理
http.HandleFunc("/register", func(w http.ResponseWriter, r *http.Request){
// 获取name和password
name := r.FormValue("Name")
pwd := r.FormValue("Password")
// 判断内存内是否已经保存了该用户
if HasAccountByName(accounts, name){
ReturnResult(false, w)
}else{
// 没有该用户则存入
accounts = append(accounts, &Account{
Name : name,
Password : pwd,
})
ReturnResult(true, w)
}
})
// login下的处理
http.HandleFunc("/login", func(w http.ResponseWriter, r *http.Request){
// 获取name和password
name := r.FormValue("Name")
pwd := r.FormValue("Password")
// 判断用户名密码是否匹配
if IsAccountPwdMatch(accounts, name, pwd){
ReturnResult(true, w)
}else{
ReturnResult(false, w)
}
})
// 开启服务器
log.Println("Server start!")
log.Fatal(http.ListenAndServe(":4000", nil))
}
// 给客户端返回结果
func ReturnResult(result bool, w http.ResponseWriter){
// 创建结果类
re := &Result{
OK : result,
}
// 使用json构造字符串
j, _ := json.Marshal(re)
// 发送给客户端
w.Write([]byte(j))
}
// 根据名称判断是否有该用户
func HasAccountByName(as []*Account, name string) bool {
for _, v := range as{
if v.Name == name {
return true
}
}
return false;
}
// 根据名称和密码判断该用户是否匹配
func IsAccountPwdMatch(as []*Account, name string, password string) bool {
for _, v := range as{
if v.Name == name && v.Password == password {
return true
}
}
return false;
}
好的,让我们在Unity中试试效果:
这样就行了,Golang上的开发是不是很方便呢?