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