• 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]))
    	}
    }
    
  • 相关阅读:
    记住密码功能
    android 对软键盘显示和消失,EditView的焦点获取事件进行监听
    Intent可以传递的数据
    是否有网络
    关于6.0闪退问题
    关于Android Studio使用高德地图地位
    CentOS 配置防火墙操作实例(启、停、开、闭端口)CentOS Linux-FTP/对外开放端口(接口)TomCat相关
    docker学习读书笔记-一期-整理
    阿里云https免费证书配置-包教会
    Dizcuz站点部署-包教会
  • 原文地址:https://www.cnblogs.com/maomaomaoge/p/15072808.html
Copyright © 2020-2023  润新知