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

如果游戏逻辑中用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()
}