公司要做防沉迷,需要游戏端及时向中心服通知在线时长
如果游戏逻辑中用curl请求我比较担心请求太慢,导致游戏逻辑本身处理速度变慢
所以最后考虑了一下决定使用udp来实现,首先他不需要那么多次的握手,速度会比tcp快一些
php客户端连上写完数据就close -> go收到数据包就转发给api中心服 -> 中心服处理完后回调游戏逻辑服
udp server 代码实现如下
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() } |