主要是利用 系统监听Interrupt 信号,并且提前关闭服务器 监听,并且等待先前连接处理完毕后在退出程序。
Server 代码:
package main
import (
"net"
"os"
"os/signal"
"strings"
"sync"
"time"
. "github.com/soekchl/myUtils"
)
var (
wg sync.WaitGroup = sync.WaitGroup{} // 等待各个socket连接处理
)
func main() {
stop_chan := make(chan os.Signal) // 接收系统中断信号
signal.Notify(stop_chan, os.Interrupt)
listen, err := net.Listen("tcp", ":8080")
if err != nil {
Error(err)
return
}
go func() {
<-stop_chan
Warn("Get Stop Command. Now Stoping...")
if err = listen.Close(); err != nil {
Error(err)
}
}()
Notice("Start listen :8080 ... ")
for {
conn, err := listen.Accept()
if err != nil {
if strings.Contains(err.Error(), "use of closed network connection") {
break
}
Error(err)
continue
}
Info("Accept ", conn.RemoteAddr())
wg.Add(1)
go Handler(conn)
}
wg.Wait() // 等待是否有未处理完socket处理
}
func Handler(conn net.Conn) {
defer wg.Done()
defer conn.Close()
time.Sleep(5 * time.Second)
conn.Write([]byte("Hello!"))
Info("Send hello")
}
package main
import (
"net"
. "github.com/soekchl/myUtils"
)
func main() {
conn, err := net.Dial("tcp", ":8080")
if err != nil {
Error(err)
return
}
defer conn.Close()
var b []byte = make([]byte, 1024)
n, err := conn.Read(b)
if err != nil {
Error(err)
return
}
Notice(string(b[:n]))
}
中断 Ctrl+C
服务器没有连接的时候 中断立马退出系统
有连接话 先关闭监听 等所有连接处理完毕后在退出系统