从0到1制作一个go语言游戏服务器(二)web服务搭建

web服务搭建

web服务器搭建

为什么要搭建web服务器

我们这个项目的前后端交互用的是ws协议来进行通信 所以说我们需要处理http和websocket

至于我们为什么要用ws协议而补直接使用http呢?

因为http是一个无状态的连接 比如说我们再游戏中让我们的玩家移动n格 http协议可能就会发送n次连接请求 这样子效率就很差了

而ws协议的优势则在于建立连接之后可以直接双向通信 效率会高上不少

我们这里使用的ws协议是github上的 github.com/gorilla/websocket

构建web服务器

我们此时要创建一个web服务器的sever结构体

首先要想明白一个sever里面要有什么东西

  1. 首先肯定要有这个服务器的地址 包括ip + 端口 这样我们才能唯一的标识这个服
  2. 其次要有一个路由 每次客户端发送协议过来的时候我们会找到对应的路由上的处理器去执行

什么是路由 客户端发送的协议是什么格式的

路由就是根据url映射到一个路径处理器的机制

前端发送的协议是这样子的 {name :account.login}

其中这个 account.login 就是路由 account是路由的组 login是具体处理的函数名

一个路由可能有多个组 比如说账号组 游戏组等等

所以说路由的结构体如下

cpp 复制代码
type group struct {
	prefix     string
	handlerMap map[string]HandlerFunc
}

type Router struct {
	group []*group
}

这个时候我们开始继续写我们的websever服

server服的结构体是有一个地址(ip + port) 之后我们写一个new方法在main函数中new一个server服出来

cpp 复制代码
type Server struct {
	Addr   string
	router *Router
}

func NewServer(addr string) *Server {
	return &Server{Addr: addr}
}

接着我们开始写server服的启动函

cpp 复制代码
func (s *Server) Start() {
	http.HandleFunc("/", wsHandler)
	err := http.ListenAndServe(s.Addr, nil)
	if err != nil {
		log.Fatal(err)
	}
}

我们把接受到的所有消息都用 wsHandler 方法去处理 并且开始监听我们的地址 看看有没有协议发过来

下一步就是把http服务升级成 websocket服 这一步的代码是固定的

cpp 复制代码
// 首先要把http协议升级成websocket协议
var wsUpgrader = websocket.Upgrader{
	// 允许所有CORS跨域请求
	CheckOrigin: func(r *http.Request) bool {
		return true
	},
}

在wshandler方法中 我们首先获取到一个ws连接

之后尝试用这个连接去发送一些消息

cpp 复制代码
func wsHandler(w http.ResponseWriter, r *http.Request) {
	wsConn, err := wsUpgrader.Upgrade(w, r, nil)
	if err != nil {
		log.Fatal(err)
	}

	// 想一下 连接成功之后干什么?
	// 发消息是有格式的  所以说先要定义下消息的格式
	fmt.Println("开始发送消息")
	
	err = wsConn.WriteMessage(websocket.TextMessage, []byte("Hello, World!"))
	if err != nil {
		fmt.Println("发送消息失败", err)
	}
}

web服务器测试

我们上面的代码写完之后可以编写一个main函数再使用websocket在线测试工具进行测试

cpp 复制代码
package main

import (
	"STZB/config"
	"STZB/net"
)

func main() {
	host := config.File.MustValue("login_server", "host", "127.0.0.1")
	port := config.File.MustValue("login_server", "port", "8003")

	server := net.NewServer(host + ":" + port)
	server.Start()
}

接收到消息则说明我们的服务器搭建成功

相关推荐
秋天枫叶352 分钟前
【k8s集群Docker + cri-dockerd】服务器重启或关机后 apiserver/controller/scheduler 无法自动恢复
linux·运维·服务器·容器·kubernetes·bug
赋创小助手2 分钟前
超微2U高密度服务器AS-2126HS-TN评测(双AMD EPYC 9005 Turin)
运维·服务器·人工智能·深度学习·神经网络·自然语言处理·架构
松涛和鸣4 分钟前
59、 IMX6ULL按键驱动开发:轮询到中断的实现
linux·服务器·c语言·arm开发·数据库·驱动开发
幻云201010 分钟前
Python机器学习:筑基与实践
前端·人工智能·python
web小白成长日记12 分钟前
Vue3中如何优雅实现支持多绑定变量和修饰符的双向绑定组件?姜姜好
前端·javascript·vue.js
LcVong14 分钟前
C# 基于MemoryMappedFile实现进程间通信(服务端+客户端完整范例)
linux·服务器·c#
晴天飛 雪18 分钟前
Spring Boot 接口耗时统计
前端·windows·spring boot
0思必得026 分钟前
[Web自动化] Selenium模拟用户的常见操作
前端·python·selenium·自动化
狂放不羁霸27 分钟前
Tailscale | 校园网外笔记本借助校园网内主机连接实验室服务器
运维·服务器·vscode
海域云-罗鹏31 分钟前
马来西亚工厂与内地数据中心SD-WAN组网全指南
服务器·网络