go语言游戏服务端开发(二)——网络通信
func main() {
l, err := net.Listen("tcp4", ":8080")
if err != nil {
return
}
for {
c, err := l.Accept()
if err != nil {
break
}
fmt.Println("accept connect: ", c.RemoteAddr())
}
}
客户端通过 Dial 连接服务端
func main() {
c, err := net.DialTimeout("tcp4", "127.0.0.1:8080", time.Second*time.Duration(8))
if err != nil {
return
}
fmt.Println("connect with: ", c.LocalAddr())
}
func Read(b []byte) (n int, err error)
func Write(b []byte) (n int, err error)
一般连接建立后,每个连接分别创建读和写两个 go rountine 进行读循环和写循环。
func (c *Conn) open() {
go c.readLoop()
go c.writeLoop()
}
虽然go底层是基于epoll边缘触发,但是并没有暴露接口通知什么时候有可读数据、可写等。为了避免轮询,一般在 go rountine 里阻塞的读、写。由于net.Conn只提供 Close() error,没办法只停止读,等待写结束再关闭连接。一般读做超时处理,超时后如果有关闭标记,则不再尝试读。
func SetReadDeadline(t time.Time) error
连接层需要通知使用者连接的状态,所以引入连接监听 interface
type ConnListener interface {
OnConnOpen(c net.Conn) error
OnConnClose(c net.Conn) error
OnConnError(c net.Conn, err error)
OnConnRead(c net.Conn) error
OnConnWrite(c net.Conn) error
}
使用者只需要实现自己的监听者监听连接的各个生命周期,由读写的 go rountine 驱动业务逻辑执行。
type P2pEnd struct {
EndType uint8
EndNo uint16
QueWritePacks chan *P2pPack
}
2、P2pPack定义包信息,包括源类型、编号,目标类型、编号,数据,这有利于包的路由。除此以外还有一些控制信息做更精细的处理。
type P2pPack struct {
SrcEnd uint8
SrcNo uint16
DstEnd uint8
DstNo uint16
Payload []byte
}
这里的包格式是通用包格式,Payload里包含业务包包头,根据业务需求定义自己的包格式。
3、P2pNet是一个端对端网络,维护该通信端所有的连接。作为一个通信端,它首先有自己的端类型、编号
type P2pNet struct {
endType uint8
endNo uint16
}
然后要记录其他端与连接的互相映射
type P2pNet struct {
endType uint8
endNo uint16
mapConn2End map[net.Conn]*P2pEnd
mapId2Conn map[uint32]net.Conn
}
所有连接接收到的包放到一个chan里,方便做分发处理
type P2pNet struct {
endType uint8
endNo uint16
mapConn2End map[net.Conn]*P2pEnd
mapId2Conn map[uint32]net.Conn
queReadPacks chan *ReadPackWrap
}
还有一些其他的控制信息。
func (r *P2pNet) Register(dstEnd uint8, dstNo uint16) error
除了注册协议,底层的心跳 ping、pong 也在P2P层处理,还有一些防御相关的处理,对业务层透明。
type P2pListener interface {
OnP2pConn(p2p *P2pNet, endType uint8, endNo uint16)
OnP2pCall(p2p *P2pNet, pack *P2pPack)
OnP2pClose(p2p *P2pNet, endType uint8, endNo uint16)
OnP2pError(p2p *P2pNet, err error)
}
三、关于防御
go语言游戏服务端开发(二)——网络通信的更多相关文章
- go语言游戏服务端开发(三)——服务机制
五邑隐侠,本名关健昌,12年游戏生涯. 本教程以Go语言为例. P2P网络为服务进程间.服务进程与客户端间通信提供了便利,在这个基础上可以搭建服务. 在服务层,通信包可以通过定义协议号来确定该包怎 ...
- go语言游戏服务端开发(一)——架构
五邑隐侠,本名关健昌,12年游戏生涯. 本教程以Go语言为例. 网络游戏程序分为客户端和服务端.客户端负责图形渲染.交互和一些简单校验处理,服务端负责业务逻辑处理.数据存储. 我们开发一个游戏de ...
- go语言游戏服务端开发(四)——RPC机制
五邑隐侠,本名关健昌,12年游戏生涯. 本教程以Go语言为例. RPC指远程方法调用,游戏里引入RPC目的是降低跨进程交互的复杂度. 游戏业务设计为多go routine,一个玩家一个go routi ...
- Swift3.0服务端开发(二) 静态文件添加、路由配置以及表单提交
今天博客中就来聊一下Perfect框架的静态文件的添加与访问,路由的配置以及表单的提交.虽然官网上有聊静态文件的访问的部分,但是在使用Perfect框架来访问静态文件时还是有些点需要注意的,这些关键点 ...
- 转: 基于netty+ protobuf +spring + hibernate + jgroups开发的游戏服务端
from: http://ybak.iteye.com/blog/1853335 基于netty+ protobuf +spring + hibernate + jgroups开发的游戏服务端 游戏服 ...
- Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)
本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...
- 为什么多数游戏服务端是用 C++ 来写
早年开发游戏必须用C++,这没得说,2000-2004年,java还没有nio,其他动态语言不抗重负,只能C/C++能开发出完整可用的游戏服务端.直到2005年,韩国的游戏很多都还是纯C++写服务端, ...
- 游戏服务端pomelo完整安装配置过程
版权声明:本文为博主原创文章,转载或又一次发表请先与我联系. https://blog.csdn.net/jonahzheng/article/details/27658985 游戏服务端pomelo ...
- 俯瞰 Java 服务端开发
原文首发于 github ,欢迎 star . Java 服务端开发是一个非常宽广的领域,要概括其全貌,即使是几本书也讲不完,该文将会提到许多的技术及工具,但不会深入去讲解,旨在以一个俯瞰的视角去探寻 ...
随机推荐
- Salesforce Integration 概览(六) UI Update Based on Data Changes(UI自动更新基于数据变更)
Salesforce用户界面必须由于Salesforce数据的更改而自动更新.这个场景其实在我所经历的项目中用到的不是特别多,因为客户可能直接点击刷新按钮就直接看到了最新的数据,而不是那种一直不刷新然 ...
- HCNA Routing&Switching之STP端口状态、计时器以及拓扑变化
前文我们了解了STP选举规则相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15131999.html:今天我们来聊一聊STP的端口状态.计时器.端口状 ...
- 深入理解jvm-2Edition-虚拟机类加载机制
1.概述-什么是类加载? 将Class文件从其他地方(外存.字节流甚至是网络流中)载入内存, 并对其中数据进行校验.转换解析和初始化,最终从其中提取出能够被虚拟机使用的Java类型. 用图纸造模子,该 ...
- CSS 奇思妙想 | 使用 resize 实现强大的图片拖拽切换预览功能
本文将介绍一个非常有意思的功能,使用纯 CSS 利用 resize 实现强大的图片切换预览功能.类似于这样: 思路 首先,要实现这样一个效果如果不要求可以拖拽,其实有非常多的办法. 将两张图片叠加在一 ...
- Grid布局如何设置动画效果
CS代码 新增 GridLengthAnimation继承自AnimationTimeline public class GridLengthAnimation : AnimationTimeline ...
- iOS开发之HTTP断点续传
前言 在APP中经常会遇到文件下载,鉴于用户体验和流量控制,就需要用到断点续传.本文主要对断点续传进行了多线程封装. 效果图 原理 HTTP实现断点续传是通过HTTP报文头部header里面设置的两个 ...
- ECC(Ellipse Curve Cryptography)+AES(Advanced Encryption Standard)前端通讯加密模拟(使用eccrypto-js)
前置知识 不了解对称加密与非对称加密的小伙伴可以看看下面的文章,想详细学习与区块链有关的加密算法可以戳这里 对称与非对称加密 https://blog.csdn.net/u013320868/arti ...
- ☕【Java技术指南】「编译器专题」重塑认识Java编译器的执行过程(常量优化机制)!
问题概括 静态常量可以再编译器确定字面量,但常量并不一定在编译期就确定了, 也可以在运行时确定,所以Java针对某些情况制定了常量优化机制. 常量优化机制 给一个变量赋值,如果等于号的右边是常量的表达 ...
- java小白困惑的那些事
刚接触java时,有些技术盲区,查了很多资料也得不到答案,面试时也得遮遮掩掩,这里就列举一些,当年踩过的那些坑 1.http -> https一个网站或接口,从http改到https是否需要额外 ...
- springboot配置ssl-pfx
application.yml server: port: 9443 ssl: key-store: classpath:4148017_qra.meeno.net.pfx key-store-typ ...