Go的tcp长连接

Go的tcp长连接

为订阅打基础

server

package main

import (
	"fmt"
	"log"
	"net"
	"strconv"
	"time"
)

type Manger struct {
	Kv map[int]*net.TCPConn
	fl int
}

func (m *Manger)run()  {
	var dataNow int

	go func() {
		for {
			dataNow++
			time.Sleep(time.Second * 2)
		}
	}()

	for {
		for k, v := range m.Kv {
			if dataNow % 10 != k {
				fmt.Println("此时结果: ", dataNow % 10)
				continue
			}

			_, err := v.Write([]byte(strconv.Itoa(dataNow)))
			if err != nil {
				log.Println(err)
			}

			time.Sleep(time.Millisecond * 300)
		}
	}
}

func main() {
	m := &Manger{Kv:make(map[int]*net.TCPConn)}

	go m.run()

	localAddress, _ := net.ResolveTCPAddr("tcp4", "0.0.0.0:3333") //定义一个本机IP和端口。
	tcpListener, err := net.ListenTCP("tcp", localAddress)       //在刚定义好的地址上进监听请求。
	if err != nil {
		fmt.Println("监听出错:", err)
		return
	}
	defer func() { //担心return之前忘记关闭连接,因此在defer中先约定好关它。
		tcpListener.Close()
	}()


	fmt.Println("ok")
	for {
		conn, err := tcpListener.AcceptTCP() //接受连接。
		if err != nil {
			fmt.Println("接受连接失败:")
			return
		}
		fmt.Println("收到链接")
		err = conn.SetKeepAlive(true)
		if err != nil {
			log.Println(err)
		}

		m.Kv[m.fl] = conn
		fmt.Println("收到订阅: ", m.fl)
		m.fl++
	}
}

func re(conn *net.TCPConn)  {
	for {
		data := make([]byte, 1024 * 1024 * 10)
		read, err := conn.Read(data)
		if err != nil {
			//log.Println()
		}

		fmt.Println(string(data[:read]))
	}

}

func w(conn *net.TCPConn)  {
	var i int
	i=1
	for {
		_, err := conn.Write([]byte(strconv.Itoa(i)))
		if err != nil {
			log.Println(err)
		}
		i++

		time.Sleep(time.Second * time.Duration(i))
	}
}

client

package main

import (
	"fmt"
	"log"
	"net"
)

func main() {
	localAddress, _ := net.ResolveTCPAddr("tcp4", "127.0.0.1:3333") //定义一个本机IP和端口。
	dial, err := net.DialTCP("tcp", nil,localAddress)
	if err != nil {
		log.Println(err)
		return
	}
	dial.SetKeepAlive(true)

	for {
		data := make([]byte, 1024)
		read, err := dial.Read(data)
		if err != nil {
			log.Println(err)
			continue
		}

		fmt.Println(string(data[:read]))
	}
}
上一篇:go-操作mysql数据库go-操作mysql数据库


下一篇:慕课go高级工程师实战营