go로 개발을 하다가 TCP 통신을 해야 했는데 서버와 연결이 끊어지면 다시 시도를 하는 기능이 필요했다.
go가 아직은 익숙치않아 어떻게 구현해야 하는지 난감했지만 열심히 구글링해서 찾았다.
채널을 통해서 하는 방법도 있고 다른 방법들도 있었지만 다음과 같이 하는 것이 가장 쉬웠다.
import (
"encoding/json"
"io"
"log"
"net"
"time"
)
type Config struct {
Address string `json:"address" form:"address"`
}
var (
conn net.Conn
)
func Driver(config Config) {
var err error
for {
conn, err = net.Dial("tcp", config.Address)
if conn == nil || err != nil {
log.Println("Trying reset the connection...:", config.Address, err.Error())
time.Sleep(time.Second * 1)
} else {
data := make([]byte, 4096)
for {
n, err := conn.Read(data)
if err != nil {
log.Println(err)
if io.EOF == err {
conn.Close()
break
}
}
if n > 0 {
// TODO
}
}
}
}
}