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]))
	}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM