Ai
1 Star 0 Fork 0

wuzpdev/goworld

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
TCPServer.go 1.49 KB
一键复制 编辑 原始数据 按行查看 历史
seis 提交于 2018-05-31 22:12 +08:00 . clean up code
package netutil
import (
"net"
"time"
"github.com/xiaonanln/goworld/engine/gwioutil"
"github.com/xiaonanln/goworld/engine/gwlog"
)
const (
_RESTART_TCP_SERVER_INTERVAL = 3 * time.Second
_RESTART_UDP_SERVER_INTERVAL = 3 * time.Second
)
// TCPServerDelegate is the implementations that a TCP server should provide
type TCPServerDelegate interface {
ServeTCPConnection(net.Conn)
}
// ServeTCPForever serves on specified address as TCP server, for ever ...
func ServeTCPForever(listenAddr string, delegate TCPServerDelegate) {
for {
err := serveTCPForeverOnce(listenAddr, delegate)
gwlog.Errorf("server@%s failed with error: %v, will restart after %s", listenAddr, err, _RESTART_TCP_SERVER_INTERVAL)
time.Sleep(_RESTART_TCP_SERVER_INTERVAL)
}
}
func serveTCPForeverOnce(listenAddr string, delegate TCPServerDelegate) error {
defer func() {
if err := recover(); err != nil {
gwlog.TraceError("serveTCPImpl: paniced with error %s", err)
}
}()
return ServeTCP(listenAddr, delegate)
}
// ServeTCP serves on specified address as TCP server
func ServeTCP(listenAddr string, delegate TCPServerDelegate) error {
ln, err := net.Listen("tcp", listenAddr)
gwlog.Infof("Listening on TCP: %s ...", listenAddr)
if err != nil {
return err
}
defer ln.Close()
for {
conn, err := ln.Accept()
if err != nil {
if gwioutil.IsTimeoutError(err) {
continue
} else {
return err
}
}
gwlog.Infof("Connection from: %s", conn.RemoteAddr())
go delegate.ServeTCPConnection(conn)
}
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/wuzpdev/goworld.git
git@gitee.com:wuzpdev/goworld.git
wuzpdev
goworld
goworld
v0.1.6

搜索帮助