golang实现的udpserver防沉迷服务

公司要做防沉迷,需要游戏端及时向中心服通知在线时长

如果游戏逻辑中用curl请求我比较担心请求太慢,导致游戏逻辑本身处理速度变慢

所以最后考虑了一下决定使用udp来实现,首先他不需要那么多次的握手,速度会比tcp快一些

php客户端连上写完数据就close -> go收到数据包就转发给api中心服 -> 中心服处理完后回调游戏逻辑服

udp server 代码实现如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package main

import (
"fmt"
"net"
"net/http"
"net/url"
)

const (
API_SERVER = "http://x.x.x"
UDP_PORT = 1234
)

func main() {
socket, err := net.ListenUDP("udp4", &net.UDPAddr{
IP: net.IPv4(0, 0, 0, 0),
Port: UDP_PORT,
})

if err != nil {
fmt.Println("监听失败", err)
return
}

defer socket.Close()

for {
data := make([]byte, 256)
read, _, err := socket.ReadFromUDP(data)

if err != nil {
fmt.Println("读取数据失败", err)
continue
}

go forward(string(data[:read]))
}
}

func forward(data string) {
fmt.Printf("%s\n", data)

resp, err := http.PostForm(API_SERVER,
url.Values{"data": {data}})

if err != nil {
fmt.Println("请求API错误", err)
}

resp.Body.Close()
}