IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    golang实现的udpserver

    Sun发表于 2012-12-29 03:07:27
    love 0

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

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


沪ICP备19023445号-2号
友情链接