公司要做防沉迷,需要游戏端及时向中心服通知在线时长
如果游戏逻辑中用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()
}
|