tcp并发服务器(c20w)

** 原创文章,请勿转载 **

并发服务器是一个老生常谈的话题,今天这里也写一个。

1. 目标

    同时在线连接20万(c20w)。  

    开发语言:重要的事情说三遍,GOLANG, GOLANG, GOLANG!

    那为什么是20W,不是30W或其它? 这个数字随意。   :)


2. 环境

    虚拟机(xenserver),    虚出6台机器(OS: CentOS 6.6 64bit) :
       . 一台服务器8核CPU,2G内存
       . 五台客户端2核CPU,2G内存
      

3.  改centos几个参数, 6台机器一样:
  
# ulimit -a   

      看 open files
      改成300000(大于20W就行) :
   #  ulimit -n 300000

   改端口范围
  
# echo 1025 65000 > /proc/sys/net/ipv4/ip_local_port_range

4. golang代码

    服务端: server.go

package main import ( "log" "net" "sync" "time" ) func main() { tcpAddr, err := net.ResolveTCPAddr("tcp", ":5000") if err != nil { log.Fatalln("net.ResolveTCPAddr fail", err) } listener, err := net.ListenTCP("tcp4", tcpAddr) if err != nil { log.Println("server failed to start...") return } defer listener.Close() go print() log.Println("begin listening, addr : ", tcpAddr) for { conn, err := listener.Accept() if err != nil { log.Println("socket accept failed. reason: ", err) continue } go handleConnection(conn) } } func print() { ticker := time.NewTicker(5 * time.Second) for { <-ticker.C log.Println(len(clients.Map)) } } var num = 0 var num2 = 0 var clients = Clients{Map: make(map[string]int, 0)} type Clients struct { sync.RWMutex Map map[string]int } func (c *Clients) Add(ip string) { c.Lock() c.Map[ip] = 1 c.Unlock() } func (c *Clients) Del(ip string) { c.Lock() delete(c.Map, ip) c.Unlock() } func handleConnection(conn net.Conn) { ip := conn.RemoteAddr().String() clients.Add(ip) buf := make([]byte, 64) for { _, err := conn.Read(buf) //log.Println("n=", n) if err != nil { //log.Println(err) conn.Close() clients.Del(ip) } } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zydyfp.html